概述
这是一个类似平时的C-S模型,但在这模型中有一个问题,服务器能够获取到客户端的客户唯一标识,在微信中应该就是微信号。应该是出于保护用户隐私的目的,微信选择了使用openid
来代替微信号作为唯一标识,同时,openid
对于不同的公众号也是不同的,就是说,openid
具有以下特征:
- 同一个公众号的不同用户
openid
不同(废话) - 同一个用户对不同公众号
openid
不同
那么问题来了,公众号小程序是怎么知道当前访问的用户是哪个用户呢?
除此之外,可能是为了防止伪造身份,微信公众号/小程序除了appid外还有一个secret,官方文档中称该参数安全性极高,不能放置于客户端,那么就意味着请求必须从服务端发送
这时就需要微信服务器作为中间件来做授权。
以下简称:用户->客户端 (Client),公众号小程序->服务端 (Sever),微信=微信服务器 (WeChat)
获取 code
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 公众号的唯一标识 |
redirect_uri | 是 | 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理 |
response_type | 是 | 返回类型,请填写code |
scope | 是 | 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 ) |
state | 否 | 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节 |
#wechat_redirect | 是 | 无论直接打开还是做页面302重定向时候,必须带此参数 |
获取 openId
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 公众号的唯一标识 |
secret | 是 | 公众号的appsecret |
code | 是 | 填写第一步获取的code参数 |
grant_type | 是 | 填写为authorization_code |