开发需求,客户在微信小程序下单成功之后,需要向管理员推送客户下单成功消息,但小程序的本身的模板消息已经下架一段时间了,看了下文档后选择了微信的“下发统一服务消息”接口,通过小程序获取到用户 openid,利用已绑定的同主体下公众号推送公众号申请的模板消息。
下发小程序和公众号统一的服务消息:官方文档
const $wx_appid = '';// 公众号 appid
const $wx_secret = '';// 公众号 secret
const $mini_appid ='';// 小程序 appid
const $mini_secret = '';// 小程序 secret
const $template_id = '';// 公众号模板消息,模板ID
// 构建统一消息数据,调用发送
public function send_msg()
{
$send_msg = [
'touser' => '', // 接收消息用户 openid
'mp_template_msg' => [
'appid' => $wx_appid,// 公众号 appid
'template_id' => $template_id, // 公众号申请的模板消息,模板id
'url' => '', // 点击模板消息会跳转的链接
'miniprogram' => [
'appid' => $mini_appid,// 点击消息跳转小程序appid,路径
// 'pagepath' => ''//点击消息跳转小程序路径,需为已发布小程序路径,否则会报错,可以省略
],
'data' => [
// 模板消息数据
'first' => ['value' => '', 'color' => '#ff0000'],
'keyword1' => ['value' => '', 'color' => '#000000'],
'keyword2' => ['value' => '', 'color' => '#000000'],
'keyword3' => ['value' => '', 'color' => '#ff0000'],
'keyword4' => ['value' => '', 'color' => '#000000'],
'keyword5' => ['value' => '', 'color' => '#000000'],
'remark' => ['value' => '', 'color' => '#e6a23c'],
]
],
];
$this->send_message($send_msg);
}
// 发送统一消息
private function send_message($template_data)
{
$access_token = $this->getAccessToken();
if (empty($access_token)) return false;
$json_template = json_encode($template_data);
$url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token={$access_token}";
$res = $this->curl_request($url,$json_template,'POST');
$res = json_decode($res,true);
// halt($res);
}
// 获取小程序 access_token
private function getAccessToken()
{
$access_token = cache('access_token');// access_token两小时内有效,获取后存入缓存,下次调用直接从缓存读取
if (empty($access_token)) {
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$mini_appid}&secret={$mini_secret}";
$res = json_decode($this->curl_request($url), true);
if(empty($res) || empty($res['access_token'])) return false;
$access_token = $res['access_token'];
cache('access_token', $access_token, 6000);// 官方目前提供的 access_token 过期时间为7200s,为了以防万一,此处缓存设置为6000s,提前对access_token进行刷新
}
return $access_token;
}
// 发起 http 请求
private function curl_request($url,$data = null,$methods = 'GET')
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if ($methods !== 'GET'){
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}