1、登录微信公众平台,开通模版消息
2、完成服务类目,根据自己项目的需求,选择类似的服务类目,后续可直接使用所选类目下的模版(现在基本上不能再自行创建模版了)
/******************* 微信公众号推送 start **********************/
/**
* @note 发送模板消息【下单成功推送】
* @param $data
* @author: 夜色殘 [995562569@qq.com]
* @Time: 2023/07/10 17:15
*/
public static function send_template_order($data){
//已改版,不支持再传自定义标题及备注信息 https://developers.weixin.qq.com/community/develop/doc/00080e73bbc5c079e0af3591b51c00
//组建推送数据
$data = [
"touser"=>$data['wx_openid'], //对方的openid,前一步获取
"template_id"=>"tDM14RR4f1Hk8IXTJd1UDQ_mtNRXeLZtlaeslXrn3M0", //模板id
"data"=>[
"short_thing1"=>[
"value"=> '出票成功' , //出票状态
],
"thing2"=>[
"value"=> $data['start_city'].'——'.$data['end_city'] , //行程
],
"time3"=>[
"value"=> date('Y-m-d',$data['appointment_time']) , //出发时间
],
]
];
//获取access_token
$wx_accession_token = self::getAccessToken() ;
$data = json_encode($data);
$url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$wx_accession_token;
$res = postCurl($url,$data,'',$type="POST");;
return $res ;
}
/**
* @note 发送模板消息【后台订单状态变更】
* @param $data
* @author: 夜色殘 [995562569@qq.com]
* @Time: 2023/07/10 17:15
*/
public static function send_template_notice($data){
//已改版,不支持再传自定义标题及备注信息 https://developers.weixin.qq.com/community/develop/doc/00080e73bbc5c079e0af3591b51c00
//获取access_token
$wx_accession_token = self::getAccessToken() ;
$title = $data['title'] ; //标题
$time = date('Y-m-d H:i:s',$data['create_time']) ; //发送时间
$content = $data['content'] ; //内容
foreach ($data['user_list'] as $item){
//组建推送数据
$return = [
"touser"=> $item['wx_openid'], //对方的openid,前一步获取
"template_id"=>"NdwBBjPdc3CxCTUp95FSHfUJ86aPGVz6BRjE8oWzTuw", //模板id
"data"=>[
//自定义颜色、首行内容及尾部备注字段已被去除,仅能展示对应的字段的文字且不超过20个字符。https://mp.weixin.qq.com/s/hvLO4Vs75NXDA__SxuyKXw
"first"=>[
"value"=> $title , //异常描述
"color"=> '#173177'//自定义颜色【已弃用】
],
"keyword1"=>[
"value"=> $time , //发送时间
"color"=> '#173177'//自定义颜色
],
"keyword2"=>[
"value"=> $content , //异常描述
"color"=> '#173177'//自定义颜色
],
"remark"=>"感谢您的一贯支持", //自定义参数【已弃用】
]
];
$return = json_encode($return,320);
error_log(date("Y-m-d H:i:s").' send_template_recharge----'.$return.PHP_EOL,'3','send_template_recharge.log');
$url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$wx_accession_token;
$res = postCurl($url,$return,'',$type="POST") ;
}
return $res ;
}
/**
* Notes:获取微信access_token【过期自动获取并记录过期时间】
* User: 任性不起来了
* Date: 2023/7/18 11:19
*/
public static function getAccessToken(){
session_start();
$access_token = $_SESSION['access_token'];
$access_token_expire = $_SESSION['access_token_expire'];
$WeChat_config = addons_config('WeChat');
if(!$access_token || $access_token_expire < time() ){
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$WeChat_config['code_appid'].'&secret='.$WeChat_config['code_appsecret'];
$weixin = file_get_contents($url); //通过code换取网页授权access_token
$jsondecode = json_decode($weixin); //对JSON格式的字符串进行编码
$array = get_object_vars($jsondecode); //转换成数组
if($array['access_token']){
$_SESSION['access_token'] = $array['access_token'] ;
$_SESSION['access_token_expire'] = time() + 7000 ;
}
}
return $_SESSION['access_token'] ;
}
/******************* 微信公众号推送 end **********************/
if (!function_exists('postCurl')) {
/**
*$this->postCurl方法
*/
function postCurl($url,$body,$header,$type="POST"){
$header[] = 'User-Agent: Apipost client Runtime/+https://www.apipost.cn/';
$header[] = 'Accept: application/json';
//1.创建一个curl资源
$ch = curl_init();
//2.设置URL和相应的选项
curl_setopt($ch,CURLOPT_URL,$url);//设置url
//1)设置请求头
//array_push($header, 'Accept:application/json');
//array_push($header,'Content-Type:application/json');
//array_push($header, 'http:multipart/form-data');
//设置为false,只会获得响应的正文(true的话会连响应头一并获取到)
curl_setopt($ch,CURLOPT_HEADER,0);
// curl_setopt ( $ch, CURLOPT_TIMEOUT,5); // 设置超时限制防止死循环
//设置发起连接前的等待时间,如果设置为0,则无限等待。
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,5);
//将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//2)设备请求体
if ($body) {
//$b=json_encode($body,true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);//全部数据使用HTTP协议中的"POST"操作来发送。
}
//设置请求头
if($header){
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
}
//上传文件相关设置
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 对认证证书来源的检查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);// 从证书中检查SSL加密算
//3)设置提交方式
switch($type){
case "GET":
curl_setopt($ch,CURLOPT_HTTPGET,true);
break;
case "POST":
curl_setopt($ch,CURLOPT_POST,true);
break;
case "PUT"://使用一个自定义的请求信息来代替"GET"或"HEAD"作为HTTP请求。这对于执行"DELETE" 或者其他更隐蔽的HTT
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,"PUT");
break;
case "DELETE":
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,"DELETE");
break;
}
//4)在HTTP请求中包含一个"User-Agent: "头的字符串。-----必设
// curl_setopt($ch, CURLOPT_USERAGENT, 'SSTS Browser/1.0');
// curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
curl_setopt ( $ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)' ); // 模拟用户使用的浏览器
//5)
//3.抓取URL并把它传递给浏览器
$res=curl_exec($ch);
$code=curl_getinfo($ch, CURLINFO_HTTP_CODE);
$result=json_decode($res,true);
//4.关闭curl资源,并且释放系统资源
curl_close($ch);
if(empty($result))
return $res;
else
$result['code']=$code;
return $result;
}
}
if (!function_exists('http_curl_get')) {
/**
* curl get请求
*/
function http_curl_get($url,$type=1) {
$curl = curl_init();
curl_setopt($curl,CURLOPT_TIMEOUT,5000);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($curl,CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']);
curl_setopt($curl,CURLOPT_URL,$url);
if($type == 1){
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
}
$res = curl_exec($curl);
if($res){
curl_close($curl);
return $res;
}else {
$error = curl_errno($curl);
curl_close($curl);
return $error;
}
}
}