最近,微信新增了发送一次性订阅消息的接口,便使用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参数上传。希望可以给各位一些
帮助。如果各位发现其中有什么问题,希望可以指出,谢谢!