要使用微信订阅通知功能,需要用户首先在小程序点击订阅后,后台方可推送相关订阅通知模板,否则无法直接推送。
1、微信小程序开发:
(1)将微信开发者工具的基础调试库选择一下,低版本的库会报函数错误,无法使用。
(2)小程序编辑调用方法。
wx.requestSubscribeMessage({
tmplIds: ['xxxx'], //此处填写相应的小程序通知模板的id,字符串
success(res) {
console.log(res);
}
})
使用该方法后,运行小程序会弹出提示:
点击允许后,打印的res包含成功订阅的返回信息
errMsg: "requestSubscribeMessage:ok"
模板id: "accept"
使用手机微信调试:
(2)到这一步后表示已经订阅该小程序的模板通知。
2、后端开发(ThinkPHP5.1)
请求地址:
POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN
(1)因为需要请求微信接口,所以封装好一个curl会话功能。代码如下:
common.php:
(2)因为要获取openId和access-token信息,在config目录下配置文件配置微信小程序对应信息
wx.php:
'xxx',
// 小程序app_secret
'app_secret' => 'xxx',
//模板id
'template_id' => 'xxx',
// 微信使用code换取用户openid及session_key的url地址
'login_url' =>"https://api.weixin.qq.com/sns/jscode2session?
appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
// 微信获取access_token的url地址
'access_token_url' => "https://api.weixin.qq.com/cgi-bin/token?" .
"grant_type=client_credential&appid=%s&secret=%s",
//微信评论内容检测url地址
'msgSecCheck_url' => "https://api.weixin.qq.com/wxa/msg_sec_check?access_token=%s",
//微信评论图片检测url地址
'imgSecCheck_url' => "https://api.weixin.qq.com/wxa/img_sec_check?access_token=%s",
//发送模板消息url地址
'sendTemplateMessage_url' => "https://api.weixin.qq.com/cgi-
bin/message/subscribe/send?access_token=%s",
];
(3)要请求微信接口,需要access_token,获取代码如下:
/**
* AccessToken 保留时间2小时 7200
* @return mixed
*/
public function getAccessToken(){
$wxAppID = config('wx.app_id');
$wxAppSecret = config('wx.app_secret');
$wxAccessTokenUrl = sprintf(
config('wx.access_token_url'), $wxAppID, $wxAppSecret);
$result = curl_get($wxAccessTokenUrl);
//$wxAccessToken = json_decode($result,true);
return $result;
}
获取openId差不多一样方法,就不写了,之前已经将用户openId保存到数据库中。现在只需要将用户id就可查询出openId。
(4)请求微信接口,代码如下:
public function sendMessage($openId,$templateId)
{
//获取access_token
$accessToken = new AccessToken();
$access_token = $accessToken ->getAccessToken();
//要发送给微信接口的数据
$send_data = [
//用户openId
"touser" => $openId,
//模板id
"template_id" => $templateId,
//指定发送到开发版
"miniprogram_state"=>"developer",
//点击跳转到小程序的页面
"page"=>'home',
"data"=>[
"name1" => [
"value"=> "三旺"
],
"time2" => [
"value"=> date('Y-m-d H:i:s',time())
],
"thing3" => [
"value"=> "签到活动"
],
"thing4" => [
"value"=> "签到活动"
]
],
];
//将路径中占位符%s替换为$access_token值
$urls = sprintf(config('sendTemplateMessage_url'), $access_token);
$ret = curl_post($urls, $send_data);
return $ret;
}
(5)通过postman访问接口,发送成功