目前项目中需要有一个除短信外其他方式通知或提醒用户业务操作的功能,
故采用了微信的模板消息,把自己使用模板消息的过程和要点简要的记录一下。
解释一下:就是得与用户有交互的情况下,才能主动发给用户消息,而且消息得使用微信提供的模板,不能是营销类型的,也不能推送频率过大。最好使用前先看一下规则,是否跟自己的业务相符合。运营规则
模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。
(1)所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限;
(2)需要选择公众账号服务所处的2个行业,每月可更改1次所选行业;
在所选择行业的模板库中选用已有的模板进行调用;
(3)每个账号可以同时使用25个模板。
(4)当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制。【2014年11月18日将接口调用频率从默认的日1万次提升为日10万次,可在MP登录后的开发者中心查看】。当账号粉丝数超过10W/100W/1000W时,模板消息的日调用上限会相应提升,以公众号MP后台开发者中心页面中标明的数字为准。
点新的功能,从未开通-广告与服务中找模板消息,进行开通操作,因为我已经开通,所以模板消息到已开通中了。需要选择行业,选的时候慎重点,一个月只能改一次,审核大概1-2工作日。
审核通过后,就可以在广告与服务中找到模板消息功能了
从模板库中寻找符合的模板,添加到我的模板中,就会出现模板Id,下面进行推送的时候需要使用。
进详情,查看内容进行添加操作。
添加之后,出现模板id
开启服务器配置,通过服务器地址接收用户关注事件中得到用户openid
处理代码如下:
class WxPush
{
/**
* 微信事件处理
* @param $xmlStr
* @return bool|string
*/
public function getResponse($xmlStr)
{
if (empty($xmlStr)) {
return '';
}
// 解析该xml字符串,利用simpleXML
libxml_disable_entity_loader(true);
//禁止xml实体解析,防止xml注入
$xml = simplexml_load_string($xmlStr, 'SimpleXMLElement', LIBXML_NOCDATA);
//判断该消息的类型,通过元素MsgType
switch ($xml->MsgType) {
case 'event': // 事件处理
if ($xml->Event == 'subscribe') { // 关注
return $this->subscribeEvent($xml);
}
break;
default:
return '';
break;
}
return '';
}
/**
* 关注订阅处理
* @param $xml
* @return string
*/
protected function subscribeEvent($xml)
{
$fromUserName = $xml->FromUserName;
// fromUserName 就是关注用户的openid 记录到数据库中
$content = "欢迎关注索服\r\n索服始终以企业利益为根本,致力于为传统硬服企业提供高效、可靠、安全的在线交易平台。服务企业、赋能企业!";
return $this->commonTextMsg($xml, $content);
}
/**
* 公共文本消息回复
* @param $xml
* @param $content
* @return string
*/
protected function commonTextMsg($xml, $content)
{
$textTpl = "
%s
";
$fromUserName = $xml->FromUserName;
$toUserName = $xml->ToUserName;
$time = time();
return sprintf($textTpl, $fromUserName, $toUserName, $time, $content);
}
}
注意:
url 和 miniprogram 都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。
代码如下:
linkCurl($url, 'GET', array());
$res = json_decode($result, true);
if (isset($res['errcode']) && $res['errcode']) {
return ['status' => 0, 'msg' => $res['errmsg'], 'data' => []];
}
return ['status' => 1, 'msg' => 'success', 'data' => $res['access_token']];
}
/**
* 确认订单微信提示
* @param $data
* @return array
*/
public function confirmOrderMsg($data)
{
$res = $this->getAccessToken();
if ($res['status'] != 1) return $res;
$url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=' . $res['data'];
$openId = $data['openId'];
$companyName = $data['companyName']; // 企业名称
$orderNum = $data['orderNum']; // 订单编号
$endtime = $data['endtime']; // 截止日期
$totalPrice = $data['totalPrice']; // 订单金额
$param = [
'touser' => $openId,
'template_id' => 'K15UY4vvLF_z5ji91T13ALXYPNfzkaf8HbxnSOPYbXQ',
'url' => 'https://www.xxxxxx.com/share/detail.html?orderNum=' . $orderNum,
'data' => [
'first' => [
'value' => "您好,{$companyName}发来一个订单!",
'color' => '#173177'
],
'keyword1' => [
'value' => $orderNum,
'color' => '#173177'
],
'keyword2' => [
'value' => $endtime,
'color' => '#173177'
],
'keyword3' => [
'value' => $totalPrice . '元',
'color' => '#173177'
],
'keyword4' => [
'value' => '待确认采购订单,请尽快确认!',
'color' => '#173177'
],
'remark' => [
'value' => '点击查看订单信息和进行订单确认!',
'color' => '#173177'
],
]
];
$result = $this->linkCurl($url, 'POST', json_encode($param));
$res = json_decode($result, true);
if (isset($res['errcode']) && $res['errcode']) {
$res['function'] = '确认订单微信提示';
$res['addtime'] = date('Y-m-d H:i:s');
return ['status' => 0, 'msg' => $res['errmsg'], 'data' => $res];
}
return ['status' => 1, 'msg' => 'success'];
}
/**
* 请求接口返回内容
* @param $url :请求的URL地址
* @param $method :请求方式POST|GET
* @param $params :请求的参数
* @param $header : 请求头
* @return bool|string
*/
protected function linkCurl($url, $method, $params = array(), $header = array())
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_FAILONERROR, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if (strpos("$" . $url, "https://") == 1) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
if ($method == "POST") {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
} else if ($params) {
curl_setopt($ch, CURLOPT_URL, $url . '?' . http_build_query($params));
}
$response = curl_exec($ch);
if ($response === false) {
return false;
}
curl_close($ch);
return $response;
}
}
// 调用
$weChat = new WeChat();
$msgData = [
'openId' => '用户openid',
'companyName' => '测试企业名称',
'orderNum' => '2021081747587485748',
'endtime' => date('Y-m-d H:i', time() + 86400),
'totalPrice' => '200.00'
];
$weChat->confirmOrderMsg($msgData);
返回码:
{
"errcode":0,
"errmsg":"ok",
"msgid":200228332
}
效果如下:
至于发送后,如果接收不成功的处理,这里暂没有处理。有需要的可以查看微信官方文章中事件推送说明,进行实现。