thinkphp5微信开发(四)微信模板消息推送

这篇文章是建立在用户已经授权登陆并已将用户openid存入session的基础上,前端表单异步提交并实现模板消息推送,具体效果:

在这里插入图片描述

惯性总结下流程:

1,获取用户openid【接收方】

2,在微信公众平台申请模板消息发送权限,选择合适行业,点击提交,一般审核在3-5个工作日;审核通过,会出现很多同行业模板,选择合适的添加到自己的模板库,通过模板详情可以获取到该模板的数据结构和模板ID,如果找不到合适的,可以自己创建一个模板提交审核,具体格式微信公众平台demo已经很清楚了就不多做赘述

在这里插入图片描述

3,发送过程会调用凭证access_token,如果不明白可移步至我另外两个微信开发总结。因为该access_token有调用次数限制和有效期7200秒,如果不做过期判断用户发送一次调用一次很容易就会把额度用完,我是通过判断上次获取时间与现在时间是否大于等于6000,如果大于则重新获取,此处不唯一,除了用数据库外写入文件速度更佳。

<?php
namespace app\index\controller;
use think\Controller;
use think\Db;
use think\Session;
use think\Request;
 
class Wxnofiy extends Controller{
    public function guestbook(){
        //此处模拟前端表单ajax提交
        $input_data = input("post.");
        $input_data['member']="中奖状态通知";
        $input_data['mobile']="因为你手机号被抽中了!";

        if(isset($input_data) && !empty($input_data)){
            $set_up =  Db::name('setup')->where("id",1)->find();

            /**要发送的微信用户openid,
            1、获取方式 数据库表;2、session;3、post过来数据
            **/
           //$session_info = Session::get("wx_member_info");
          //$openid = $session_info['openid'];
        
          $openid="oUHovs2phYYFrJO5PE-Tdqx6GL7o";
         //$openid="oUHovs8euiHgpumAInHj0FZhdO4g";
         //$openid="oUHovs3vdOWpTgxmMvy1NPPGy0JM";
         
          /* 检查今天是否有提交过
            $time_str = strtotime(date("Y-m-d 0:0:0",time()));
            $check = Db::name("wxmember")->where('openid',$openid)->where('create_time',">=",$time_str)->find();
            if(isset($check) && !empty($check)){
                return json(['code'=>-3];
            }*/

            if($input_data['mobile']==''){
                 return json(['code'=>-3]);
             }
            else{
                //提交成功,触发信息推送
                $data=[
                    'touser'=>$openid,
                    'template_id'=>'SW-vOui9zlQA4vYVTf8LJgwzVY6md_aGBO-KCrEomRw',
                    'url'=>$web_url = "http://".$_SERVER['SERVER_NAME'],
                    'topcolor'=>"#FF0000",
                    'data'=>array(
                        'first'=>array('value'=>"恭喜您中奖",'color'=>"#fc0101"),
                        'keyword1'=>array('value'=>$input_data['member'],'color'=>"#173177"), 
                        'keyword2'=>array('value'=>$input_data['mobile'],'color'=>"#173177"), 
                        // 'keyword3'=>array('value'=>date("Y-m-d H:i:s",time()),'color'=>"#173177"), 
                        // 'keyword4'=>array('value'=>'通过审核','color'=>"#173177"), 
                        'remark'=>array('value'=>"请及时去领奖,感谢配合!",'color'=>"#173177"),
                    )
                ];
 
                $get_all_access_token = $this->get_all_access_token();
 

                $json_data=json_encode($data);//转化成json数组让微信可以接收
                $url="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$get_all_access_token;//模板消息请求URL
 
                $res=$this->https_request($url,urldecode($json_data));
                //请求开始
                
               
                $res=json_decode($res,true);
                //var_dump($res);
                //die;
                if($res['errcode']==0 && $res['errmsg']=="ok"){ 
                //发送成功    
                    return json(['code'=>1]);
                }else{
                     return json(['code'=>-4]);
                }
            }
        }
    }

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

 //微信access_token默认时间是7200s,设置每6000s获取一次并保存入库
    public function get_all_access_token(){
      $access_token_jilu = db('setup')->where('id',1)->find();
       if(time()-$access_token_jilu['token_exp']>6000){
            $appid = $access_token_jilu['appid'];
            $secret = $access_token_jilu['appsecret'];
            $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$secret;
            $res = $this->http_curl($url);
        
             $access_token = $res['access_token'];
            //session('uacc',$res);
            //$access_token =session('uacc.access_token');
            $update_data =[
                'token_exp' =>time(),
                'token'=>$access_token
            ];
            $update_data = db('setup')->where('id',1)->update($update_data);
        }

         else{
             $access_token = $access_token_jilu['token'];
        }

        //halt($access_token);
            
        return $access_token;
    }


   //获取access_token的curl方法
    public function http_curl($url,$type='get',$res='json',$arr=''){
        //1.初始化curl
        $ch = curl_init();
        //2.设置curl的参数
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //不验证证书
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //不验证证书
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        if ($type == 'post') {
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $arr);
        }
        //3.采集
        $output = curl_exec($ch);
        //4.关闭
        curl_close($ch);
        if ($res == 'json') {
            return json_decode($output,true);
        }
    }


}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值