php下发小程序和公众号统一的服务消息(sendUniformMessage)

349 阅读1分钟

开发需求,客户在微信小程序下单成功之后,需要向管理员推送客户下单成功消息,但小程序的本身的模板消息已经下架一段时间了,看了下文档后选择了微信的“下发统一服务消息”接口,通过小程序获取到用户 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;
}