最近,微信新增了发送一次性订阅消息的接口,便使用php做了一个测试案例,希望可以给大家帮助。微信发送一次性订阅消息的规范 :https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1500374289_66bvB

发送一次性订阅消息有两个步骤:

 第一步:需要用户同意授权,获取一次给用户推送一条订阅模板消息的机会

 第二步:通过API推送订阅模板消息给到授权微信用户

接下来,我就附上我的代码,然后给大家讲解一下

    /**
     * 获取授权发送一次性订阅接口接口
     */
    public function getSubscribemsg()
    {
        redirect("https://mp.weixin.qq.com/mp/subscribemsg?action=get_confirm&appid=wxee6a581d613debee&scene=1000&template_id=ZydnrAeuYY4kPcImQTe3J81TDLUsSioKBQYvAwG4OwI&redirect_url=http%3a%2f%2fsslkg.xnit.net%2findex.php%2fhome%2fCom%2fsubscribemsg&reserved=test#wechat_redirect");
    }

    /**
     * 发送一次性订阅接口
     */
    public function subscribemsg()
    {
        $action = $_GET['action'];
        if ($action == "confirm") {
            $openid = $_GET['openid'];
            $template_id = $_GET['template_id'];
            $scene = $_GET['scene'];
            $access_token = $this->get_access_tokenjs();
            $url = "https://api.weixin.qq.com/cgi-bin/message/template/subscribe?access_token={$access_token}";
            $postdata = "{" 
                . "\"touser\": \"" . $openid . "\"," 
                . "\"template_id\":\"" . $template_id . "\"," 
                . "\"url\": \"https://www.baidu.com\"," 
                . "\"scene\": \"".$scene."\"," 
                . "\"title\": \"t\"," 
                . "\"data\": {" 
                   . "\"content\": {" 
                      . "\"value\": \"订阅消息测试\"," 
                      . "\"color\": \"blue\"" 
                   . "}" 
                . "}" 
            . "}";
            $ch1 = curl_init();
            $timeout = 3000;
            curl_setopt($ch1, CURLOPT_URL, $url);
            curl_setopt($ch1, CURLOPT_POST, 1);
            curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch1, CURLOPT_CONNECTTIMEOUT, $timeout);
            curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch1, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch1, CURLOPT_POSTFIELDS, $postdata);
            
            $result = curl_exec($ch1);
            
            curl_close($ch1);
            $result = json_decode($result, true);
            $errcode = $result['errmsg'];
            $this->error($errcode, "/Houses/houselist");
        }
    }
我们看到上面有两个方法,getSubscribemsg()这个方法主要是获取用户授权,获得一次发送一次性订阅消息的机会,它的主要功能就是转发到用户授权url,主要有几个参数

参数说明

参数
是否必须 说明
action 直接填get_confirm即可
appid
公众号的唯一标识
scene 重定向后会带上scene参数,开发者可以填0-10000的整形值,用来标识订阅场景值
template_id 订阅消息模板ID,登录公众平台后台,在接口权限列表处可查看订阅模板ID
redirect_url 授权后重定向的回调地址,请使用UrlEncode对链接进行处理。注:要求redirect_url的域名要跟登记的业务域名一致,且业务域名不能带路径。业务域名需登录公众号,在设置-公众号设置-功能设置里面对业务域名设置。
reserved 用于保持请求和回调的状态,授权请后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect 无论直接打开还是做页面302重定向时,必须带此参数

redirect_url参数对应第二个方法的访问路径,这个路径需要经过urlencoding编码

用户同意或取消授权后会返回相关信息

如果用户点击同意或取消授权,页面将跳转至:

redirect_url/?openid=OPENID&template_id=TEMPLATE_ID&action=ACTION&scene=SCENE

参数说明

参数 说明
openid 用户唯一标识,只在用户确认授权时才会带上
template_id 订阅消息模板ID
action 用户点击动作,”confirm”代表用户确认授权,”cancel”代表用户取消授权
scene 订阅场景值
reserved 请求带入原样返回

subscribemsg()方法就是根据返回数据去发送一次性订阅信息,我们在subscribemsg()方法里获取以上返回的数据,然后拼成json格式的数据,发送数据到下面的接口。

接口请求说明

http请求方式: post

https://api.weixin.qq.com/cgi-bin/message/template/subscribe?access_token=ACCESS_TOKEN

post数据示例

{

“touser”:”OPENID”,

“template_id”:”TEMPLATE_ID”,

“url”:”URL”,

“scene”:”SCENE”,

“title”:”TITLE”,

“data”:{

“content”:{

“value”:”VALUE”,

“color”:”COLOR”

                    }

               }

}

参数说明

参数 是否必须 说明
touser 填接收消息的用户openid
template_id 订阅消息模板ID
url 点击消息跳转的链接,需要有ICP备案
scene 订阅场景值
title 消息标题,15字以内
data 消息正文,value为消息内容文本(200字以内),没有固定格式,可用\n换行,color为整段消息内容的字体颜色(目前仅支持整段消息为一种颜色)

返回说明

在调用接口后,会返回JSON数据包。正常时的返回JSON数据包示例:

{

“errcode”:0,

“errmsg”:”ok”

}

这里我要说一下我在做这个的时候遇到的一些问题:

1. errmsg 返回的信息是data format error hint,这个问题主要是数据格式不正确,在这里,我需要插一句,我在做这个的时候,发现微信接口说明里

说的”value为消息内容文本(200字以内),没有固定格式,可用\n换行“,我发现如果在value参数里写上\n,就会报错,所以,我不知道是还未提供,

还是哪里出了问题,如果各位知道了,希望告知一声。

2. errmsg 返回的信息是user refuse to accept the msg hint: [5aw330620ge21],一次性订阅接口并不是说会员订阅一次后就能不断的推送消息,

而是说会员订阅一次后你只能推送一条,如果想再次推送,需要再一次订阅,这点要先搞明白,如果你想尝试一次订阅多次推送。

我在测试过程中也遇到了这个问题,后面发现是因为我没有给scene赋值,所以,获取到返回数据之后,一定要把scene参数上传。希望可以给各位一些

帮助。如果各位发现其中有什么问题,希望可以指出,谢谢!

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐