php 小程序模板消息发送
浏览量:394
1、要想给微信小程序发送模板消息,首先要保存formId,因为只有有效的formId,才能做小程序服务通知,很简单存入集合就行
formid使用一次就失效,无论成功失败
/**
* 根据用户openid 保存formId
* @param $openid
* @param $form
* @param $expireTime
* author :lianghuiju@chuchujie.com
* function_name : setOpenIdFormIds
* datetime : 2018/11/29
* description :
*/
public function setOpenIdFormIds($openid,$formId,$scoreTime){
$key = Constant::USER_OPENID_FORMIDS_LIST . $openid;
$zaddResult = $this->_redisConnect->zadd($key, $scoreTime, $formId);
$this->_redisConnect->EXPIRE($key, 432000); //每个formId缓存5天
return $zaddResult;
}2、发送模板消息
/**
* 微信小程序模板消息发送
* @param $order_sn
* @param int $type 1未付款提醒 2退款通知 3发货提醒 4付款成功 5报名结果通知
* @param $activityUrl 活动跳转地址
* @return mixed
* author :lianghuiju@chuchujie.com
* function_name : pushSmallAPP
* datetime : 2018/11/30
* description :
*/
public static function pushSmallAPP($order_sn,$type = 4,$activityUrl=''){
$data['static'] = 1;
$data['mag'] = "参数有误";
if(empty($order_sn)){
return $data;
}
$list = self::getOrderUserProduct($order_sn,$type);
if(empty($list)){
return $data;
}
$userId = $list['user_id'];
$openidDetail = self::getOpenIdByUser($userId);
if(!isset($openidDetail['base_openid']) && empty($openidDetail['base_openid'])){
return $data;
}
$openid = $openidDetail['base_openid'];
$formId = CacheSDK::RedisDefault()->getOpenIdFormIds($openid);
if(empty($formId[0])){
$data['mag'] = "没有可用的formid";
return $data;
}
$goodsName = $list['goodsName'];
$price = $list['price'];
$form_id = $formId[0];
switch ($type){
case 1:
$dataUnpaid = WechatSend::getUnpaidNotifySmallAppConfig($order_sn,$goodsName,$price);
break;
case 2:
$dataUnpaid = WechatSend::getRefundNotifySmallAppConfig($order_sn,$goodsName,$price);
break;
case 3:
$shippingName = $list['shipping_name'];
$shippingSn = $list['shipping_sn'];
$dataUnpaid = WechatSend::getDeliverNotifySmallAppConfig($order_sn,$goodsName,$shippingName,$shippingSn);
break;
case 4:
$dataUnpaid = WechatSend::getPayNotifySmallAppConfig($order_sn,$goodsName,$price);
break;
case 5:
$dataUnpaid = WechatSend::getSignNotifySmallAppConfig($order_sn,$goodsName,$price,$activityUrl);
break;
}
$url = !empty($dataUnpaid['url']) ? $dataUnpaid['url'].$order_sn : '';
$pushRes = WechatSend::sendTplSmallApp($openid, $dataUnpaid['template_id'], $url, $dataUnpaid['data'], $form_id);
CacheSDK::RedisDefault()->removeOpenIdFormIds($openid,$form_id);
return $pushRes;
}3.模板消息类库
<?php
/**
* 微信小程序模板消息推送
* 2018/11/29
* linghuiju@sina.com
*/
namespace Util;
use libx\Manager\DI;
use Exception\ApiException;
use Util\Constant;
class WechatSend
{
const API_URL = 'https://api.weixin.qq.com';
const URL_SM_SEND_TPL = "/cgi-bin/message/wxopen/template/send?access_token=%s";//发送模板消息
/**
* 获取access_token
* @param bool $refresh
* @return bool|string
* author :lianghuiju@chuchujie.com
* function_name : getAccessToken
* datetime : 2018/11/29
* description :
*/
public static function getAccessToken() {
$accessToken = CacheSDK::RedisDefault()->getTddWechatAccessToken();
if ($accessToken && !empty($accessToken)) {
return $accessToken;
}
$appId = Constant::TDD_SMALL_APP_ID;
$appSecret = Constant::TDD_SMALL_APP_SECRET;
$url = \Yaf\Registry::get("urlConf")['url']['wx_get_access_token'];
$url = sprintf($url, $appId, $appSecret);
$rlt = DI::get('http')->get($url);
if ($rlt['status'] == 0) {
$wxRlt = json_decode($rlt['data'], true);
if ($wxRlt && !isset($wxRlt['errcode'])) {
$accessToken = $wxRlt['access_token'];
$expireTime = $wxRlt['expires_in'] - 100;
CacheSDK::RedisDefault()->getTddSmallAppAccessToken($accessToken, $expireTime);
return $accessToken;
} else {
Log::write('['.__FUNCTION__.']; status:' . $rlt['status'] . '; code:' . $rlt['code'] .'; msg:'. $rlt['message'] .'; wechat_rlt:'. $rlt['data'], Log::LEVEL_ERROR);
ApiException::throwException(ApiException::GET_WX_ACCESS_TOKEN_ERROR, '', array(__FUNCTION__.' fail'));
}
} else {
Log::write('['.__FUNCTION__.']; status:' . $rlt['status'] . '; code:' . $rlt['code'] .'; msg:'. $rlt['message'] .'; wechat_rlt:'. $rlt['data'], Log::LEVEL_ERROR);
ApiException::throwException(ApiException::GET_WX_ACCESS_TOKEN_ERROR, '', array(__FUNCTION__.' fail'));
}
}
/**
* 发送模板消息
* @param $openid 接收者(用户)的 openid
* @param $template_id 所需下发的模板消息的id
* @param $url 点击模板卡片后的跳转页面,仅限本小程序内的页面(示例index?foo=bar)。该字段不填则模板无跳转。
* @param array $data 模板内容,不填则下发空模板
* @param $form_id 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id
* @return mixed
* author :lianghuiju@chuchujie.com
* function_name : sendTplSmallApp
* datetime : 2018/11/29
* description :
*/
public static function sendTplSmallApp($openid, $template_id, $url, array $data, $form_id) {
$accessToken = self::getAccessToken();
$post_msg = json_encode(array(
"touser" => $openid,
"template_id" => $template_id,
"page" => $url,
"form_id" => $form_id,
"data" => $data,
), JSON_UNESCAPED_UNICODE);
$url = sprintf(self::API_URL . self::URL_SM_SEND_TPL, $accessToken);
return self::http($url, 'POST', $post_msg);
}
/**
* get post请求
* @param $url
* @param string $method
* @param null $data
* @param bool $to_array
* @return mixed
* author :lianghuiju@chuchujie.com
* function_name : http
* datetime : 2018/11/29
* description :
*/
private static function http($url, $method = 'GET', $data = null, $to_array = true) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
if ($method == 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 10000);
$result = curl_exec($ch);
if (curl_errno($ch)) {
$error = curl_error($ch);
curl_close($ch);
Core::write('[Wechat fail-curl:params:' . json_encode($data).'-return'.json_decode($error),Core::LEVEL_PUSH_NOTIFY_ERROR);
}
if ($to_array == true) {
$response = json_decode($result, true);
if (is_array($response)) {
if (@$response['errcode'] != 0) {
Core::write('[Wechat fail-Push:params:' . json_encode($data).'|message:'.$response['errmsg'].'|code:'.$response['errcode'],Core::LEVEL_PUSH_NOTIFY_ERROR);
}
return $response;
} else {
$errorMsg = "返回错误";
Core::write('[Wechat fail-Push:params:' . json_encode($data).'-return'.json_decode($result).'|message:'.$errorMsg,Core::LEVEL_PUSH_NOTIFY_ERROR);
}
}
return $result;
}
/**
* 未付款 模板
* @param $orderSn
* @param $goodsName
* @param $price
* @param $config
* author :lianghuiju@chuchujie.com
* function_name : getUnpaidNotifySmallAppConfig
* datetime : 2018/11/29
* description :
*/
public static function getUnpaidNotifySmallAppConfig($orderSn, $goodsName, $price) {
$data['template_id'] = "dpDjXYw9p1NfTbvZefmtof3ETNdJ2YvzxRQP3t5xGUk";
$data['url'] = "/pages/order/orderDetail/orderDetail?order_sn="; //小程序跳转地址
$data['data'] = array(
'keyword1' => array(
'value' => $orderSn,
'color' => '#173177'
),
'keyword2' => array(
'value' => $goodsName,
'color' => '#173177'
),
'keyword3' => array(
'value' => $price . '元',
'color' => '#173177'
),
'keyword4' => array(
'value' => '未支付,即将自动取消',
'color' => '#173177'
),
//温馨提示
'keyword5' => array(
'value' => "备注:自动设置",
'color' => "#f60300"
)
);
return $data;
}
/**
* 退款通知 模板
* @param $orderSn
* @param $goodsName
* @param $reason
* @param $price
* @return mixed
* author :lianghuiju@chuchujie.com
* function_name : getRefundNotifySmallAppConfig
* datetime : 2018/11/30
* description :
*/
public static function getRefundNotifySmallAppConfig($orderSn,$goodsName,$price){
$data['template_id'] = "QlC0lT-KMUlwp6e9gbMtUE6rDeVj9s6awLFQaGjv39M";
$data['url'] = "/pages/order/orderDetail/orderDetail?order_sn="; //小程序跳转地址
$data['data'] = array(
'keyword1' => array(
'value' => $goodsName,
'color' => '#173177'
),
'keyword2' => array(
'value' => $price . '元',
'color' => '#173177'
),
'keyword3' => array(
'value' => $orderSn,
'color' => '#173177'
),
//温馨提示
'keyword4' => array(
'value' => "备注:自动设置",
'color' => "#f60300"
)
);
return $data;
}
/**
* 发货提醒 模板
* @param $orderSn 订单号
* @param $address 地址详情
* @param $logistics 物流信息
* @return mixed
* author :lianghuiju@chuchujie.com
* function_name : getDeliverNotifySmallAppConfig
* datetime : 2018/11/30
* description :
*/
public static function getDeliverNotifySmallAppConfig($order_sn,$goodsName,$shippingName,$shippingSn){
$data['template_id'] = "AzkSCs7hY6In4F6rhiPusd8n1wU027HhhOngXlKe8a4";
$data['url'] = "/pages/order/orderDetail/orderDetail?order_sn="; //小程序跳转地址
$data['data'] = array(
'keyword1' => array(
'value' => $goodsName,
'color' => '#173177'
),
'keyword2' => array(
'value' => $shippingName,
'color' => '#173177'
),
'keyword3' => array(
'value' => $shippingSn,
'color' => '#173177'
),
'keyword4' => array(
'value' => $order_sn,
'color' => '#173177'
),
'keyword5' => array(
'value' => "发货备注:自动设置",
'color' => '#f60300'
),
);
return $data;
}
/**
* 付款成功 模板
* @param $orderSn
* @param $goodsName
* @param $price
* @return mixed
* author :lianghuiju@chuchujie.com
* function_name : getPayNotifySmallAppConfig
* datetime : 2018/11/30
* description :
*/
public static function getPayNotifySmallAppConfig($orderSn,$goodsName,$price){
$data['template_id'] = "Jcia_69KZoXd1ciwkgDAXi0rm7WnQFXKa63LrpvfUZE";
$data['url'] = "/pages/order/orderDetail/orderDetail?order_sn="; //小程序跳转地址
$data['data'] = array(
'keyword1' => array(
'value' => $orderSn,
'color' => '#173177'
),
'keyword2' => array(
'value' => $goodsName,
'color' => '#173177'
),
'keyword3' => array(
'value' => $price . '元',
'color' => '#173177'
),
'keyword4' => array(
'value' => '已支付,欢迎下次购买',
'color' => '#173177'
),
//温馨提示
'keyword5' => array(
'value' => "备注:自动设置",
'color' => "#f60300"
)
);
return $data;
}
/**
* 报名结果通知 模板
* @param $activityName 活动主题
* @param $activityContent 活动内容
* @param $activityTime 活动时间
* @return mixed
* author :lianghuiju@chuchujie.com
* function_name : getSignNotifySmallAppConfig
* datetime : 2018/11/30
* description :
*/
public static function getSignNotifySmallAppConfig($activityName ,$activityContent,$activityTime,$url){
$data['template_id'] = "MZ-2HHcLrQuUqHzA_o4uSaTzcw2N-Yyvu-OIdbnk_7M";
$data['url'] = $url;
$data['data'] = array(
'keyword1' => array(
'value' => $activityName,
'color' => '#173177'
),
'keyword2' => array(
'value' => $activityContent,
'color' => '#173177'
),
'keyword3' => array(
'value' => $activityTime,
'color' => '#173177'
),
'keyword4' => array(
'value' => '备注:活动报名通知',
'color' => '#173177'
),
);
return $data;
}
}
神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。