这篇文章是建立在用户已经授权登陆并已将用户openid存入session的基础上,前端表单异步提交并实现模板消息推送,具体效果:
惯性总结下流程:
1,获取用户openid【接收方】
2,在微信公众平台申请模板消息发送权限,选择合适行业,点击提交,一般审核在3-5个工作日;审核通过,会出现很多同行业模板,选择合适的添加到自己的模板库,通过模板详情可以获取到该模板的数据结构和模板ID,如果找不到合适的,可以自己创建一个模板提交审核,具体格式微信公众平台demo已经很清楚了就不多做赘述
3,发送过程会调用凭证access_token,如果不明白可移步至我另外两个微信开发总结。因为该access_token有调用次数限制和有效期7200秒,如果不做过期判断用户发送一次调用一次很容易就会把额度用完,我是通过判断上次获取时间与现在时间是否大于等于6000,如果大于则重新获取,此处不唯一,除了用数据库外写入文件速度更佳。
<?php
namespace app\home\controller;
use think\Controller;
use think\Db;
use think\Session;
use think\Request;
class Index extends Controller{
public function guestbook(){
//此处模拟前端表单ajax提交
$input_data = input("post.");
if(isset($input_data) && !empty($input_data)){
$set_up = Db::name('setup')->where("id",1)->find();
$session_info = Session::get("wx_member_info");
$openid = $session_info['openid'];
$time_str = strtotime(date("Y-m-d 0:0:0",time()));
//检查今天是否有提交过
$check = Db::name("guestbook")->where('openid',$openid)->where('create_time',">=",$time_str)->find();
if(isset($check) && !empty($check)){
return ['code'=>-3];
}else{
//提交成功,触发信息推送
$data=[
'touser'=>$openid,
'template_id'=>'oWitBQQ1XswpDpgt5Lj0Dsig62TGND9Nn71DyYHiEUs',
'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);
if($res['errcode']==0 && $res['errcode']=="ok"){
return ['code'=>1];
}else{
return ['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;
}
public function get_all_access_token(){
$access_token_jilu = Db::name('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'];
$update_data = [
'token_exp' =>time(),
'token'=>$access_token
];
$update_data = Db::name('setup')->where('id',1)->update($update_data);
}else{
$access_token = $access_token_jilu['token'];
}
return $access_token;
}
}