laravel框架中 公衆號js-sdk後臺生成簽名的方法(封裝好的方法)

class WechatShareController extends CommonController
{

    public $appid = "***********************";
    public $secret = "***************************";
    protected $app;


    public function index(Request $request)
    {
        // 注意 URL 一定要動態獲取,不能 hardcode.
//        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
//        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        $url = request('url');//url前臺傳過來的
//        $url = 'https://mymtest.moobyyoho.com/wechat_share';
        $weixindata['timestamp'] = time();
        $weixindata['nonceStr'] = $this->createNonceStr();
        //獲取簽名
        $weixindata['signature'] = $this->signature($weixindata['nonceStr'],$weixindata['timestamp'],$url);
        Log::info($weixindata);
        Log::info('總傳前臺');
        return $weixindata;


    }
    //獲取access_token
    public function accessToken()
    {

        $access_token =Redis::get("weixin_access_token");//存入redis,這裏要結合自己的項目,對redis或者memcahe進行設置
        if(!$access_token){
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->secret;
            $data = json_decode($this->httpGet($url),true);
            if(isset($data['access_token']) && $data['access_token'] != ''){
                Redis::setex("weixin_access_token",7200,$data['access_token']);
                $access_token=$data['access_token'];
            }else{
                return false;
            }
        }
        return $access_token;
    }
    //用第一步拿到的access_token 採用http GET方式請求獲得jsapi_ticket
    public function jsapiTicket()
    {
        $jsapi_ticket =Redis::get("weixin_jsapi_ticket");
        if(!$jsapi_ticket){
            $access_token = $this->accessToken();
            if($access_token){
                $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi";
                $data = json_decode($this->httpGet($url),true);
                if(isset($data['errcode']) && $data['errcode']== 0){//請求成功
                    Redis::setex("weixin_jsapi_ticket",7200,$data['ticket']);
//                    $this->redis->set("weixin_jsapi_ticket",$data['ticket'],7200);
                    $jsapi_ticket=$data['ticket'];
                }else{
                    return false;
                }
            }else{
                return false;
            }
        }
        Log::info($jsapi_ticket);
        Log::info('jsapi_ticket');
        return $jsapi_ticket;
    }
    //獲取signature
    public function signature($nonceStr,$timestamp,$url)
    {
        $jsapi_ticket = $this->jsapiTicket();
        $signature = '';
        if($jsapi_ticket) {
            $string = "jsapi_ticket=$jsapi_ticket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
            $signature = sha1($string);//對string1進行sha1簽名,得到signature
        }else{
            return false;
        }
        return $signature;
    }
    public function createNonceStr() {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < 16; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }
    public function httpGet($url)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        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;
    }



}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章