mirror of
https://github.com/w7corp/easywechat.git
synced 2025-01-22 03:22:10 +00:00
Page:
网页授权
28
网页授权
Zerozh edited this page 2016-01-08 01:29:48 +08:00
通常的网页授权逻辑应该是:
-
检查你自己的 Session 中是否有登录信息,如果有则不跳授权页面
-
如果 Session 中没有登录信息,则跳转到授权页并获取用户信息(
$auth->authorize()
一个方法全搞定) -
把拿到的用户信息存到 Session 中
- 有 SESSION -> 最终业务界面
- 没有 SESSION -> 用户最终业务界面 -> 授权页 完成授权存 SESSION -> 跳转到你的最终业务界面
流程图:
user -> /foo/bar (business page)
┌────────────────────────┐
│ │ No
│ $_SESSION['openid']? │───────┐
│ │ │
└────────────────────────┘ │
│ │
│ ┌────────────────┼────────WeChat Middleware───────────────┐
│ │ │ │
│ │ ├───────────────redirect back with code──┼─────────────┐
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────┐ │ ┌─────────────────────┐
│ │ │ │ │ │ │
│ │ │ URL has code? │───No────────────────────────┼─▶│ WeChat OAuth server │
│ │ │ │ redirect to WeChat │ │ │
│ │ └─────────────────────┘ │ └─────────────────────┘
│ │ │ │
│ │ │ │
│ │ Yes │
│ │ │ │
Yes │ ▼ │
│ │ ┌─────────────────────────────┐ │
│ │ │ │ │
│ │ │ get access_token && openid │ │
│ │ │ │ │
│ │ └─────────────────────────────┘ ┌─ ── ── ── ── ── ─┐ │
│ │ │ │ │
│ │ ├ ─optional ─ ─ ─ ▶ get user detail │ │
│ │ │ │ │ │
│ │ │ └ ── ── ── ── ── ── │
│ │ │ │ │
│ │ │ ▼ │
│ │ │ ┌─ ── ── ── ── ── ─┐ │
│ │ │ │ │
│ │ ▼ store user to DB.│ │
│ │┌───────────────────────────────┐ │ │ │
│ ││ │ └ ── ── ── ── ── ── │
│ ││ $_SESSION['openid'] = $openid │ │
│ ││ │ │
│ │└───────────────────────────────┘ │
│ │ │ │
│ └────────────────┼────────────────────────────────────────┘
│ │
│ │
├───────────────────┘
│ redirect to target page.
│
│
▼
┌────────────────────────┐
│ │
│ display /foo/bar │
│ │
└────────────────────────┘
友情提示
授权逻辑不要写在业务页!!! 不然你分享出去的链接会带你自己的 code
出去,这样就会判断不了是否已经授权。
<?php
use Overtrue\Wechat\Auth;
$appId = 'wx3cf0f39249eb0e60';
$secret = 'f1c242f4f28f735d4687abb469072a29';
$auth = new Auth($appId, $secret);
授权并返回用户
$auth->authorize($to = null, $scope = 'snsapi_userinfo', $state = 'STATE')
内部逻辑:
1. 非微信回调,会自动跳转到微信授权页,并且以当前页(`$to` 为 `null` 时取当前页)作为回调页
2. 如果已经授权返回用户对象,`$scope` 为 `snsapi_base` 时用户对象只有 `openid` 一个属性
// 请一定要自己存储用户的登录信息,不要每次都授权
session_start();
if (empty($_SESSION['logged_user'])) {
$user = $auth->authorize(); // 返回用户 Bag
$_SESSION['logged_user'] = $user->all();
// 跳转到其它授权才能访问的页面
} else {
$user = $_SESSION['logged_user'];
}
var_dump($user['openid']);
如果你不想用默认的逻辑,你也可以自己使用下面单独的方法来完成授权的操作:
其它单独使用的方法
-
生成授权链接
// 生成并返回 $auth->url($to, $scope, $state = 'STATE'); // 直接跳转 $auth->redirect($to, $scope, $state = 'STATE'); // 直接跳转
注意:
- 上面的 $scope 与 $state 通常都不用传
url
与redirect
参数一致- $scope 可选为:
- snsapi_base 只获取用户
openid
- snsapi_userinfo 获取用户账号信息
- snsapi_base 只获取用户
example:
// 只取 `openid`
$url = $auth->url('http://overtrue.me', 'snsapi_base');
// 需要拉取用户信息
$url = $auth->url('http://overtrue.me', 'snsapi_userinfo');
-
获取已授权用户
$auth->user();
-
获取授权许可信息
在每一次使用 code 得到 access_token 后,以下信息会存储:
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE", "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }
你可以用以下方式获取,用来存储到你的数据库个人信息中
$auth->access_token;// 获取本次授权后的 access_token $auth->refresh_token;// 获取本次授权后的 refresh_token // ...
-
检查 access_token 是否有效
$auth->accessTokenIsValid($accessToken, $openid); // 返回 boolean
-
使用 refresh_token 刷新 access_token
$auth->refresh($refreshToken); // 注意这里不是access_token
-
使用 access_token 获取用户信息
$auth->getUser($openId, $accessToken);
更多关于微信网页授权 API 请参考: http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
中文版 English
目录
English 中文版
Table of Contents
Laravel 5 版: overtrue/laravel-wechat
可能由于微信的接口调整导致某些接口不能正常使用,请及时给我反馈,谢谢!https://github.com/overtrue/wechat/issues