前言
大部分的微信公众号项目都要实现推送消息给用户的功能,如下单成功、支付成功、退款成功...都要发送消息给用户,刚好最近项目要实现发送消息模板功能,下面用PHP简单实现功能。
Tips
- 微信公众号要开通发送消息模板功能,并添加模板
- 发送的用户必须关注该公众号
代码
<?php
public function sendNotice(){
//获取access_token
if (Cookie::get('access_token')){
$access_token = Cookie::get('access_token');
}else{
$access_token = $this->getAccessToken();
}
//模板消息
$json_template = $this->jsonTempalte();
$url="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=$access_token";
$res=$this->curl($url,urldecode($json_template));
if ($res['errcode']==0){
return '发送成功';
}else{
return '发送失败';
}
}
public function getAccessToken()
{
$appid = '你的微信公众号appid';
$appsecret = '你的微信公众号appsecret';
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
$json_token=$this->curl($url);
$res=json_decode($json_token,true);
$access_token=$res['access_token'];
Cookie::set('access_token',$access_token,7200);//这里可以优化用redis储存
return $access_token;
}
/**
* 将模板消息json格式化
*/
public function jsoneTmpalte(){
//模板消息
$template=array(
'touser'=>"用户openid", //用户openid
'template_id'=>"在公众号下配置的模板id", //在公众号下配置的模板id
'url'=>"http://www.xxxxxxx.cn/", //点击模板消息会跳转的链接
'topcolor'=>"#7B68EE",
'data'=>array(
'first'=>array('value'=>urlencode("您已下单成功"),'color'=>"#FF0000"),
'keyword1'=>array('value'=>urlencode('订单号'),'color'=>'#FF0000'), //keyword需要与配置的模板消息对应
'keyword2'=>array('value'=>urlencode("商品信息"),'color'=>'#FF0000'),
'keyword3'=>array('value'=>urlencode('订单金额'),'color'=>'#FF0000'),
'remark' =>array('value'=>urlencode('备注:这是测试'),'color'=>'#FF0000'), )
);
$json_template=json_encode($template);
return $json_template;
}
/**
* 服务器之间请求的curl方法
*
* @param $url 请求地址
* @param array $field post参数
* @return string
*/
function curl($url , $field = []){
//初始化curl
$ch = curl_init();
//设置请求的地址
curl_setopt($ch,CURLOPT_URL,$url);
//设置接收返回的数据,不直接展示在页面
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
//设置禁止证书校验
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
//判断是否为post请求方式,如果传递了第二个参数,就代表是post请求,如果么有传递,第二个参数为空,就是get请求
if (!empty($field)){
//设置请求超时时间
curl_setopt($ch,CURLOPT_TIMEOUT,30);
//设置开启post
curl_setopt($ch,CURLOPT_POST,1);
//传递post数据
curl_setopt($ch,CURLOPT_POSTFIELDS,$field);
}
//定义一个空字符串,用来接收请求的结果
$data = '';
if (curl_exec($ch)){
$data = curl_multi_getcontent($ch);
}
//关闭curl
curl_close($ch);
//将得到的结果返回
return $data;
}
?>