技术饭

微信小程序发送订阅消息(模板消息将下线)

copylian    0 评论    17175 浏览    2020.03.31

由于“模板消息”将下线,已不再支持添加模板,请尽快接入“订阅消息”。消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验。订阅消息推送位置:服务通知,订阅消息下发条件:用户自主订阅,订阅消息卡片跳转能力:点击查看详情可跳转至该小程序的页面。

小程序申请模板:

微信图片_20200331164623.png

官方文档:小程序订阅消息

1、小程序调起订阅消息请求,让用户允许发送订阅消息:wx.requestSubscribeMessage(Object object)

index.wxml:

<button bindtap='subscribeMessage'>消息推送</button>


index.js:

subscribeMessage: function(){

        wx.requestSubscribeMessage({

                tmplIds: ['s7D53GIcvC0l1ui7Ozz_2JRuG6dY7Ci6UDRsfbeyfc10','lVX0-IdO2i8s-mUBPfFALRUy0qcsh8aG0z_e4P2oY4io'],

                success(res) {

                        console.log(res);

                }

        })

}


点击即可调起订阅通知的允许询问:


111975064.png

2、后端发送消息请求:subscribeMessage.send

PHP订阅消息推送类:

<?php

/**

 * Author: [ CopyLian ]

 * Date: [ 2017.02.23 ]

 * Email: [ copylian@aikehou.com ]

 * Site: [ http://www.copylian.com ]

 * Description [ 微信小程序消息推送 ]

 */

namespace wechat;


class WxMessage {


   

/**

     * [sendMessage 订阅消息推送]

     * @param  [type] $appid       [appid]

     * @param  [type] $appsecret   [appsecret]

     * @param  [type] $touser      [用户OPENID]

     * @param  string $template_id [模板ID]

     * @param  string $page        [跳转页面]

     * @param  array  $messagedata [发送模板数据]

     * @param  string $state       [跳转小程序类型]

     * @param  string $lang        [语言]

     */

    public function sendMessage($appid, $appsecret, $touser, $template_id = '', $page = '', $messagedata = [], $state = 'formal', $lang = 'zh_CN')

    {

        $url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" . $this->_getAccessToken($appid, $appsecret);

        $data = [

            'touser'             => $touser, //接收者(用户)的 openid

            'template_id'        => $template_id, //所需下发的订阅模板id

            'page'               => $page, //点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。

            'data'               => $messagedata, //模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }

            'miniprogram_state'  => $state, //跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版

            'lang'               => $lang //进入小程序查看的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN

        ];

        $data = json_encode($data);

        //file_put_contents('2.txt',$data, FILE_APPEND);

        $result = $this->_requestPost($url, $data);

        return $result;

    }


    /**

     * 获取 access_tonken

     * @param string $token_file 用来存储token的临时文件

     */

    private function _getAccessToken($appid,$appsecret)

    {

        $cacheKey = 'access_token_appid_' . $appid;

        if(cache($cacheKey)){

            return cache($cacheKey);

        }

        // 目标URL:

        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appid . "&secret=" . $appsecret;

        //向该URL,发送GET请求

        $result = $this->_requestGet($url);

        if(!$result){

            return false;

        }

        // 存在返回响应结果

        $result_obj = json_decode($result, true);

        // 写入

        cache($cacheKey,$result_obj['access_token'],$result_obj['expires_in']);

        return $result_obj['access_token'];

    }


    /**

     * 发送GET请求的方法

     * @param string $url URL

     * @param bool $ssl 是否为https协议

     * @return string 响应主体Content

     */

    protected function _requestGet($url,$ssl = true)

    {

        // curl完成

        $curl = curl_init();


        //设置curl选项

        curl_setopt($curl,CURLOPT_URL,$url);//URL

        $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 FirePHP/0.7.4';

        curl_setopt($curl,CURLOPT_USERAGENT,$user_agent);//user_agent,请求代理信息

        curl_setopt($curl,CURLOPT_AUTOREFERER,true);//referer头,请求来源

        curl_setopt($curl,CURLOPT_TIMEOUT,30);//设置超时时间


        //SSL相关

        if($ssl)

        {

            curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);//禁用后cURL将终止从服务端进行验证

            curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);//检查服务器SSL证书中是否存在一个公用名(common name)。

        }

        curl_setopt($curl,CURLOPT_HEADER,false);//是否处理响应头

        curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);//curl_exec()是否返回响应结果


        // 发出请求

        $response = curl_exec($curl);

        if(false === $response)

        {

            echo '<br>',curl_error($curl),'<br>';

            return false;

        }

        curl_close($curl);

        return $response;

    }


    /**

     * 发送GET请求的方法

     * @param string $url URL

     * @param bool $ssl 是否为https协议

     * @return string 响应主体Content

     */

    protected function _requestPost($url,$data,$ssl = true)

    {

        //curl完成

        $curl = curl_init();

        //设置curl选项

        curl_setopt($curl,CURLOPT_URL,$url);//URL

        $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 FirePHP/0.7.4';

        curl_setopt($curl,CURLOPT_USERAGENT,$user_agent);//user_agent,请求代理信息

        curl_setopt($curl,CURLOPT_AUTOREFERER,true);//referer头,请求来源

        curl_setopt($curl,CURLOPT_TIMEOUT,30);//设置超时时间

        //SSL相关

        if($ssl)

        {

            curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);//禁用后cURL将终止从服务端进行验证

            curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);//检查服务器SSL证书中是否存在一个公用名(common name)。

        }

        // 处理post相关选项

        curl_setopt($curl,CURLOPT_POST,true);// 是否为POST请求

        curl_setopt($curl,CURLOPT_POSTFIELDS,$data);// 处理请求数据

        // 处理响应结果

        curl_setopt($curl,CURLOPT_HEADER,false);//是否处理响应头

        curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);//curl_exec()是否返回响应结果


        // 发出请求

        $response = curl_exec($curl);

        if(false === $response)

        {

            echo '<br>',curl_error($curl),'<br>';

            return false;

        }

        curl_close($curl);

        return $response;

    }

}


        推送订阅消息:

//获取微信配置信息

$appid = config('program.appid');

$appsecret = config('program.appsecret');


//所需下发的订阅模板id

$template_id = config('program.template_id.success');


//接收者(用户)的 openid

$openid = $user_data['openid'];


//跳转页面:点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。

$page = ''; // 待开发


//跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版

$state = 'formal';


//进入小程序查看的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN

$lang = 'zh_CN';


//发送数据

$messagedata = [

        'thing21'       => [

                 'value' => mb_substr($activity_ticket['name'], 0, 20) //活动门票

        ],

        'thing17'       => [

                'value' => mb_substr($activity_ticket['name'].' x '.$order['buy_number'].',总价:¥'.$order['pay_amount'], 0, 20) //活动价格

        ],

        'thing2'        => [

                    'value' => mb_substr($activity_data['title'], 0, 20) //活动名称

        ],

        'date4'         => [

                'value' => date("Y年m月d年 H:s", strtotime($activity_data['start_date'])) . " - " . date("Y年m月d年 H:s", strtotime($activity_data['end_date'])) //活动时间

        ],

        'thing5'        => [

                'value' => mb_substr($activity_data['address'], 0, 20) //地址

                ]

];


//发送消息

$wxMessage = new \wechat\WxMessage();

$data = $wxMessage->sendMessage($appid, $appsecret, $openid, $template_id, $page, $messagedata, $state, $lang);

$data = json_decode($data, true);

源码附件:WxMessage.zip

只袄早~~~
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!

文明上网理性发言!

  • 还没有评论,沙发等你来抢