Don't forget that you have had a dream

    

微信小程序之 PHP 发送模板消息

今天入坑小程序模板消息的推送,也是踩了不少的坑啊,在这儿 share 一下~,有任何疑问可以联系我!

准备

1: 官方文档
https://developers.weixin.qq.com/miniprogram/dev/api/notice.html#发送模板消息

总的来说,小程序发送模板消息和公众号发送模板消息区别不是很大

2: 小程序发送模板消息:

- 获取access_token并存储以备再次使用
- 小程序端获取发送必要的formID(submit提交事件)或    prepay_id(支付事件)
- 拼装模板消息数据
- 调用接口发送模板消息

吐槽一下

微信小程序的机制是这样的

formid 只能通过移动端进行获取(手机,iPad);
每获取到一个 formid **只能使用一次**(一个formid只能发送一条模板消息);
发起form表单提交事件 ==> 获取 form_id 和 发起人openid ==> php后台处理拼装模板消息 ==> 发送给发起人;
上边说的意思是:A获取的formid只能用来给自己发送模板消息,不能用来给B发送模板消息;

解决方案

在A触发表单提交事件时,将本次获取到的formid保存到A提交的表单内容中,反正就是与A本次提交的数据绑定死(死结,除了自己,谁都不给用),在B触发对A的某事件时,需要发送模板消息了,这时把A之前绑定的formid拿出来用,还是给A自己用

for example:

A提交了请假申请(通过表单提交申请内容),B审核,审核完成后,把审核结果通过模板消息发送给A

终于到代码了

我不是前端妹子,小程序的代码就不放了,自己找找吧

<?php
namespace Jykj\\Template\\Weixin;
/**
 * 小程序模板消息发送
 * 微信规定:不能直接在小程序调用,只能在后台发起
 */
class WxSendTemplate {
    private $token ='''';
    private $appid = ''******************'';
    private $appsecret = ''********************************'';
    private $templateid = ''*******************************************'';
    private $SEND_TEMPLATE_URL = ''https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=##TOKEN##'';
    private $GET_ACCESSTOKEN_URL = ''https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=##APPID##&secret=##APPSECRET##'';

    /**
     * 构造函数,获取access_token
     * @Author   wanghongbin
     * @Email    wanghongbin@ngoos.org
     * @DateTime 2018-07-06
     */
    public function __construct() {
        $this->token = $this->getAccessToken();
    }

    /**
     * 发送模板消息
     * @Author   wanghongbin
     * @Email    wanghongbin@ngoos.org
     * @DateTime 2018-07-06
     * @param    array
     * @return   [type]
     */
    public function sendTemplateData($data = array()) {
        $options = array(
            ''http'' => array(
                ''method''  => ''POST'',
                ''header''  => ''Content-type:application/json'',//header 需要设置为 JSON
                ''content'' => $this->getTemplatePostData($data),
                ''timeout'' => 60//超时时间
            )
        );
        $url = str_replace("##TOKEN##",$this->token,$this->SEND_TEMPLATE_URL);        
        $context = stream_context_create($options);
        $result = file_get_contents($url, false, $context);

        return $result;
    }


    /**
     * 获取模板消息
     * @Author   wanghongbin
     * @Email    wanghongbin@ngoos.org
     * @DateTime 2018-07-06
     * @param    array
     * @return   [type]
     */
    private function getTemplatePostData($data=array()){
        $post_data = array (
            "touser"        => $data[''openid''],//用户的 openID,可用过 wx.getUserInfo 获取
            "template_id"   => $this->templateid,//小程序后台申请到的模板编号
            "page"          => $data[''pageuri''],//点击模板消息后跳转到的页面,可以传递参数
            "form_id"       => $data[''formid''],//第一步里获取到的 formID
            "data"          => array(
                ''keyword1''  => array( "value" => $data[''status''],"color"=>"green"),
                ''keyword2''  => array( "value" => $data[''shopername'']),
                ''keyword3''  => array( "value" => $data[''telephone'']),
                ''keyword4''  => array( "value" => $data[''ordertime''])
            ),
            "emphasis_keyword" => "keyword1.DATA"
        );
        //将数组编码为 JSON
        return \\json_encode($post_data, true);
    }

    /**
     * 获取AccessToken
     * @Author   wanghongbin
     * @Email    wanghongbin@ngoos.org
     * @DateTime 2018-07-06
     * @return   [type]
     */
    private function getAccessToken () {  
        $url = str_replace("##APPID##",$this->appid,$this->GET_ACCESSTOKEN_URL);        
        $url = str_replace("##APPSECRET##",$this->appsecret,$url);        
        $html = file_get_contents($url);
        $output = json_decode($html, true);
        $access_token = $output[''access_token''];

        return $access_token;
    }   

    /**
     * 获取所有的模板
     * @Author   wanghongbin
     * @Email    wanghongbin@ngoos.org
     * @DateTime 2018-07-06
     * @return   [type]
     */
    public function get_all_private_template()
    {
        $url = "https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=".$this->token;
        $res = file_get_contents($url);
        return json_decode($res,true);
    }

}

效果图

您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站部分内容收集于互联网,如果有侵权内容、不妥之处,请联系我们删除。敬请谅解!
所有原创文章采用 知识共享署名-非商业性使用 4.0 国际许可协议 知识共享许可协议 进行许可。

评论已关闭

  更新日志

博客banner下方滚动文字替换为使用 一言API 随机获取 --- updated on 2019-05-22 09:04:31 星期三

  关于博主

三里林,一个致力于分享,分享心得,分享技术,分享知识点的个人博客

  近期评论

  分类目录

这颗糖微微发黑,一定不能吃了。被握的太紧,已经有点碎了。

请叫我女王大人~

公民们,庇护所即将关闭,感谢所有人,再见。

为什么你宁愿吃生活上的苦 而不愿意吃学习上的苦?

你有学校也有朋友,但对我来说,我的生活中就只有你。

大多数人高估了他们一天能做的事,但低估了他们一年能做的事。

我等你十三载,你如何回我?

葡萄的卷须有一点淡淡的甜味。这东西如果腌成咸菜,大概不难吃。