php 小程序模板消息发送
浏览量:387
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; } }
神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。