在第三方应用上使用微信登录已经是很常见的了,因为本身微信用户基数大,使用微信登录来拓展用户群,这篇文章是本人在参与公司app开发的时候,授权登录这一块的总结内容。

应用微信授权流程
上面这张图就是第三方应用授权微信登录的整个流程示意图,以下将对流程进行详解。
- 用户在第三方app的微信登录按钮点击后,转跳到微信,弹出微信用户授权页面,如果用户允许,这时候就获取到微信返回的临时票据(code),这个code是让服务端换取到access_token。
- 利用access_token和appid与appsecret获取到access_token,包括有用户的openid,如果有多个应用绑定在同一开放平台将会有unionid。
获取到accesstoken内容 - 利用第二步的access_token和openid来获取到用户详细信息,信息格式如下图。
获取用户信息内容
说明:WechatController调用WeChatTool封装的方法,WeChatTool加载wechat配置文件,发起请求。
下面是使用ThinkPHP6进行用户授权登录的代码块:
- route/api/route.php
<?php
use think\facade\Route;
Route::post('wechat_callback','operation.WeChatController/oauth_callback');
- WeChatTool.php
<?php
namespace app\models\operation;
use GuzzleHttp\Client;
class WeChatTool{
protected $config;
public function __construct()
{
//引入ThinkPHP下config的wechat.php配置文件
$this->config = config('wechat');
}
// 属于移动应用掉起登录方法
/**
* 使用开放平台信息获取到token
* @param $code app返回的code
* @return bool|string
*/
public function get_token($code){
if(is_array($this->config)){
$configs = $this->config;
$result = $this->start_get_request($configs['get_token_url'],[
'appid'=>$configs['app_id'],
'secret'=>$configs['app_secret'],
'code'=>$code,
'grant_type'=>'authorization_code'
]);
if(false == $result){
return false;
}
return $result;
}
}
/**
* 根据accesstoken和openid获取到授权登录的用户信息
* @param $access_token
* @param $openid
* @return bool|string
*/
public function get_user_info($access_token,$openid){
$result = $this->start_get_request($this->config['get_user_info_url'],[
'access_token'=>$access_token,
'openid'=>$openid
]);
if(false == $result){
return false;
}
return $result;
}
// 工具类方法
/**
* 发起Get请求并且返回结果
* @param $uri 请求地址
* @param $query 请求参数
* @return string
*/
public function start_get_request($uri,$query){
$body = (new Client())->request('GET',$uri,[
'query'=>$query,
'timeout'=>3.14
]);
if($body->getStatusCode()!=200){
return false;
}
return json_decode($body->getBody(),true,512,JSON_BIGINT_AS_STRING);
}
}
- wechat.php
<?php
// 移动应用app调用登录配置
return [
// 移动应用
'app_id'=>'wx5834b39894c*****',
'app_secret'=>'f5af06ffd4fd217e78b4948fd9b*****',
'get_token_url'=>'https://api.weixin.qq.com/sns/oauth2/access_token',// 获取token基础url
'get_user_info_url'=>'https://api.weixin.qq.com/sns/userinfo',//获取到用户信息
];
- WeChatController.php
<?php
namespace app\api\controller\operation;
use app\models\operation\WeChatTool;
class WeChatController{
public function oauth_callback(Request $request){
$wechatTool = new WeChatTool();
$wechat_token_callback = $wechatTool->get_token($request->param('code'));
if(false == $wechat_token_callback || isset($wechat_token_callback['errcode'])){
return app('json')->fail('请求出错,请重试');
}
$wechat_user_callback = $wechatTool->get_user_info($wechat_token_callback['access_token'],$wechat_token_callback['openid']);
if(false == $wechat_user_callback || isset($wechat_user_callback['errcode'])){
return app('json')->fail('请求出错,请重试');
// 其余业务代码内容忽略
}
}

