微信公众号"发送一次性订阅消息"接口的使用

来源:互联网 发布:python cuda编程 编辑:程序博客网 时间:2024/05/17 20:56

最近,微信新增了发送一次性订阅消息的接口,便使用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,登录公众平台后台,在接口权限列表处可查看订阅模板IDredirect_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订阅消息模板IDaction用户点击动作,”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是填接收消息的用户openidtemplate_id是订阅消息模板IDurl否点击消息跳转的链接,需要有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参数上传。希望可以给各位一些

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