php代码实现微信公众号无限制推送/群发模板消息!

2018年3月2日11:14:48 发表评论 1,075

一、前言

微信认证的服务号才有推送模板消息接口

所以本文需要在认证服务号的情况下学习

以上就是模板消息,只有文字和跳转链接,没有封面图。

在服务号的后台添加功能插件-模板消息即可(如下图)。

就好像平常你用微信买车票一样,买完车票,公众号就会给你推送一条这样的通知!

所以模板消息,就是用于业务的通知的。

二、获取ACCESS_TOKEN

模板消息,都是在后台选择一个群发模板的,然后获取模板ID,根据这个模板,定义参数即可。

本案例需要获取ACCESS_TOKEN

获取ACCESS_TOKEN其实很简单

开发文档已经给出了获取ACCESS_TOKEN的api,方法如下:

http请求方式: GET

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

把上面的APPID、APPSECRET分别换成你的公众号或者测试号的APPID、APPSECRET

然后访问替换后的链接就会返回一串JSON格式的数据里面就有ACCESS_TOKEN

当然ACCESS_TOKEN是会过期的,自己需要整合这个api自动获取,我们学习过程中做测试可以直接获取粘贴上去。

当然调用这个接口需要配置IP白名单,如果获取过程中出现一串英文,里面有IP地址,就说明你还没配置IP白名单

你需要进入公众号后台安全中心-IP白名单-粘贴提示的IP地址即可。

三、实例化

如果你要给指定的openID群发模板消息

例如你公司做教育培训服务的,有3个学生报了你们公司的某课程培训班,你需要在上课前15分钟主动向每个学生的微信推送模板消息通知上课,那么这三个学生需要关注你的服务号,你还要获取到这三个学生的openID,然后存入数组中,遍历数组发送即可。

四、获取OPENID

获取openID的方法

1、配置回调域名

进入公众号,接口权限,找到网页服务,网页获取用户基本信息

进去修改你的域名即可

2、新建oauth.php

<?php
  //获取微信access_token
function getaccess_token(){
    $code = $_GET['code'];
    $appid = '自己的appid';
    $appsecret = '自己的appsecret';
    $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$appsecret}&code={$code}&grant_type=authorization_code";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
    $data = curl_exec($ch);
    curl_close($ch);
    echo $data;
}
getaccess_token();

五、配置用户要访问的网页

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

REDIRECT_URI是回调链接

就是上面的oauth.php的地址

例如你的域名是www.baidu.com

你把oauth.php上传到根目录

那么URL转码的回调链接就是http://www.baidu.com/oauth.php

回调链接需要URL转码

给大家提供一个转码工具:http://tool.oschina.net/encode?type=4

选择encodeURLComponent进行URL编码

最终的回调链接是:http%3A%2F%2Fwww.baidu.com%2Foauth.php

例如的你APPID是:wx66666666666666

整个用户要访问的网页就是:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx66666666666666&redirect_uri=http%3A%2F%2Fwww.baidu.com%2Foauth.php&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

用户访问的网页也需要URL转码

最终的网址是:

https%3A%2F%2Fopen.weixin.qq.com%2Fconnect%2Foauth2%2Fauthorize%3Fappid%3Dwx66666666666666%26redirect_uri%3Dhttp%3A%2F%2Fwww.baidu.com%2Foauth.php%26response_type%3Dcode%26scope%3DSCOPE%26state%3DSTATE%23wechat_redirect

然后用微信访问上面的最终的网址,就会返回一串JSON数据,里面有openid

要想获得3个学生的openid那么就要这三个学生点进去,获取发给你

六、开始推送

下面就是模板消息推送给指定的openid的代码

我就以这三个学生的openid为例

新建muban.php,拷贝以下代码,修改你的ACCESS_TOKEN,修改你的学生的3个openid。

<?php
$ACCESS_TOKEN = "替换你的ACCESS_TOKEN";//ACCESS_TOKEN
//openid数组
$touser = [
    'ouD7BuHpIKRXPIz7pdrwI9IwDRCU',
    'ouD7BuI36wSUZgteyiydmDrldQLU',
    'ouD7BuLejq7R4Vbuyh41bH778cg0'];
//模板消息请求URL
$url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . $ACCESS_TOKEN;
 
//遍历发送微信消息
foreach ($touser as $value) {
    $data = getDataArray($value);
    $json_data = json_encode($data);//转化成json数组让微信可以接收
    $res = https_request($url, urldecode($json_data));//请求开始
    $res = json_decode($res, true);
    if ($res['errcode'] == 0 && $res['errcode'] == "ok") {
        echo "发送成功!<br/>";
    }
}
 
//获取发送数据数组
function getDataArray($value)
{
    $data = array(
        'touser' => $value, //要发送给用户的openid
        'template_id' => "mfopDNUlvoBGGsPLB-d_nrfL8Je92xnTq5vk5ZBxL-w",//改成自己的模板id,在微信后台模板消息里查看
        'url' => "http://mp.weixin.qq.com/s/8UWPqHVa8PReWZp-No0ebA", //自己网站链接url
        'data' => array(
            'first' => array(
                'value' => "亲爱的同学,您有考试提醒,请查阅。",
                'color' => "#000"
            ),
            'keyword1' => array(
                'value' => "2017下半年教师资格证面试",
                'color' => "#f00"
            ),
            'keyword2' => array(
                'value' => "2018-1-6",
                'color' => "#173177"
            ),
            'keyword3' => array(
                'value' => "请看您的准考证",
                'color' => "#3d3d3d"
            ),
            'keyword4' => array(
                'value' => "教师资格证试讲",
                'color' => "#3d3d3d"
            ),
            'keyword5' => array(
                'value' => "答辩,选题,结构化",
                'color' => "#3d3d3d"
            ),
            'remark' => array(
                'value' => "\n现在是打印准考证时间,请您在考试前打印准考证,戳进来可以查看详情>>>",
                'color' => "#3d3d3d"
            ),
        )
    );
    return $data;
}
 
 
//curl请求函数,微信都是通过该函数请求
function https_request($url, $data = null)
{
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    if (!empty($data)) {
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($curl);
    curl_close($curl);
    return $output;
}
 
?>

七、获取模板ID

修改你的模板ID

模板ID是什么?

就是你要推送的那个卡片的模板

例如支付成功模板,上课通知模板,发货模板....

当然代码我觉得你们看得懂的!

只要修改模板里面的自定义参数

然后确保ACCESS_TOKEN还在有效期内

访问muban.php

你这三个学生就会同时收到推送的模板消息了!

一天最多推送100000条!

还可以点进去直接访问你配置的lP链接

八、注意

以上只用了3个openid进行循环遍历推送,这个没问题当openid过多时,例如你有100个openid或者1000个

甚至10000个的时候你会发现执行muban.php的时候会出现超时,

并且只有极少量的openid推送成功因为循环遍历的速度没有那么快,

不可能在短时间内遍历那么多的openid如果openid超过10个建议用其他办法增加推送效率,

例如异步队列,redis队列懂这方面的知识的同学,

结合上面的,相信你会开发出一套完美的模板消息推送系统!

    
weinxin
官方QQ交流群
扫一扫加入交流群获取更多资源

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

私信给楼主