// +---------------------------------------------------------------------- namespace Modules\Wechat\Services; use Illuminate\Support\Facades\Config; use EasyWeChat\OfficialAccount\Application; use EasyWeChat\MiniApp\Application as MiniApp; use Modules\Wechat\Models\MemberSocial; use Illuminate\Support\Str; class OauthService { /** * @title 微信授权登录 * * @param [type] $request * @return void */ public function oauth($request){ $config = Config::get('wechat.wx'); $url = $request->fullUrl(); $app = new Application($config); try { //获取openid $oauth = $app->getOAuth(); $redirect = $oauth->scopes(['snsapi_userinfo'])->redirect($url); return $redirect; } catch (\Exception $e) { throw new \Exception($e->getMessage(), 100); } } /** * @title 微信用户登录 * * @param [type] $code * @return void */ public function wechatLogin($code){ $config = Config::get('wechat.wx'); $app = new Application($config); try { //获取openid $oauth = $app->getOAuth(); $user = $oauth->userFromCode($code); $userinfo = $user->toArray(); $social = MemberSocial::where('openid', '=', $userinfo['id'])->where('type', '=', 'wechat')->first(); if(!$social){ $data = [ 'type' => 'wechat', 'member_id' => 0, 'openid' => isset($userinfo['id']) ? $userinfo['id'] : '', 'nickname' => isset($userinfo['nickname']) ? $userinfo['nickname'] : '', 'avatar' => isset($userinfo['avatar']) ? $userinfo['avatar'] : '', 'gender' => isset($userinfo['gender']) ? $userinfo['gender'] : '', ]; $social = MemberSocial::create($data); } return $social; } catch (\Exception $e) { throw new \Exception($e->getMessage(), 100); } } public function miniappLogin($request){ $config = Config::get('wechat.miniapp'); $app = new MiniApp($config); try { //获取openid $utils = $app->getUtils(); $session = $utils->codeToSession($request->input('code')); $social = MemberSocial::where('openid', '=', $session['openid'])->where('type', '=', 'miniapp')->first(); if(!$social){ if($request->filled('iv') && $request->filled('encryptedData')){ $userinfo = $utils->decryptSession($session['session_key'], $request->input('iv'), $request->input('encryptedData')); }else{ $userinfo = ['nickName' => '微信用户' . Str::substr($session['openid'], -7), 'avatarUrl' => '', 'gender' => 1]; } $data = [ 'type' => 'miniapp', 'member_id' => 0, 'openid' => isset($session['openid']) ? $session['openid'] : '', 'unionid' => isset($session['unionid']) ? $session['unionid'] : '', 'nickname' => $userinfo['nickName'] ? $userinfo['nickName'] : '', 'avatar' => isset($userinfo['avatarUrl']) ? $userinfo['avatarUrl'] : '', 'gender' => isset($userinfo['gender']) ? $userinfo['gender'] : '', ]; $social = MemberSocial::create($data); } return $social; } catch (\Exception $e) { throw new \Exception($e->getMessage(), 100); } } /** * @title 获取微信JS-SDK配置 * * @param [type] $request * @return void */ public function getJsSdk($request){ $config = Config::get('wechat.wx'); $url = $request->input('url', ''); $url = $url ? urldecode($url) : $request->url(true); $app = new Application($config); try { $utils = $app->getUtils(); $config = $utils->buildJsSdkConfig( url: $url, jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData', 'scanQRCode', 'closeWindow', 'hideAllNonBaseMenuItem', 'showAllNonBaseMenuItem', 'openAddress'], openTagList: [], debug: false, ); return $config; } catch (\Exception $e) { throw new \Exception($e->getMessage(), 100); } } /** * @title 微信公众号服务 * * @return void */ public function WechatServe(){ $config = Config::get('wechat.wx'); $app = new Application($config); $server = $app->getServer(); $server->with(function($message, \Closure $next){ if ($message->MsgType === 'text') { return [ 'MsgType' => 'text', 'Content' => '暂未开通自动回复功能!' ]; } return $next($message); }); $server->addEventListener('subscribe', function() { return '欢迎!!'; }); $server->addEventListener('unsubscribe', function() { return '再见~'; }); return $server->serve(); } /** * @title 获取微信用户信息 * * @param [type] $openid * @return void */ public function getWechatInfo($openid){ $config = Config::get('wechat.wx'); $app = new Application($config); $api = $app->getClient(); $userinfo = $api->post('cgi-bin/user/info', [ 'json' => [ 'openid' => $openid, 'lang' => 'zh_CN', ] ]); return $userinfo; } }