晓夏

北漂的女孩

Good Luck To You!

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;
    }

}


神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。