瀏覽代碼

修改bgu

chenbo 4 年之前
父節點
當前提交
3b9a6fb015
共有 1 個文件被更改,包括 51 次插入1 次删除
  1. 51 1
      lib/common/weixin_public.class.php

+ 51 - 1
lib/common/weixin_public.class.php

@@ -59,6 +59,47 @@ class weixin_public
         return json_decode($jsonInfo, true);
     }
 
+    private function getJsTicket($access_token)
+    {
+        $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi"; // 两小时有效
+
+        $jsonInfo = file_get_contents($url);
+        return json_decode($jsonInfo,true);
+    }
+
+    private 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;
+    }
+
+    private function getSignPackage($jsToken) {
+        // 注意 URL 一定要动态获取,不能 hardcode.
+        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
+        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
+
+        $nonceStr = self::createNonceStr();
+        $timestamp = time();
+        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
+        $string = "jsapi_ticket=$jsToken&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
+
+        $signature = sha1($string);
+
+        $signPackage = array(
+            "appId"     => $this->appid,
+            "nonceStr"  => $nonceStr,
+            "timestamp" => $timestamp,
+            "url"       => $url,
+            "signature" => $signature,
+            "rawString" => $string
+        );
+
+        return $signPackage;
+    }
+
     public function getAllInfo($code)
     {
         $reader = array();
@@ -93,8 +134,17 @@ class weixin_public
         $attr['subscribe_time'] = $rs['subscribe_time'];
         $reader = Reader::getInfoByOpenId($info['openid']);
         Reader::addOrUpdate($reader['id'], $attr);
+        $reader = Reader::getInfoByOpenId($info['openid']);
+
+        $jsTokenInfo = self::getJsTicket($baseTokenInfo['access_token']);
+        if (empty($jsTokenInfo['ticket'])) {
+            return $jsTokenInfo;
+        }
+
+        $signPackage = self::getSignPackage($jsTokenInfo['ticket']);
+        $reader['js_sign'] = $signPackage;
 
-        return Reader::getInfoByOpenId($info['openid']);
+        return $reader;
     }