From 512dc2d66d06ba911d1c8f278908504d4a08627c Mon Sep 17 00:00:00 2001 From: wanghongjun <1445693971@qq,com> Date: Wed, 7 Aug 2024 16:32:37 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=BE=AE=E4=BF=A1JsSDK?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/common.php | 18 ++++ app/controller/wechat/Wechat.php | 10 ++ app/service/wechat/WechatService.php | 131 ++++++++++++--------------- route/wechatRoute.php | 1 + 4 files changed, 87 insertions(+), 73 deletions(-) diff --git a/app/common.php b/app/common.php index 57cb6d8..182d22a 100644 --- a/app/common.php +++ b/app/common.php @@ -1,2 +1,20 @@ buildFailed(ReturnCode::UPDATE_FAILED,$e->getMessage()); } } + + public function getJsSdkData() + { + try { + $WechatService = new WechatService(); + return $this->buildSuccess($WechatService->getJsSdkSignature()); + } catch (\Exception $e) { + return $this->buildFailed(ReturnCode::INVALID,$e->getMessage()); + } + } } \ No newline at end of file diff --git a/app/service/wechat/WechatService.php b/app/service/wechat/WechatService.php index 770c260..2783975 100644 --- a/app/service/wechat/WechatService.php +++ b/app/service/wechat/WechatService.php @@ -1,16 +1,16 @@ token = $token; } - $this->appid = env('wechat.appid'); + $this->appid = env('wechat.appid'); $this->appsecret = env('wechat.appsecret'); $this->redis = new \Redis(); $this->redis->connect('127.0.0.1', 6379); } - public function wechatChekToken($signature, $timestamp, $nonce){ + public function wechatChekToken($signature, $timestamp, $nonce): bool + { $data = array($this->token, $timestamp, $nonce); sort($data, SORT_STRING); - $str = sha1(implode( $data )); + $str = sha1(implode($data)); - if($str == $signature){ + if ($str == $signature) { return true; } return false; @@ -45,95 +46,79 @@ class WechatService extends BaseService /** * 获取accessToken * @return mixed|\Redis|string - * @throws \fast\FuncException + * @throws FuncException */ - public function getAccessToken(){ + public function getAccessToken(): string + { $access_token = $this->redis->get('wechat_access_token'); - if($access_token){ + if ($access_token) { return $access_token; } - $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appid}&secret={$this->appsecret}"; + $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appid}&secret={$this->appsecret}"; $http = new Http(); - $res = $http::get($url); - if($res['code'] != 200){ - throw new \fast\FuncException($res['msg']); + $res = $http::get($url); + if ($res['code'] != 200) { + throw new FuncException($res['msg']); } $data = json_decode($res['data'], true); - if(isset($data['errcode']) && $data['errcode'] != 0){ - throw new \fast\FuncException($data['errmsg']); + if (isset($data['errcode']) && $data['errcode'] != 0) { + throw new FuncException($data['errmsg']); } $this->redis->set('wechat_access_token', $data['access_token'], 7200); return $data['access_token']; } + /** + * + * @return array + * @throws FuncException + */ + public function getJsSdkSignature(): array + { + $timestamp = time(); - public function wechatEvent(){ + $nonceStr = generate_random_string(16); - $data = file_get_contents("php://input"); - $obj = simplexml_load_string($data,"SimpleXMLElement", LIBXML_NOCDATA); - $this->log->info('消息', $obj->FromUserName); + $jsapi_ticket = $this->getJsApiTicket(); - $event = $obj->MsgType; - switch ($event){ - case 'event': - $event = $obj->Event.'_'.$obj->MsgType; - $this->$event($obj); - break; - } + $ascllArr = [ + 'noncestr=' . $nonceStr, + 'jsapi_ticket=' . $jsapi_ticket, + 'timestamp=' . $timestamp, + 'url=' . 'http://mp.weixin.qq.com?params=value', + ]; + sort($ascllArr); - } + $signature = sha1(implode('&', $ascllArr)); + return [ + 'appId' => env('wechat.appid'), + 'timestamp' => $timestamp, + 'nonceStr' => $nonceStr, + 'signature' => $signature, + ]; + } - public function subscribe_event($obj){ - $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$this->getAccessToken()."&openid=".$obj->FromUserName."&lang=zh_CN"; - $http = new Http(); - $res = $http::get($url); - if($res['code'] != 200){ - throw new \fast\FuncException($res['msg']); - } - $data = json_decode($res['data'], true); - if(isset($data['errcode']) && $data['errcode'] != 0){ - throw new \fast\FuncException($data['errmsg']); - } + /** + * + * @throws FuncException + */ + protected function getJsApiTicket() + { - $user = WechatUser::where('openid', $data['openid'])->where('unionid', $data['unionid'])->where('is_deleted', 0)->find(); - if($user){ - $user->subscribe = 1; - $user->subscribe_time = date('Y-m-d H:i:s', $data['subscribe_time']); - $user->save(); - return; - } + $access_token = $this->getAccessToken(); - $user = [ - 'nickname' => $data['nickname'], - 'headimgurl' => $data['headimgurl'], - 'openid' => $data['openid'], - 'unionid' => $data['unionid'], - 'subscribe_time' => date('Y-m-d H:i:s', $data['subscribe_time']), - 'subscribe' => 1, - ]; - (new WechatUser())->save($user); - } + $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' . $access_token . '&type=jsapi'; + $res = Http::get($url); - public function unsubscribe_event($obj){ - $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$this->getAccessToken()."&openid=".$obj->FromUserName."&lang=zh_CN"; - $http = new Http(); - $res = $http::get($url); - if($res['code'] != 200){ - throw new \fast\FuncException($res['msg']); - } - $data = json_decode($res['data'], true); - if(isset($data['errcode']) && $data['errcode'] != 0){ - throw new \fast\FuncException($data['errmsg']); + if ($res['code'] != 200) { + throw new FuncException($res['msg']); } - $user = WechatUser::where('openid', $data['openid'])->where('unionid', $data['unionid'])->where('is_deleted', 0)->find(); - if($user){ - $user->subscribe = 0; - $user->save(); - } + $data = json_decode($res['data'],true); + return $data['ticket']; } } diff --git a/route/wechatRoute.php b/route/wechatRoute.php index 93714d8..a39d343 100644 --- a/route/wechatRoute.php +++ b/route/wechatRoute.php @@ -15,5 +15,6 @@ Route::group('wechat', function() { Route::rule('Wechat/index', 'wechat.Wechat/index', 'get'); Route::rule('Wechat/savePuCode', 'wechat.Wechat/savePuCode', 'post')->middleware(WechatAuth::class); Route::rule('Wechat/sendSms', 'wechat.Wechat/sendSms', 'post')->middleware(WechatAuth::class); + Route::rule('Wechat/getJsSdkData', 'wechat.Wechat/getJsSdkData', 'get')->middleware(WechatAuth::class); });