精华内容
下载资源
问答
  • 微信公众号模版消息

    2016-02-22 14:12:53
    本代码真是可用,只需要修改最后面的几个参数设置称自己的。 微信公众账号需要想指定用户推送消息时,就需要用到模版消息接口!
  • springboot实现微信公众号模版消息推送,用的是构架:springboot+redis,详细教程:https://blog.csdn.net/chenhongming888/article/details/95173079
  • 公众号模板消息群发,不用写一行代码,即可给所有粉丝群发模板消息,支持按照粉丝标签分组群发,支持将公众号全部粉丝同步到本地进行群发。默认群发速度为6000条/分钟,可根据电脑性能上调至10万条/分钟。 需要认证...
  • 注意,如果模板消息发信息时有时无,不稳定,可能你的access_token令牌更新缓存不及时,过期了.可以根据日志文件查看.建议300秒更新一下.否则会很烦. 模板id需要自己去公众号中设置行业后得到. <?php //使用方法....
  • Java 实现微信公众号模板消息推送,demo
  • java二次开发接微信公众号接口,实现根据用户授权,获取用户code,再获取openid,然后向其推送模版消息
  • 以订单推送为例,主要为大家详细介绍了java实现微信公众号发送模版消息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 小程序关联公众号使用公众号模板消息做消息提示   最近在开发小程序中遇到一个需求:小程序的用户关注指定公众号,则小程序里需要通知用户的提醒消息可以做在公众号中。 首先我先把实现的整套流程先述说一遍,...

    小程序关联公众号使用公众号模板消息做消息提示

     

    最近在开发小程序中遇到一个需求:小程序的用户关注指定公众号,则小程序里需要通知用户的提醒消息可以做在公众号中。

    首先我先把实现的整套流程先述说一遍,免得码友们走了弯路。

    (我写的这个流程是非常正确的。但是代码是不能直接用的只能进行参照。但帖上去的代码都是正确的。我是以自己的知识并且参照该链接https://www.jianshu.com/p/9fc64dd53831实现出来的。如果看不懂我写的可以观看该链接比较容易理解。本人文笔不太好,非喜勿喷。)

    准备工作

    1.首先要创建一个微信开发平台 ,进行开发者资质认证(费用:300rmb)把小程序和公众号绑定在该微信开发平台下并且小程序和公众号要进行微信认证(300rmb+300rmb)。

    注:这一步是一定要做的,为什么要做?我来为大家解说一下。像我们开发小程序或者公众号的都知道,每个用户在不同的程序或者公众号中都会有一个唯一标识openid和unionid他们的值随着不同的程序而改变。既然我们要把小程序和公众号关联起来让公众号锁定小程序中的用户并对他们进行消息推送。那么小程序和公众号他们的用户信息必定会有一个共同的值来确定用户的唯一。那就是用户的unionid。在微信开发平台下面绑定了小程序和公众号那么他们的unionid就会一致,通过unionid就可以实现小程序与用户端的用户共享了。

    .

    2.用小程序的appid和appsecret获取小程序的access_token获取code来进行微信授权获取到微信信息(储存到数据库)。但是因为用户微信的appid和unionid属于保密的信息所以还要需要一个解压接口来得到。下面我会贴上代码。

    3.用公众号的appid和appsecret获取公众号的access_token来获取已关注的用户openid,再根据用户的openid获取用户的所有信息包括unionid(存到数据库)

    4.接下来就是通过小程序用户的unionid去找到对应的公众号的unionid获取公众号下的openid,通过公众号api的模板消息推送接口就可实现该功能了。

    代码实现(因本人目前只专注于后端开发,以下都是后端代码。也是后端开发需要实现该功能所做的事情)

    第一步:创建微信开发平台并绑定小程序和公众号(这一步操作特别简单就不详细说了)

    第二步:通过前端页面穿入的code进行授权获取用户信息

    /**
     * Created by zhouf on 2018/6/14.
     * 通过微信code获得微信用户的openid
     */
    public class GetWxOpenidByWxCode {
       
        @Override
        public void mainProcess(Context cx) throws Exception {
      
            String wx_appid = "小程序的appid";
            String wx_secret = "小程序的secret";
            String wx_code = "前端传过来的code";
           
            //通过三个以上三个参数发送请求
    
            String url = "https://api.weixin.qq.com/sns/jscode2session appid="+wx_appid+"&secret="+app_secret+"&js_code="+wx_code+"&grant_type=authorization_code";
             //通过封装好的get请求获取到用户的sessionKey和用户在小程序的openid这样
             Map<String,Object> result = HttpUtils.doGetHttps(url);
    
             LinkedHashMap<String,Object> linkedHashMap = new LinkedHashMap<>();
             linkedHashMap.put("session_key",result.get("session_key"));
             linkedHashMap.put("openid",result.get("openid"));           
    
        }
    }
    
    /**
     * Created by zf on 2018/12/11.
     * 通过解密获取微信小程序的unionid  api开放数据校验与解密
     */
    public class GetWxAppletInfoByDecode {
        public void mainProcess(Context cx) throws Exception {
            String openid = "";
            String session_key = "";
            String encryptedData = "";
            String iv = "";
    
            String return_str = decryptionUserInfo(encryptedData,session_key,iv);
    
            int i = return_str.indexOf("unionId");
            int l = return_str.indexOf("watermark");
    
            System.out.println(i+"-------"+l);
            System.out.println(return_str.substring(i, l));
    
            String unionid = return_str.substring(i + 10, l - 3);
        }
    
        /**
         * 小程序解密用户数据
         *
         * @param encryptedData
         * @param sessionKey
         * @param iv
         * @return
         */
        public static String decryptionUserInfo(String encryptedData, String sessionKey, String iv) {
            String result = "";
    
            // 被加密的数据
            byte[] dataByte = Base64.decode(encryptedData);
            // 加密秘钥
            byte[] keyByte = Base64.decode(sessionKey);
            // 偏移量
            byte[] ivByte = Base64.decode(iv);
    
            try {
    
                // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要
                int base = 16;
                if (keyByte.length % base != 0) {
                    int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
                    byte[] temp = new byte[groups * base];
                    fill(temp, (byte) 0);
                    System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
                    keyByte = temp;
                }
                // 初始化
                Security.addProvider(new BouncyCastleProvider());
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
                SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
                AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
                parameters.init(new IvParameterSpec(ivByte));
                cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
                byte[] resultByte = cipher.doFinal(dataByte);
                if (null != resultByte && resultByte.length > 0) {
                    result = new String(resultByte, "UTF-8");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
    
    }

    第三步:获取公众号的用户信息

    /**
     * 获取已关注服务号的所有用户信息
     * bug:这里只能取到一万个用户(解决办法:微信公众号官网文档)
     * Created by zf on 2018/12/13.
     */
    public class GetUserInfoByGZH
    {
        private  static String send_url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=";
    
    
        static String access_token = "";
    
        public static void main(String[] str) throws Exception{
            List<Map<String,Object>> list = getUserInfoByOpenid(getUsersOpenid());
            Context cx = new Context(null,null,null,null);
            GZHUser gzhUser = new GZHUser(cx);
            gzhUser.insertIntoUserInfo(list);
        }
    
        //获取关注该公众号的openid
        public static Map<String,Object> getUsersOpenid() throws Exception{
            //获取小程序的access_token并把它当做参数拼接到模板消息发送接口当中。(access_token一般都是通过get方式拼接传入微信接口)
            Map<String,Object> access_token_map = WxAppletTemplateMessage2.GetWxAccessToken2();
            access_token = (String) access_token_map.get("access_token");
            String url = send_url+access_token;
            //通过工具类把请求接口和参数进行请求并返回调用结果
            Map<String,Object> result = HttpUtils.doGetHttps(url); //{"errcode":0,"errmsg":"ok","msgid":68036453858394114}
            return result;
        }
    
        //同伙openid获取用户信息
        public static List<Map<String,Object>> getUserInfoByOpenid(Map<String,Object> map) throws Exception{
            List<Map<String,Object>> list  = new ArrayList<>();
    
            Map<String,Object> map2 = (Map<String,Object>)map.get("data");
            List<String> list2 = (List<String>)map2.get("openid");
    
            for(String s:list2){
                String send_url2 = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="+access_token+"&openid="+s+"&lang=zh_CN";
                String ssss = "";
                //通过工具类把请求接口和参数进行请求并返回调用结果
                Map<String,Object> result = HttpUtils.doGetHttps(send_url2); //{"errcode":0,"errmsg":"ok","msgid":68036453858394114}
                Context cx = new Context(null,null,null,null);
                GZHUser gzhUser = new GZHUser(cx);
                Boolean bool = gzhUser.userIsEmpty((String)result.get("unionid"));
                if(bool == true){
                    list.add(result);
                }
            }
            return list;
        }
    
    
    
    
    
    }
    

    第四步:通过公众号api的模板消息推送接口就可实现该功能了。

    //开始发送模板消息
        public static  Map<String,Object> sendAppletTemplateMessage(Map<String,Object> request_param) throws Exception {
            //获取小程序的access_token并把它当做参数拼接到模板消息发送接口当中。(access_token一般都是通过get方式拼接传入微信接口)
            Map<String,Object> access_token_map = GetWxAccessToken2();
            String access_token = (String) access_token_map.get("access_token");
            String url = send_url+access_token;
    
            //通过工具类把请求接口和参数进行请求并返回调用结果
            Map<String,Object> result = HttpUtils.doPostHttps(url, request_param); //{"errcode":0,"errmsg":"ok","msgid":68036453858394114}
            return  result;
    
        }
    
        //用户报名活动成功将活动基本信息告知给用户
        public static Map<String,Object> joinActivitySuccessMessage(String openid,int activity_id) throws  Exception{
    
            Context cx = new Context(null,null,null,null);
            ActivityDao activityDao = new ActivityDao(cx);
            Map<String,Object> avtMap =  activityDao.get(activity_id);
    
            //请求数据
            Map<String,Object> request_data = new HashMap<>();
            //消息模板id
            String template_id = Constants.joinActivitySuccess_Template_id;
            //公众号模板消息所要跳转的url
            String url = "https://studentgt.xmcedu.cn";
            //用户的openid
            String user_openid = openid;
    
            String activity_introduce = (String)avtMap.get("activity_introduce");
    
            //消息模板参数
    
    
            Timestamp ts = (Timestamp)avtMap.get("activity_begin_time");
            String tsStr = "";
            DateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            try {
                tsStr = sdf.format(ts);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
    
    
            String first = "你好,你已报名成功";
            String keyword1 = (String)avtMap.get("activity_name");   //活动主题
            String keyword2 = tsStr;   //活动时间
            String keyword3 = activity_introduce.substring(0,10)+"......."; //活动地点
            String remark = "点击此消息,跳转链接观看详情。";
    
            request_data.put("touser", user_openid);
            request_data.put("template_id",template_id);
            request_data.put("url",url);
    
            //data参数
            Map<String,Object> data = new HashMap<>();
            templateParam(data,"first",first,"#173177");
            templateParam(data, "keyword1", keyword1, "#173177");
            templateParam(data, "keyword2", keyword2, "#173177");
            templateParam(data, "keyword3", keyword3, "#173177");
            templateParam(data, "remark", remark, "#173177");
    
            //miniprogram参数:需要点击通知跳转至小程序才需要该参数,该参数有时点击通知则优先跳转到小程序,该参数不存在是则默认跳转到mp_template_msg参数中的url中。
    
            Map<String,Object> miniprogram = new HashMap<>();
            //这里的appid是需要跳转的小程序的appid
            miniprogram.put("appid", Constants.wx_appid);
            miniprogram.put("pagepath","pages/home/active/active");
    
            request_data.put("miniprogram",miniprogram);
    
            request_data.put("data",data);
    
            //返回结果信息
            Map<String,Object> send_return = sendAppletTemplateMessage(request_data);
            System.out.println("<wx message>"+send_return.toString());
    
            return request_data;
        }
    
    
        //新作业通知
        public static Map<String,Object> newJobMessageInform(String openid,int notice_id) throws  Exception{
    
            Context cx = new Context(null,null,null,null);
            NoticeManagerDao noticeManagerDao = new NoticeManagerDao(cx);
            Map<String,Object> noticeMap =  noticeManagerDao.get(notice_id);
    
            //请求数据
            Map<String,Object> request_data = new HashMap<>();
            //消息模板id
            String template_id = Constants.new_job_Template_id;
            //公众号模板消息所要跳转的url
            String url = "https://studentgt.xmcedu.cn";
            //用户的openid
            String user_openid = openid;
    
            String content = noticeMap.get("content")+"...........";
    
            User userDao = new User(cx);
            Map<String,Object> cMap = userDao.get((int)noticeMap.get("promulgator_id"));
            String user_duty = (String)cMap.get("user_duty");
    
            //消息模板参数
    
    
            Timestamp ts = (Timestamp)noticeMap.get("up_date");
            String tsStr = "";
            DateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            try {
                tsStr = sdf.format(ts);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
    
    
            String first = "您好,您有新的作业指令下达";
            String keyword1 = (String)cMap.get("user_duty");   //科目
            String keyword2 = tsStr;   //日期
    
            String keyword3 = content.substring(0,10)+"......."; //内容
            String remark = "您点击此消息,跳转链接观看详情。";
    
            request_data.put("touser", user_openid);
            request_data.put("template_id",template_id);
            request_data.put("url",url);
    
            //data参数
            Map<String,Object> data = new HashMap<>();
            templateParam(data,"first",first,"#173177");
            templateParam(data, "keyword1", keyword1, "#173177");
            templateParam(data, "keyword2", keyword2, "#173177");
            templateParam(data, "keyword3", keyword3, "#173177");
            templateParam(data, "remark", remark, "#173177");
    
            //miniprogram参数:需要点击通知跳转至小程序才需要该参数,该参数有时点击通知则优先跳转到小程序,该参数不存在是则默认跳转到mp_template_msg参数中的url中。
    
            Map<String,Object> miniprogram = new HashMap<>();
            //这里的appid是需要跳转的小程序的appid
            miniprogram.put("appid", Constants.wx_appid);
            miniprogram.put("pagepath","pages/home/homeWork/homeWork");
    
            request_data.put("miniprogram",miniprogram);
    
            request_data.put("data",data);
    
            //返回结果信息
            Map<String,Object> send_return = sendAppletTemplateMessage(request_data);
            System.out.println("<wx message>"+send_return.toString());
    
            return request_data;
        }
    
    
    
    
        public static Map<String,Object> templateParam(Map<String, Object> params, String name, String value, String color){
            Map<String,Object> param = new HashMap<>();
            param.put("value",value);
            param.put("color",color);
            params.put(name, param);
            return params;
        }
    
    
        /**
         * 获取access_token
         * @return
         * @throws Exception
         */
        public static Map<String,Object> GetWxAccessToken2() throws Exception {
            String access_token="";
    
            XmcCacheUtil2 xmcCacheUtil = XmcCacheUtil2.getInstance();
            Object access_token_obj = xmcCacheUtil.get("WxDataCache", "access_token_obj");
    
            Map<String,Object> obj = new HashMap<>();
            if(access_token_obj!=null){
                obj = (Map<String, Object>) access_token_obj;
                Long expires_time = Long.valueOf(obj.get("expires_time").toString());
                Long now_time = System.currentTimeMillis();
                if(expires_time-now_time>300){
                    access_token = obj.get("access_token").toString();
                }
            }
    
            //查询缓存
            if(access_token.equals("")){
                String url = "https://api.weixin.qq.com/cgi-bin/token";
                String grant_type="client_credential";
    
                Map<String,String> map = new HashMap<>();
                map.put("grant_type",grant_type);
                map.put("appid", Constants.wx_appid_gzh);
                map.put("secret", Constants.wx_secret_gzh);
    
                //Map<String,Object> rs = HttpUtils.doGet(url, map, "utf-8");
                url = url+"?appid="+Constants.wx_appid_gzh+"&secret="+Constants.wx_secret_gzh+"&grant_type="+grant_type;
                Map<String,Object> rs = HttpUtils.doGetHttps(url);
                access_token = rs.get("access_token").toString();
                Long expires_time = System.currentTimeMillis()+Integer.valueOf(rs.get("expires_in").toString())*1000;
    
                rs.put("expires_time",expires_time);
                access_token_obj = rs;
                xmcCacheUtil.put("WxDataCache", "access_token_obj", access_token_obj);
                obj = rs;
            }
    
            return obj;
        }

     

    展开全文
  • 小程序订阅消息 1,一次性订阅...而且这些行业里的模板少之又少 ,都需要自己去申请 2,微信公众号模板消息 只有关注了公众号才能收到发过来的消息,消息也是在公众号里面,可以无限制发送,也可以跳转到小程序页面

    小程序订阅消息

    1,一次性订阅消息

    • 某个按钮(并且只能是用户自己就手动点击的)操作调起来这个允许授权弹窗,允许通知之后也只能发送一次消息。即便点上【总是保持一上选择,不再询问】也只是在下次点击同一个按钮时默认允许发送消息,不是可以一直发送消息的intro
    • 如下图所示,点击几次按钮及可以发送几次消息(图来源:https://developers.weixin.qq.com/community/develop/article/doc/0008802e8381e0eeabb92c9975b013

    • 使用场景可用于每次通知前,必定会有一次用户手动触发事件的,类似单车开锁,商品购买,车票购买

    2,长期订阅消息

    • 长期订阅消息是可以点击一次然后发送多次消息的,但是目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育这些行业,而且这些行业里的模板少之又少

    ,都需要自己去申请

    2,微信公众号模板消息

    • 只有关注了公众号才能收到发过来的消息,消息也是在公众号里面,可以无限制发送,也可以跳转到小程序页面

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。 如图: 如上图所示,在我们的生活中,无论是微商城消费,还是日常生活消费,都可能...

    模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。

    如图:

    如上图所示,在我们的生活中,无论是微商城消费,还是日常生活消费,都可能收到这种提示,比如订单通知,快递状态通知,银行卡支付通知,都属于业务通知,很多公众号也都实现了这种功能,当触发了某种行为或状态改变,就会发送这么一个消息给你,因为这种消息都是按照一定的的格式来编辑,所以也叫模板消息。
     

    发送模板消息

    1.公众号这边要提示一下,查看你的公众号是否是服务号,登录微信公众平台,找到功能,选择模板消息

    然后选择相应的行业,提交审核,审核通过后保存之后,选择合适的模板,微信会给该模板分配一个ID,待我们要发送模板消息的时候就需要用到这个ID了。

    2.发送给用户

    打开文档”发送模板消息”
    获得发送模板的接口地址:https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

    使用POST的方式来发送,并且把模板消息的数据以json数据的格式传递到该接口。

    必传的只有 touser接收者,template_id模板id,data模板数据这3个参数,其他的可以不传,如果传了就会有相应的跳转,比如跳转至指定url,或者跳转至小程序。

    json数据

    $template=array(
                'touser'=>$openid, //用户openid
                'template_id'=>$tenpalate_id, //在公众号下配置的模板id
                'url'=>"https://www.szyunshutong.com/api/official/memberRechargeRecords.html", //点击模板消息会跳转的链接
                'topcolor'=>"#7B68EE",
                'data'=>array(
                    'first'=>array('value'=>urlencode("您好,您已成功进行充值。"),'color'=>"#000000"),
                    'accountType'=>array('value'=>urlencode('数量'),'color'=>'#000000'), //keyword需要与配置的模板消息对应
                    'account'=>array('value'=>urlencode($coin_num),'color'=>'#000000'),
                    'amount'=>array('value'=>urlencode($money),'color'=>'#000000'),
                    'result'=>array('value'=>urlencode('充值成功'),'color'=>'#000000'),
                    'remark' =>array('value'=>urlencode('如有疑问,请致电联系我们'),'color'=>'#000000'), )
            );
            $json_template=json_encode($template);

     

    注意点:检查获取我们调用接口的凭据AccessToken(日限额2000次,时效2小时),我当时第一次就是败在这AccessToken

    上,源码中最后一个方法是重新获取AccessToken的,参考!
    

    3.直接上源码

       /**
         * 发送模板消息
         */
        public function send_notice($openid,$money,$coin_num){
            //获取access_token
            if ($_COOKIE['access_token']){
                $access_token2=$_COOKIE['access_token'];
            }else{
                $token=$this->get_access_token_mp();
            }
            //模板消息
    
            $tenpalate_id="-pFrstxxxlTGcmIJTa8twuZFozHnqCmkVO3Lae5uR34";
            //模板消息
            $template=array(
                'touser'=>$openid, //用户openid
                'template_id'=>$tenpalate_id, //在公众号下配置的模板id
                'url'=>"https://www.szyunshutong.com/api/official/memberRechargeRecords.html", //点击模板消息会跳转的链接
                'topcolor'=>"#7B68EE",
                'data'=>array(
                    'first'=>array('value'=>urlencode("您好,您已成功进行路票充值。"),'color'=>"#000000"),
                    'accountType'=>array('value'=>urlencode('路票数量'),'color'=>'#000000'), //keyword需要与配置的模板消息对应
                    'account'=>array('value'=>urlencode($coin_num."张"),'color'=>'#000000'),
                    'amount'=>array('value'=>urlencode($money."元"),'color'=>'#000000'),
                    'result'=>array('value'=>urlencode('充值成功'),'color'=>'#000000'),
                    'remark' =>array('value'=>urlencode('如有疑问,请致电联系我们'),'color'=>'#000000'), )
            );
            $json_template=json_encode($template);
            $url="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$token;
            $res=$this->curl_post($url,urldecode($json_template));
    //        print_r($res);die;
            if ($res['errcode']==0){
                return 1;
            }else{
                return 0;
            }
        }
        /**
         * 将模板消息json格式化(根据情况灵活组合,我这里直接把模板消息放到了请求发送的接口)
         */
        public function json_tempalte(){
            $tenpalate_id="-pFrstxxxlTGcmIJTa8twuZFozHnqCmkVO3Lae5uR34";
            //模板消息
            $template=array(
                'touser'=>'.$openid.', //用户openid
                'template_id'=>".$tenpalate_id.", //在公众号下配置的模板id
                'url'=>".$uel.", //点击模板消息会跳转的链接
                'topcolor'=>"#7B68EE",
                'data'=>array(
                    'first'=>array('value'=>urlencode("您的活动已通过"),'color'=>"#FF0000"),
                    'accountType'=>array('value'=>urlencode('测试文章标题'),'color'=>'#FF0000'), //keyword需要与配置的模板消息对应
                    'account'=>array('value'=>urlencode(date("Y-m-d H:i:s")),'color'=>'#FF0000'),
                    'amount'=>array('value'=>urlencode('测试发布人'),'color'=>'#FF0000'),
                    'result'=>array('value'=>urlencode('充值成功'),'color'=>'#FF0000'),
                    'remark' =>array('value'=>urlencode('备注:这是测试'),'color'=>'#FF0000'), )
            );
            $json_template=json_encode($template);
            return $json_template;
        }
        /**
         * @param $url
         * @param array $data
         * @return mixed
         * curl请求
         */
        function curl_post($url , $data=array()){
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            // POST数据
            curl_setopt($ch, CURLOPT_POST, 1);
            // 把post的变量加上
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            $output = curl_exec($ch);
            curl_close($ch);
            return $output;
        }
        //获取微信公众平台token
        public function get_access_token_mp()
        {
            $token = session("access_token_mp");
            if($token){
                return $token;
            }
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appId}&secret={$this->appSecret}";
            $res = $this->curl_post($url);
            $td = json_decode($res, true);
            if($td['access_token']){
                session("access_token_mp", $td['access_token'], $td['expires_in'] - 120);
                return $td['access_token'];
            }else{
                return false;
            }
        }

    4.运行时把json数据传入到方法中,我们可以看到打印出来的返回的结果。

    {"errcode":0,"errmsg":"ok","msgid":232391810540961792}
    

    errcode为0代表已经发送成功。如果errcode是其他值,请打开文档的错误返回码页面中查找错误信息。

    附模板消息接口文档地址:https://mp.weixin.qq.com/advanced/tmplmsg?action=faq&token=299852868&lang=zh_CN

     

    有疑问的,可以私信我!!!

    展开全文
  • 小程序openid推送公众号模板消息

    千次阅读 2020-08-12 21:05:19
    可以通过小程序获取的openid 推送公众号模板消息消息 或者是公众号openid 推送,公众号模板消息 推送前提: 1.需要用户关注微信公众号,不关注推送时会报错 2.需要公众号和小程序有绑定的管理关系 参考小程序...

    可以通过小程序获取的openid 推送公众号模板消息消息

    或者是公众号openid 推送,公众号模板消息

    推送前提:

    1.需要用户关注微信公众号,不关注推送时会报错

    2.需要公众号和小程序有绑定的管理关系

    参考小程序服务器端接口文档

    https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/uniform-message/uniformMessage.send.html

    附截图为实现功能截图,和 实现代码

            $appid = ''; //小程序appid
            $secret = '';//小程序secret 
            $client = new \GuzzleHttp\Client();
            $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$secret;
            $req = $client->get($url);
            $json = (string)$req->getBody();
            $res = json_decode($json,true);
            if(!empty($res['access_token'])){
                $token = $res['access_token'];
                $client = new \GuzzleHttp\Client();
                $url = 'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token='.$token;
                $params = [
                    'access_token' => $token,
                    'touser' => 'oMRqM5Q0DutHFtd0sqf7khETpcmA',//小程序openid
                    'mp_template_msg' => [
                        'appid' => '',//公众号appid
                        'template_id' => 'S6woD9gTFcTtKjyQ73NCzVQ4fCmbdmQo7UsjX6fKoqU',
                        'url' => 'https://www.jzyun66.com',
                        'miniprogram' => [
                                'appid' => '',//小程序appid
                                'pagepath' => 'pages/index/index?foo=bar',
                                //'pagepath' => 'pages/index/index',
                        ],
                        'data' => [
                            'first' => ['value' => '用户XXX你好','color' => '#173177'],
                            'keyword1' => ['value' => '小王','color' => '#173177'],
                            'keyword2' => ['value' => '200','color' => '#173177'],
                            'remark' => ['value' => '愉快','color' => '#173177'],
                        ],
                    ],
                ];
    
                $response = $client->post($url,['json' => $params]);
                $body = $response->getBody();
                $content = $body->getContents();
                var_dump($content);

    有问题进裙问我721200119

    展开全文
  • 微信公众号模板消息(带流程图)

    千次阅读 2020-06-26 23:32:54
    微信公众号模板消息功能介绍使用说明一、设置所属行业二、获得模板ID三、发送模板消息获取公众号用户的OPENID(第三方网页授权)第一步:用户同意授权,获取code第二步:通过code换取网页授权access_token第三步:...
  • 微信公众号模板消息推送代码,亲测可行。其中有一个工具类,注释啥的都有。需要的可以看看
  • 微信公众号模板消息达到上限后调用清零接口,调用成功后每日发送上限仍然没有清零,调用了10次都不行,请问有没有其他人遇到这样的问题,麻烦帮忙一下</p>
  • 微信公众号模板消息 换行

    万次阅读 2018-07-29 22:37:12
    1.换行如图 2.双引号 可以解析转义字符 代码如下:\r\n 换行 $keyword1_value = "您的订单已支付成功,我们会尽快为您发货。\r\n";
  • 咳咳,今天一口气写了三个文章,大概讲解一下为什么要封装成接口,以往都是封装成一个方法在后台调用,因为前台调用通知较多,为了方便管理就封装成了一个接口,请不要... * @param tempId 模板id * @param data 数据
  • 需要做一个模版消息跳转小程序页面的功能, 但是,发送模版消息时,后台报错 {"errcode":40165,"errmsg":"invalid weapp pagepath hint: [Z.DNpA0161shc2]"} 我实在开发工具中测试的,报这个错误。 我浏览了...
  • private static HashMap getSendDataTemp(String content) { HashMap, Object> data = new HashMap,Object>(); Pattern pattern = Pattern.compile("\\{\\s*\\{.*\...这种类型的内容中提取出来对应的data数据模板
  • 一,必须是认证过的公众号,服务号 已经申请开通模板消息功能(认证服务号即可申请) 二,登录微信公众号平台官方网站,把IP加入白名单 三,本地搭建PHP集成环境 四,导入代码,数据恢复 改一下这几个参数: 五,...
  • 公众号模板消息发送限制

    千次阅读 2018-09-06 16:57:11
    通过公众号给指定的用户发送模板消息,在60秒左右发送的模板消息超过60条,超过的消息发送成功但用户不能接收到,Status=failed:user block
  • 微信公众号创建模板 消息模板创建成功,系统会返回一个消息模板ID。模板格式如下: {{first.DATA}} 消息正文:{{remark.DATA}} 微信调用格式 格式如下: { "touser":"用户iD", "template_id":"消息模板ID", ...
  • 首先,我们可以进去微信...然后我们需要创建一个模板消息 创建完成后,我们记录下4个数据 首先appid和appsecret 然后就是模板消息的id 最后就是我们微信号的openid 记录下这4个数据后,我们需要构建几
  • 微信公众号提供了模板消息的接口,使用测试号已经可以正常推送消息,正式的服务号没有自定义消息模板的功能,只能够选择对应行业的模板信息,然而一个月只能修改一个行业还没有给出模板文档信息,太坑了。...
  • 自己在微信公众平台中申请模板消息的id;这里没有没有提供获取用户openid的方法,我在之前的一个博客中有写过获取用户openid的代码;需要注意的是,有一点很坑,那就是在获取用户openid的时候会返回给你一个token;...
  • 突破群发的限制,次数不受限制,针对不同类型的粉丝,实现精准推送,帮助公众号推广H5或小程序使用模板消息群发需要什么条件?1、必须是已认证的服务号2、需要在公众平台中开通“模板消息”功能插件3、开通后,需要...
  • 6、模板发送消息 7、参数二维码生成 8、扫描参数二维码接收参数和用户openid PS:代码仅供参考,需要在服务号上配置和获取 token,AppID,AppSecret,access_token以及设置网页OAuth2.0鉴权的网页地址。 全程几乎无...
  • 1.公众号-插件-模板消息  图1.1    图1.2 图1.3 2.小程序-模板消息  ...
  • 微信公众号 模板消息

    2020-09-11 10:57:01
    现有一套在线客服系统,想用微信公众号模板消息来及时提醒客服 公众号文档地址 步骤: 1.设置行业 2.选择想要用的模板 3.获取模板列表,得到模板id 这里调用接口: GET ...ar.
  • 微信公众号模板消息 简易完整代码

    千次阅读 2019-12-12 12:11:54
    //模板消息 可修改 $template=array( 'touser'=>$openid, 'template_id'=>$template_id, //模板的id 'url'=>"http://add.12391.net/?d=".$daysides, 'topcolor'=>"#FF0000", 'data'=>array( 'first'=>array...
  • 一、打通微信小程序和微信公众号 1、利用不同平台下,相同的unionid来判断是发送到那个用户 2、获取微信小程序openid和unionid >>官方文档 3、获取微信公众号openid和unionid (触发条件是,用户的关注公众号...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,205
精华内容 23,282
关键字:

公众号模版消息