后端微信授权登录步骤及方法
微信公众号开发文档链接:
链接: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html.
第一步:获取微信授权code
在这里我只讲后端的主要实现方式,前端负责把微信授权登录页面调起,获取code,实在需要理解,在上述链接中找到这一段,按步骤操作即可。这里获得的code主要是为了传给后端,后端要去校验和获取用户信息,code是必要的信息,可以说是前端需要传的唯一的参数
第二步:通过code换取网页授权access_token
这一步就需要我的后端要去操作了,我们拿到前端传过来的code,去请求微信的网址:https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code.,校验code的有效性,如果code有效,则可以获取access_token回来。
第三步:拉取用户信息(需scope为 snsapi_userinfo)
如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
请求方法
http:GET(请使用https协议)https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN.
这里的access_token和openid都是第二步的返回成功获取的
这样我们就可以获取到用户的信息去做注册或者登陆了
后端代码示例:
可能还是有很多人不懂具体怎么去编码哈,可以看看示例:
// A code block
var foo = 'bar';
/**
* 微信授权登陆
*/
public function vxLogin(UserRepository $userRepository)
{
try {
$rule = [
'code' => 'require',
];
$msg = [
'code.require' => 'Param error',
];
$validate = Validate::make($rule, $msg);
$result = $validate->check($this->request->post());
if (!$result) {
return api_format(self::PARAM_ERROR, $validate->getError());
}
$code = $this->request->post('code', '');
//微信获取access_token的地址
$getAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . Config::get('wechat.app_id') . "&secret="
. Config::get('wechat.app_secret') . "&code=" . $code . "&grant_type=authorization_code";
$str = HttpClient::get($getAccessTokenUrl);
//一般要转成数组去做处理
$params = json_decode($str, true);
if (isset($params['errcode'])) {
return api_format(4000, '授权失败');
}
//微信获取用户的信息地址
$getUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" . $params['access_token'] . "&openid=" . $params['openid'];
$strUser = HttpClient::get($getUserInfoUrl);
$userInfo = json_decode($strUser, true);
if (isset($userInfo['errcode'])) {
return api_format(4000, '获取用户信息失败');
}
//以下是自己针对自己的业务逻辑一些判断看是注册还是登陆步骤,可以不看
//根据wx的openid查找用户表的vx_open_id
$user = $userRepository->getUserByVxUnionId($params['unionid']);
if ($user) {
$sessionKey = get_session_key($user->id, $this->appId);
//会话token的key
$tokenValue = [
'id' => $user->id,
'open_id' => $user->open_id,
'union_id' => $user->union_id,
'name' => $user->name,
'invite_code' => $user->invite_code,
'avatar' => $user->avatar,
];
app('mycache')->set($sessionKey, json_encode($tokenValue), 864000 * 30);
$data = [
'token' => $sessionKey,
'id' => intval($user->id),
'expire' => 864000 * 30,
];
return api_format(self::OK, 'Success login', $data);
}
//微信注册失败
return api_format(self::VX_NO_REGISTER, 'Vx is not registered', $userInfo);
} catch (Exception $e) {
throw $e;
}
}