技术饭
微信小程序发送订阅消息(模板消息将下线)
由于“模板消息”将下线,已不再支持添加模板,请尽快接入“订阅消息”。消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验。订阅消息推送位置:服务通知,订阅消息下发条件:用户自主订阅,订阅消息卡片跳转能力:点击查看详情可跳转至该小程序的页面。
小程序申请模板:
官方文档:小程序订阅消息
1、小程序调起订阅消息请求,让用户允许发送订阅消息:wx.requestSubscribeMessage(Object object)
index.wxml:
<button bindtap='subscribeMessage'>消息推送</button>
index.js:
subscribeMessage: function(){
wx.requestSubscribeMessage({
tmplIds: ['s7D53GIcvC0l1ui7Ozz_2JRuG6dY7Ci6UDRsfbeyfc10','lVX0-IdO2i8s-mUBPfFALRUy0qcsh8aG0z_e4P2oY4io'],
success(res) {
console.log(res);
}
})
}
点击即可调起订阅通知的允许询问:
2、后端发送消息请求:subscribeMessage.send
PHP订阅消息推送类:
<?php
/**
* Author: [ CopyLian ]
* Date: [ 2017.02.23 ]
* Email: [ copylian@aikehou.com ]
* Site: [ http://www.copylian.com ]
* Description [ 微信小程序消息推送 ]
*/
namespace wechat;
class WxMessage {
/**
* [sendMessage 订阅消息推送]
* @param [type] $appid [appid]
* @param [type] $appsecret [appsecret]
* @param [type] $touser [用户OPENID]
* @param string $template_id [模板ID]
* @param string $page [跳转页面]
* @param array $messagedata [发送模板数据]
* @param string $state [跳转小程序类型]
* @param string $lang [语言]
*/
public function sendMessage($appid, $appsecret, $touser, $template_id = '', $page = '', $messagedata = [], $state = 'formal', $lang = 'zh_CN')
{
$url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" . $this->_getAccessToken($appid, $appsecret);
$data = [
'touser' => $touser, //接收者(用户)的 openid
'template_id' => $template_id, //所需下发的订阅模板id
'page' => $page, //点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
'data' => $messagedata, //模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }
'miniprogram_state' => $state, //跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
'lang' => $lang //进入小程序查看的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
];
$data = json_encode($data);
//file_put_contents('2.txt',$data, FILE_APPEND);
$result = $this->_requestPost($url, $data);
return $result;
}
/**
* 获取 access_tonken
* @param string $token_file 用来存储token的临时文件
*/
private function _getAccessToken($appid,$appsecret)
{
$cacheKey = 'access_token_appid_' . $appid;
if(cache($cacheKey)){
return cache($cacheKey);
}
// 目标URL:
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appid . "&secret=" . $appsecret;
//向该URL,发送GET请求
$result = $this->_requestGet($url);
if(!$result){
return false;
}
// 存在返回响应结果
$result_obj = json_decode($result, true);
// 写入
cache($cacheKey,$result_obj['access_token'],$result_obj['expires_in']);
return $result_obj['access_token'];
}
/**
* 发送GET请求的方法
* @param string $url URL
* @param bool $ssl 是否为https协议
* @return string 响应主体Content
*/
protected function _requestGet($url,$ssl = true)
{
// curl完成
$curl = curl_init();
//设置curl选项
curl_setopt($curl,CURLOPT_URL,$url);//URL
$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 FirePHP/0.7.4';
curl_setopt($curl,CURLOPT_USERAGENT,$user_agent);//user_agent,请求代理信息
curl_setopt($curl,CURLOPT_AUTOREFERER,true);//referer头,请求来源
curl_setopt($curl,CURLOPT_TIMEOUT,30);//设置超时时间
//SSL相关
if($ssl)
{
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);//禁用后cURL将终止从服务端进行验证
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);//检查服务器SSL证书中是否存在一个公用名(common name)。
}
curl_setopt($curl,CURLOPT_HEADER,false);//是否处理响应头
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);//curl_exec()是否返回响应结果
// 发出请求
$response = curl_exec($curl);
if(false === $response)
{
echo '<br>',curl_error($curl),'<br>';
return false;
}
curl_close($curl);
return $response;
}
/**
* 发送GET请求的方法
* @param string $url URL
* @param bool $ssl 是否为https协议
* @return string 响应主体Content
*/
protected function _requestPost($url,$data,$ssl = true)
{
//curl完成
$curl = curl_init();
//设置curl选项
curl_setopt($curl,CURLOPT_URL,$url);//URL
$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 FirePHP/0.7.4';
curl_setopt($curl,CURLOPT_USERAGENT,$user_agent);//user_agent,请求代理信息
curl_setopt($curl,CURLOPT_AUTOREFERER,true);//referer头,请求来源
curl_setopt($curl,CURLOPT_TIMEOUT,30);//设置超时时间
//SSL相关
if($ssl)
{
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);//禁用后cURL将终止从服务端进行验证
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);//检查服务器SSL证书中是否存在一个公用名(common name)。
}
// 处理post相关选项
curl_setopt($curl,CURLOPT_POST,true);// 是否为POST请求
curl_setopt($curl,CURLOPT_POSTFIELDS,$data);// 处理请求数据
// 处理响应结果
curl_setopt($curl,CURLOPT_HEADER,false);//是否处理响应头
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);//curl_exec()是否返回响应结果
// 发出请求
$response = curl_exec($curl);
if(false === $response)
{
echo '<br>',curl_error($curl),'<br>';
return false;
}
curl_close($curl);
return $response;
}
}
推送订阅消息:
//获取微信配置信息
$appid = config('program.appid');
$appsecret = config('program.appsecret');
//所需下发的订阅模板id
$template_id = config('program.template_id.success');
//接收者(用户)的 openid
$openid = $user_data['openid'];
//跳转页面:点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
$page = ''; // 待开发
//跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
$state = 'formal';
//进入小程序查看的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
$lang = 'zh_CN';
//发送数据
$messagedata = [
'thing21' => [
'value' => mb_substr($activity_ticket['name'], 0, 20) //活动门票
],
'thing17' => [
'value' => mb_substr($activity_ticket['name'].' x '.$order['buy_number'].',总价:¥'.$order['pay_amount'], 0, 20) //活动价格
],
'thing2' => [
'value' => mb_substr($activity_data['title'], 0, 20) //活动名称
],
'date4' => [
'value' => date("Y年m月d年 H:s", strtotime($activity_data['start_date'])) . " - " . date("Y年m月d年 H:s", strtotime($activity_data['end_date'])) //活动时间
],
'thing5' => [
'value' => mb_substr($activity_data['address'], 0, 20) //地址
]
];
//发送消息
$wxMessage = new \wechat\WxMessage();
$data = $wxMessage->sendMessage($appid, $appsecret, $openid, $template_id, $page, $messagedata, $state, $lang);
$data = json_decode($data, true);
源码附件:WxMessage.zip
文明上网理性发言!