ThinkPHP中使用微信JsSDK

<?php namespace Common\Controller;
class WxController{
    protected $appId=C('WX_APPID');
    protected $appSecret=C('WX_SECRET');

    function getSignPackage(){
        $jsapiTicket =$this->getJsApiTicket();
        // 注意 URL 一定要动态获取,不能 hardcode.
        $protocol=(!empty($_SERVER['HTTPS'])&&$_SERVER['HTTPS']!=='off'||$_SERVER['SERVER_PORT']==443)?"https://":"http://";
        $url="$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        $timestamp=time();
        $nonceStr=$this->createNonceStr();
        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
        $string="jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
        $signature=sha1($string);
        $signPackage=[
            "appId"=>$this->appId,
            "nonceStr"=>$nonceStr,
            "timestamp"=>$timestamp,
            "url"=>$url,
            "signature"=>$signature,
            "rawString"=>$string
        ];
        return $signPackage;
    }

    function createNonceStr($length=16){
        $chars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str="";
        for($i=0;$i<$length;$i++){
            $str.=substr($chars,mt_rand(0,strlen($chars)-1),1);
        }
        return $str;
    }

    function getJsApiTicket(){
        // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
        $data=json_decode(F('jsapi_ticket'));
        if($data->expire_time<time()){
            $accessToken=$this->getAccessToken();
            // 如果是企业号用以下 URL 获取 ticket
            // $url="https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
            $url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
            $res=json_decode($this->httpGet($url));
            $ticket=$res->ticket;
            if($ticket){
                $data->expire_time=time()+7000;
                $data->jsapi_ticket=$ticket;
                F('jsapi_ticket',json_encode($data));
            }
        }else{
            $ticket=$data->jsapi_ticket;
        }
        return $ticket;
    }

    function getAccessToken(){
        // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
        $data=json_decode(F('access_token'));
        if($data->expire_time<time()){
            // 如果是企业号用以下URL获取access_token
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
            $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
            // dump($url);
            $res=json_decode($this->httpGet($url));
            // dump($res);
            $access_token=$res->access_token;
            if($access_token){
                $data->expire_time=time()+7000;
                $data->access_token=$access_token;
                F('access_token',json_encode($data));
            }
        }else{
            $access_token=$data->access_token;
        }
        return $access_token;
    }

    function httpGet($url){
        $curl=curl_init();
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($curl,CURLOPT_TIMEOUT,500);
        // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
        // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
        curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false);
        curl_setopt($curl,CURLOPT_URL,$url);
        $res=curl_exec($curl);
        curl_close($curl);
        return $res;
    }

    function httpPost($url,$data=null){
        $ch=curl_init();
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
        if($data){
            curl_setopt($ch,CURLOPT_POST,TRUE);
            curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
        }
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
        $output=curl_exec($ch);
        if($output){
            curl_close($ch);
            return($output);
        }else{
            $error=curl_error($ch);
            curl_close($ch);
            E($error);
        }
    }

    function arr2xml($arr){
        if(!is_array($arr)||count($arr)<=0){
            E('【arr2xml】arr格式有误');
        }
        $xml='<xml>';
        foreach($arr as $k=>$v){
            if(is_numeric($v)){
                $xml.='<'.$k.'>'.$v.'</'.$k.'>';
            }else{
                $xml.='<'.$k.'><![CDATA['.$v.']]></'.$k.'>';
            }
        }
        $xml.='</xml>';
        return $xml;
    }

    function xml2arr($xml){
        if(!$xml){
            E('【xml2arr】XML格式有误');
        }
        libxml_disable_entity_loader(TRUE);
        $arr=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
        $arr=json_encode($arr);
        $arr=json_decode($arr,TRUE);
        return $arr;
    }

    function arr2url($url,$arr){
        if(!$arr){
            E('【arr2url】参数错误');
        }
        $tmp=$url;
        foreach($arr as $k=>$v){
            if($k!='sign'&&$v!=''&&!is_array($v)){
                $tmp.=$k.'='.$v.'&';
            }
        }
        $tmp=trim($tmp,'&');
        return $tmp;
    }

    function sign($arr){
        if(!$arr){
            E('【paysign】参数错误');
        }
        ksort($arr);
        //dump($arr);
        $str=$this->arr2url('',$arr);
        $str.='&key='.PAYKEY;
        $str=md5($str);
        $str=strtoupper($str);
        //dump($str);
        return $str;
    }

    function ssl($xml,$url,$second=30){
        $ch=curl_init();
        //超时时间
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
        //设置header
        curl_setopt($ch,CURLOPT_HEADER,FALSE);
        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
        //设置证书
        curl_setopt($ch,CURLOPT_CAINFO, CAPEM);
        //使用证书:cert 与 key 分别属于两个.pem文件
        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLCERT, CERTPEM);
        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLKEY, KEYPEM);
        //post提交方式
        curl_setopt($ch,CURLOPT_POST, true);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);

        $data=curl_exec($ch);
        //返回结果
        if($data){
            curl_close($ch);
            return $data;
        }else{
            $error=curl_errno($ch);
            F('sslerror',$error);
            curl_close($ch);
            return false;
        }
    }

    //发送模板消息
    function sendMsg($openid,$template_id,$body){
        $data=[
            'touser'=>$openid,
            'template_id'=>$template_id,
            'data'=>$body,
        ];
        $url="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$this->getAccessToken();
        $this->httpPost($url,jsonencode($data));
    }

}

猜你喜欢

转载自blog.csdn.net/sr_www/article/details/81125209