0
点赞
收藏
分享

微信扫一扫

【微信小程序模板消息发送】

infgrad 2022-03-17 阅读 66
<?php

class WeChat{
    private $appid;
    private $appsecret;

    /**
     * WeChat constructor.
     * @param $appid string 小程序的APPID
     * @param $appsecret string 小程序的密钥
     */
    public function __construct($appid,$appsecret)
    {
        $this->appid = $appid;
        $this->appsecret = $appsecret;
    }
	
	/**
     * 测试发送消息
     */
    public function testSendMsg(){
        $openId = 'oVyHG5JWLNN0cSUA7u8GRMIdQo_4';
        $tplId = 'HSUANS7YSpm5OuriAZhzTQEjTCHOChaS4o_3UQ7--lY';
        $params = [
            ['thing2'=>['value'=>'订单号']],
            ['phrase2'=>['value'=>'已维修']],
        ];//注意:必须跟模板的参数名称一致,并且区分大小写

        $this->sendTplMsg($openId, $tplId, $params);
    }
    
    /**
     * 发送模板消息
     * @param string $openId 用户的openid
     * @param string $tplId 消息模板的id
     * @param array $params 消息模板参数
     * @param string $page 小程序跳转的页面
     * @throws HideException
     * @throws ShowException
     */
    public function sendTplMsg($openId, $tplId, $params, $page = "") {
        $url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" . $this->getAccessToken();
        $data = [];
        foreach ($params as $key => $value) {
            $data[$key] = $value;
        }

        $values = [
            "touser" => $openId,
            "template_id" => $tplId,
            "data" => $data,
        ];
        if (!empty($page)) {
            $values["page"] = $page;
        }

        try {
            $json = $this->httpRequest($url,'POST',json_encode($values));
            $res = json_decode($json,true);

            if (!empty($res["errcode"])) {
                print $res["errmsg"] . " " . $res["errcode"];
                exit();
            }
        }catch (Exception $e){
            print $e->getMessage();
            exit();
        }
    }

    /**
     * 获取access_token
     * @return array
     */
    public function getAccessToken(){
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appid}&secret={$this->appsecret}";
        $json = $this->httpRequest($url);
        $data = json_decode($json, true);
        $accessToken = $data['access_token'];
        $tokenExpires = time() + 7200; // token有效时间

        //建议把 token 缓存

        return $accessToken;
    }

    /**
     * CURL请求
     * @param $url string 请求url地址
     * @param $method string 请求方法 get post
     * @param mixed $postfields post数据数组
     * @param array $headers 请求header信息
     * @param bool|false $debug  调试开启 默认false
     * @return mixed
     */
    public function httpRequest($url, $method="GET", $postfields = null, $headers = array(), $debug = false){
        $method = strtoupper($method);
        $ci = curl_init();
        /* Curl settings */
        curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
        curl_setopt($ci, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0");
        curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 60); /* 在发起连接前等待的时间,如果设置为0,则无限等待 */
        curl_setopt($ci, CURLOPT_TIMEOUT, 7); /* 设置cURL允许执行的最长秒数 */
        curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
        switch ($method) {
            case "POST":
                curl_setopt($ci, CURLOPT_POST, true);
                if (!empty($postfields)) {
                    $tmpdatastr = is_array($postfields) ? http_build_query($postfields) : $postfields;
                    curl_setopt($ci, CURLOPT_POSTFIELDS, $tmpdatastr);
                }
                break;
            default:
                curl_setopt($ci, CURLOPT_CUSTOMREQUEST, $method); /* //设置请求方式 */
                break;
        }
        $ssl = preg_match('/^https:\/\//i', $url) ? TRUE : FALSE;
        curl_setopt($ci, CURLOPT_URL, $url);
        if ($ssl) {
            curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
            curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, FALSE); // 不从证书中检查SSL加密算法是否存在
        }
        //curl_setopt($ci, CURLOPT_HEADER, true); /*启用时会将头文件的信息作为数据流输出*/
        curl_setopt($ci, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ci, CURLOPT_MAXREDIRS, 2);/*指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的*/
        curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ci, CURLINFO_HEADER_OUT, true);
        /*curl_setopt($ci, CURLOPT_COOKIE, $Cookiestr); * *COOKIE带过去** */
        $response = curl_exec($ci);
        $requestinfo = curl_getinfo($ci);
        $http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
        if ($debug) {
            echo "=====post data======\r\n";
            var_dump($postfields);
            echo "=====info===== \r\n";
            print_r($requestinfo);
            echo "=====response=====\r\n";
            print_r($response);
        }
        curl_close($ci);
        return $response;
    }
}
举报

相关推荐

0 条评论