微信小程序模板消息php,微信小程序模板消息实现(PHP+小程序)
参考官方文档和部分资料,总结小程序模板消息推送以及相关注意事项,楼主踩过的坑,特来与大家分享。
一、开发准备:
1.在微信公众平台-小程序的模板中心申请消息模板
二、实现原理:
文档示例:小程序 + 接口(PHP)
小程序部分:
话不多说,先上效果图:
示例代码:
Submit
formSubmit: function (e) {
console.log('form发生了submit事件,formId为:', e.detail)
var that = this;
wx.request({
url: 'https://api.XXX.com/sendTemplateMessage.api',
data: {
uid: uid,
formId: e.detail.formId
},
method: 'post',
header: {'content-type': 'application/x-www-form-urlencoded'}, //使用这种方式后台才能实现获取到数据
success: function (res) {
console.log("发送模板:" + res.data)
}
})
注意事项:
小程序通submit点击事件获formid在安卓和IOS是不一样的,安卓系统中为13位时间戳,而IOS系统中为32位字符串,在做接口请求时,不需要做额外处理。
安卓系统 IOS系统
PHP接口部分:
1.根据微信公众平台 -- 设置 -- 消息推送 -- URL(服务器地址),在PHP项目配置入口文件,实现请求分发。
2.验证入口文件,传递token令牌(消息推送的token),进行Signature签名有效性验证,完成之后才能进行消息模板的服务器URL地址配置。
define('SS_START_TIME', microtime(true));
define('RUN_SS', true);
require '../ss/ss.php';
$ss = new ss('xcx');
$ss->execute('xcx', 'valid', 'xcx');
?>
// 小程序验证入口文件
public function xcx(){
$type = $token; //Token(令牌)
if ($this->checkSignature($type) && isset($_GET['echostr'])){
echo $_GET['echostr'];
exit();
}
}
/**
* 校验微信加密签名
* @return bool
*/
private function checkSignature($type = ''){
// 微信服务器配置Token
$token = $type;
// 1.将timestamp,token,nonce按字典序排序
$timestamp = $_GET['timestamp'];
$nonce = $_GET['nonce'];
$signature = $_GET['signature'];
$arr = array($timestamp, $token, $nonce);
sort($arr, SORT_STRING);
// 2.拼接为字符串并sha1加密
$tmpStr = implode($arr);
$tmpStr = sha1($tmpStr);
// 3.与signature对比判断是否来自微信服务器
if ($tmpStr == $signature){
return true;
}else{
return false;
}
}
?>
可在https://mp.weixin.qq.com/debug/调试获取access_token
3.微信公众平台-设置-开发设置配置消息推送(需要先将入口文件上传服务器)
4.在微信公众平台获取相关参数:
AppID(小程序ID)、AppSecret(小程序密钥)、Token(令牌)、TemplateId(模板id)、EncodingAESKey(消息加密密钥)
4.1 小程序模板接口
/*
*小程序模板消息
*@param uid 用户id
*$param template_id 模板id
*@param form_id 表单提交场景下formId(只能用一次)
*@param emphasis_keyword 消息加密密钥
*/
public function sendTemplateMessage($uid,$form_id,$template_id){
// 检验uid合法性 防止非法越界
$nickname = "nickname"; // 用户昵称
// 此openid为小程序的openid切勿与微信自动登录的openid混淆
$xcx_open['openid'] = "用户openid";
// openid可以通过PHP接口或者小程序获取
if ($xcx_open['openid']) {
$temp_msg = array(
'touser' => "{$xcx_open['openid']}",
'template_id' => "{$template_id}",
'page' => "/pages/index/index",
'form_id' => "{$form_id}",
'data' => array(
'keyword1' => array(
'value' => "{$nickname}",
),
'keyword2' => array(
'value' => date('Y-m-d H:i:s', time()),
),
'keyword3' => array(
'value' => "好友已完成测试,快去看看吧!",
),
'keyword4' => array(
'value' => "你收到1封新信件,快去看看吧~",
),
),
'emphasis_keyword'=> "{$emphasis_keyword}"
);
$res = $this->sendXcxTemplateMsg(json_encode($temp_msg));
echo "
";var_dump($res);exit;
}
}
4.2 发送小程序模板消息
/**
* 发送小程序模板消息
* @param $data
* @return array
*/
public function sendXcxTemplateMsg($data,$appid = "",$appsecret = "")
{
// 具体模板格式参考公众平台申请的template_id
if (!$appid || !$appsecret)
{
$appid = ''; //小程序id
$appsecret = ''; //小程序秘钥
}
$access_token = $this->getXcxAccessToken($appid,$appsecret);
$url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token={$access_token}";
return $this->http_request($url, $data);
}
请求数据格式如下:
{
"touser": "OPENID",
"template_id": "TEMPLATE_ID",
"page": "index",
"form_id": "FORMID",
"data": {
"keyword1": {
"value": "339208499"
},
"keyword2": {
"value": "2015年01月05日 12:30"
},
"keyword3": {
"value": "腾讯微信总部"
} ,
"keyword4": {
"value": "广州市海珠区新港中路397号"
}
},
"emphasis_keyword": "keyword1.DATA"
}
4.3 获取access_token
/**
* 获取微信接口调用凭证
* @param string $appid
* @param string $appsecret
* @return mixed
*/
public function getXcxAccessToken($appid = '', $appsecret = '')
{
if (!$appid || !$appsecret)
{
$appid = '';
$appsecret = '';
}
// 缓存获取
$cache = &factory::cache();
if (!$cache->get($appid.'xcx_access_token'))
{
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";
$res = $this->http_request($url);
// access_token设置到缓存中
$cache->set($appid.'xcx_access_token', $res['access_token'], 7000);
return $res['access_token'];
}
return $cache->get($appid.'xcx_access_token');
}
4.4 CURL模拟HTTP请求(POST)
/**
* curl模拟http请求GET/POST
* @param $url
* @param null $data
* @return array
*/
public function http_request($url, $data = null)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// 以文件流形式返回
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if (!empty($data))
{
// POST请求
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
$output = curl_exec($ch);
curl_close($ch);
// 返回数组
return json_decode($output, true);
}
传递参数:根据定义接口传递相关参数,用户uid 通过uid获取openid,此openid为小程序的openid, formId 为表单提交场景下,为 submit 事件带上的 formId,formid在安卓和ios下的数据格式和长度不一致,而且小程序获取formid只支持真机调试。
接口调试:errcode 的合法值
值说明
40037template_id不正确
41028form_id不正确,或者过期
41029form_id已被使用
41030page不正确
45009接口调用超过限额(目前默认每个帐号日调用限额为100万)
请求成功:
{
"state": 1,
"data": {
"errcode": 0,
"errmsg": "ok"
},
"info": "successful!"
}
至此,推送功能完整实现!
帮助文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/template-message/sendTemplateMessage.html
【PHPer技术栈】专注后端开发,倡导开源文化,做一个好玩、有趣、有灵魂的PHPer工程师,欢迎大家关注!
微信小程序模板消息php,微信小程序模板消息实现(PHP+小程序)相关推荐
- 小程序统一服务消息_微信团队发布小程序模板消息能力调整通知:小程序订阅消息接口正式上线...
10月13日,微信团队发布了小程序模板消息能力调整通知.微信团队表示,此前的模板消息接口将停止使用,小程序订阅消息接口正式上线.据了解,新上线的小程序订阅消息,同时支持一次性和长期性订阅消息,用户可以 ...
- 微信小程序中获取用户微信公众号授权(openid)用来发送模板消息
需求: 由于小程序不能直接向用户发送模板消息,所以需要用公众号向用户发送模板消息. 于是需要将小程序的openid和公众号的openid绑定在一起.提供两种思路: 方法一: 1.微信小程序和公众号都绑 ...
- 小程序发送订阅消息,微信公众号发送消息模板
首先讲两个注意事项 1.小程序和微信公众号的用户openid是不同的. 2.小程序需要用户手动授权订阅消息通知(一次性订阅是订阅一次发一次,长期订阅可以多发). 关于小程序和公众号AppID和AppS ...
- 微信公众号消息推送开发(模板消息):点击推送消息跳转到网页或者小程序(三)
需求场景: 点击推送的消息后跳转到小程序中的某个页面,或者跳转到某一个网页上,例如有这样一个需求,在商城平台购买产品后,需要通过公众号给用户推送订单详细并且点击消息可以看到对应的订单详情.以下我将在微 ...
- h5商城模板_“公众号+小程序”才是做微信商城的正确方式
如果你问做商城是用公众号好还是小程序好,而回答你只做其中一个的,那么你可以不理他了! 我的答案是:公众号 + 小程序!必须一起做 小程序是一个趋势. 虽然小程序在微信里有着很多独立入口,但是有好些重要 ...
- 微信小程序之发送通知消息(通过openid推送消息给用户)
微信小程序之发送通知消息(通过openid推送消息给用户) 一.获取access_token access_token是接口调用的凭证,目前有效期为两个小时,需要定时刷新,重复获取将导致上次获取的ac ...
- 【微信小程序】实战案例 -- 向订阅用户发送消息(范例:报名提醒)
范例场景描述 活动发起人发起了一场活动,在有人通过微信小程序报名活动时,活动发起人/活动报名审核人员希望可以收到一条报名处理提醒消息. 实现流程 1. 选用订阅模板 登录到小程序后台 找到满足需求的模 ...
- WeChat之小工具:基于C++程序代码设计的查看微信撤销、撤回消息(包括文本、图片、视频等)GUI小工具
WeChat之小工具:基于C++程序代码设计的查看微信撤销.撤回消息(包括文本.图片.视频等)GUI小工具 导读 哈哈,千万不要给程序猿随便发信息,程序猿认真起来,别说你发的微信信息,就连你 ...
- 商城前端模板_如何理解微信小程序和微商城,微信公众号以及APP之间的关系?一张图看懂了!...
老张的一位粉丝,花了几天时间把知乎里面分享的一些关于微信小程序,微信商城,微信公众号,以及APP的相关介绍全看完了. 然后用他自己的话描述了微信小程序和微商城,微信公众号以及APP之间的关系,如下图所 ...
最新文章
- oracle 收回 user,oracle 10.2.0.3对USER收回CONNECT及RESOURCE
- BZOJ 2599: [IOI2011]Race
- page event
- hbuilderx简单网页代码_Python爬取网页数据
- Hadoop命令查看可以访问的queue
- 国防科技大学计算机学院少将,国防科技大学新任副校长兼教育长晋升少将,前任是计算机权威专家...
- my Lead add Lead test
- 向DWR传递map/返回map/list/set等(返回对象的处理)
- mysql的select的排序_mysql数据分组和排序及SELECT子句顺序
- MVVM绑定多层级数据到TreeView并设置项目展开
- afc系统服务器维护,自动售检票系统AFC中央系统维护员中级业务模型.PDF
- MongoDB学习(一)Centos6.5下安装mongoDB
- 158. class, static, self, parent
- SEOBOOK中文电子书-SEO基础教程
- mysql 不允许保存修改_解决SQL SERVER 2014 不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的表进行了更改或者启用了阻止保存要求重新创建表的更改选项...
- celeste第二章_《蔚蓝(Celeste)》全水晶之心收集攻略
- 文档词频矩阵_对论文“从词向量到文档距离”的理解
- tt作曲家简谱打谱软件_作曲家入门指南
- 如何阅读一本书 笔记
- flutter file_picker文件选择器具体用法
热门文章
- 弘辽科技:百分之99卖家不知道的秘密
- 修改 Outlook 数据文件默认保存位置
- Android游戏破解练习-大圣觉醒
- TABLE 的 COL 及 COLGROUP 元素
- EXSI+VSPHERE的安装配置+三种虚拟磁盘模式
- 计算机如何识别这是一个键盘,键盘两个键同时按下时计算机如何识别被按下的是哪个键...
- 【甄选靶场】Vulnhub百个项目渗透——项目四十二:Moria1.1(MD5加盐爆破)
- 架构师图谱之微服务消息队列
- 基于Carsim和Simulink的SIL软件在环仿真验证
- 01-HTML学习笔记