当前位置: 首页 > 后端技术 > PHP

Laravel集成微信用户登录&&绑定

时间:2023-03-30 02:06:55 PHP

最近主要从事微信和支付宝平台的对接开发。本文介绍基于后端层面的微信登录绑定实现。(1.)申请微信开放平台首先要到微信开发中心https://open.weixin.qq.com,创建一个账号,然后创建自己的手机或网站应用。创建完成后,需要腾讯审核。整个过程需要1-3天,基本上1天左右就可以完成,审核通过如下图。(2.)封装微信相关接口微信移动应用开发文档:https://developers.weixin.qq...审核通过后,需要封装微信授权和可获取信息的接口。封装微信授权&&获取用户信息微信授权接口:https://api.weixin.qq.com/sns...需要填写的参数如下:参数是否必须注明appid为微信唯一标识申请,并在微信开放平台提交申请审核通过后得到的secret即为申请密钥AppSecret。微信开放平台提交申请审核后获得的代码,填写第一步获得的代码。参数grant_type是填写authorization_code。下面通过我们的PHP代码实现:config=['wechat_app'=>['appid'=>env('WECHAT_APPID'),//批准的APPID'secret'=>env('WECHAT_SECRET'),//申请APPSECRET详情见上],'time_out'=>5,];$this->client=newClient(['time_out'=>$this->config['time_out'],]);}/***获取微信用户access_token**@param[String]$code*@returnArray*/publicfunctionaccessToken($code){$accessTokenUrl='https://api.weixin.qq.com/sns/oauth2/access_token';$response=$this->client->request('GET',$accessTokenUrl,['query'=>['grant_type'=>'authorization_code','code'=>$code,'appid'=>Arr::get($this->config,'wechat_app.appid'),'secret'=>Arr::get($this->config,'wechat_app.secret'),],]);$result=$response->getbody()->getContents();返回空($结果)?空:json_decode($结果,真);}/***微信用户信息**@param[String]$accessToken*@param[String]$openId*@returnArray*/publicfunctionuserInfo($accessToken,$openId){$userInfoUrl='https://api.weixin.qq.com/sns/userinfo';$response=$this->client->request('GET',$userInfoUrl,['query'=>['access_token'=>$accessToken,'openid'=>$openId,'lang'=>'zh_CN',],]);$result=$response->getbody()->getContents();返回空($结果)?null:json_decode($结果,true);}}上面的accessToken方法主要是实现用户授权,验证的code参数由客户端传递。成功获取收款用户的授权信息后,可以调用userInfo方法根据用户的OPENID用户信息查询相关信息,包括用户的昵称、头像、性别等。具体客户端开发文档请查看参考这篇文章:https://developers.weixin.qq....上面使用的HttpClient是第三方扩展包GuzzleHttp,是一个PHPHTTP客户端,可以轻松发送HTTP请求,轻松集成Web服务.我们可以通过composer一键安装:composerrequireguzzlehttp/guzzle(3),完善用户微信授权登录完成以上封装操作后,我们就开始将微信连接到自己的系统中,关联到用户。下面是微信访问时序图。如果用户想使用微信登录,客户端会先通过客户端调用微信请求登录第三方应用,然后微信会询问用户是否授权XX应用成功。授权成功后,客户端会得到一个授权码:code,然后客户端携带这个code请求我们的客户端API进行授权绑定。授权成功后会获取授权用户OPENID(应用下的唯一标识),否则会抛出异常信息提示用户。创建一个OAuth表来存储用户授权信息。创建o_auths表存储用户授权信息,设计oauth_type字段使其成为多态模型,方便以后访问微博、支付宝、QQ访问等。Schema::create('o_auths',function(Blueprint$table){$table->increments('id');$table->unsignedInteger('user_id')->index()->comment('userID');$table->morphs('o_auth');$table->json('data')->nullable()->comment('授权信息');$table->timestamps();});完善用户权限绑定建立o_auths表后,开始完善用户权限绑定的逻辑:functionwechat(User$user,$code){$utils=newWechatAppUtils;//获取微信token$accessTokens=$utils->accessToken($code);throw_if(!Arr::has($accessTokens,['unionid','openid']),Exception::class,'授权失败,请稍后再试!');//建立oauth关联$oAuth=OAuth::firstOrNew(['oauth_type'=>'wechat','oauth_id'=>$accessTokens['openid']]);throw_if(isset($oAuth->id),Exception::class,'微信已绑定,请直接登录!');$oAuth->user_id=$user->id;$oAuth->data=Arr::only($accessTokens,['openid','refresh_token']);$oAuth->保存();return$oAuth;}首先会通过客户端传递过来的Code获取当前用户授权,然后检查用户是否已经授权。授权信息返回客户端,完善微信登录。提高用户权限后,登录非常容易。您只需简单查询授权记录即可。如果存在,则返回对应的绑定用户。否则,将抛出异常信息提示用户。publicfunctionsignIn($user,$code){$utils=newWechatAppUtils;//获取微信token$accessTokens=$utils->accessToken($code);throw_if(!Arr::has($accessTokens,['unionid','openid']),Exception::class,'授权失败,请稍后再试!');$oauth=$this->getUserOauth($user,'微信');throw_if(is_null($oauth),UserException::class,'授权失败,账号未绑定!');返回$oauth;}publicfunctiongetUserOauth(User$user,$oAuthType){returnOAuth::where(['oauth_type'=>$oAuthType,'user_id'=>$user->id])->first();}