Browse Source

获取js凭证

DESKTOP-2STQMTS\Administrator 2 years ago
parent
commit
bccb179c18

+ 12 - 0
app/Http/Controllers/Api/UserController.php

@@ -229,4 +229,16 @@ class UserController extends FrontController
             return $this->apiResponseError( '提交失败');
         }
     }
+
+
+    /**
+     * 获取JS签名信息
+     * @return \Illuminate\Http\JsonResponse
+     */
+    function getJsConfig()
+    {
+        $url = request()->input('url');
+        $ret = WeixinServer::creatServer()->getJsConfig($url);
+        return $this->apiResponseSuccess('获取信息成功', $ret);
+    }
 }

+ 88 - 0
app/Servers/WeChat/WeixinServer.php

@@ -2,6 +2,8 @@
 
 namespace App\Servers\WeChat;
 
+use App\Servers\Common\RedisDataServer;
+
 class WeixinServer
 {
 
@@ -126,4 +128,90 @@ class WeixinServer
         curl_close($ch);
         return $request;
     }
+
+
+    /**
+     * 获取js授权信息
+     * @return mixed
+     */
+    function getJsConfig($url = '')
+    {
+        $hash = '';
+        $chars = 'ABCDEFGHIJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz';
+        $max = strlen($chars) - 1;
+        for ($i = 0; $i < 16; $i++) {
+            $hash .= $chars[mt_rand(0, $max)];
+        }
+        $data['noncestr'] = $hash;
+        $data['jsapi_ticket'] = $this->getJsTicket();
+        $data['timestamp'] = time();
+        if (empty($url)) {
+            $data['url'] = $this->getServerUrl();
+        } else {
+            $data['url'] = $url;
+        }
+        ksort($data);
+        $str = '';
+        foreach ($data as $key => $val) {
+            $str .= '&';
+            $str .= $key . '=' . $val;
+        }
+        $str = mb_substr($str, 1);
+        $data['appid'] = $this->appid;
+        $data['signature'] = sha1($str);
+        unset($data['jsapi_ticket']);
+        return $data;
+    }
+
+    /**
+     * 获取 access_token
+     * @return bool
+     */
+    protected function getAccessToken($type = 1)
+    {
+        $key = 'vouchername';
+        $appId = $this->appid;
+        $appsecret = $this->appsecret;
+
+        $data = RedisDataServer::creatServer()->getData($key, 'json');
+        if (empty($data) || $data['endtime'] < time() || true) {
+            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appId}&secret={$appsecret}";
+            $result = $this->sendRequest($url);
+            $result = json_decode($result, true);
+//            $bey = Cache::set('vouchername', array('access_token' => $result['access_token'], 'endtime' => time() + 7000), 7000);
+            if ( isset($result['access_token'])) {
+                RedisDataServer::creatServer()->setData($key, array('access_token' => $result['access_token'], 'endtime' => time() + 1800), 'json',1800);
+                return $result['access_token'];
+            } else {
+                return false;
+            }
+        } else {
+            return $data['access_token'];
+        }
+    }
+
+    /**
+     * 获取Js调用凭证
+     * @return bool
+     */
+    function getJsTicket()
+    {
+//        $data = Cache::get('js_ticket');
+        $data = RedisDataServer::creatServer()->getData('js_ticket', 'json');
+        if (empty($data) || $data['endtime'] < time()) {
+            $access_token = $this->getAccessToken();
+            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$access_token}&type=jsapi";
+            $result = $this->sendRequest($url);
+            $result = json_decode($result, true);
+            if ($result['errcode'] == 0) {
+                //file_put_contents($this->js_ticket,serialize(array('access_token'=>$result['access_token'],'endtime'=>time()+7000)));
+//                Cache::set('js_ticket', array('access_token' => $result['ticket'], 'endtime' => time() + 7000), 7000);
+                RedisDataServer::creatServer()->setData('js_ticket', array('access_token' => $result['ticket'], 'endtime' => time() + 7000), 'json',7000);
+                return $result['ticket'];
+            }
+            return false;
+        } else {
+            return $data['access_token'];
+        }
+    }
 }

+ 2 - 0
routes/api/user.php

@@ -17,4 +17,6 @@ Route::group(['domain' => env('APP_HOST_WEB'), 'prefix' => 'user'],function (){
     Route::match(['get','post'],'apply', 'UserController@setApply')->name('user.apply');//申请成为推广人
     Route::match(['get','post'],'sign_up', 'UserController@setSignUp')->name('user.sign_up');//报名
 
+    Route::match(['get','post'],'js_key', 'UserController@getJsConfig')->name('user.js_key');//获取微信JS签名信息
+
 });