微信文档:关于网页授权access_token和普通access_token的区别
(1)微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;
(2)其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。
1、先在公众号里配置好授权域名。
“开发 - 接口权限 - 网页服务 - 网页授权 获取用户基本信息”的配置选项中,修改授权回调域名。
2、前端向微信发送特定格式的请求:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
让用户同意授权,获取code。这个请求里有appid、redirect_uri、response_type、scope、state参数,其中,redirect_uri就是真正要访问的后端接口。
同意授权后,微信会重定向到后端接口,并加上code和state参数。
code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
(scope参数有两个值:snsapi_base不弹出授权页面直接跳转,只能获取openid;snsapi_userinfo会弹出授权页面,可通过openid拿到用户基本信息。)
微信文档:关于网页授权的两种scope的区别说明
(1)以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
(2)以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注公众号,就可在授权后获取该用户的基本信息。
3、后端接口获取到code参数,向微信发送另一特定请求:
获取网页授权access_token、openid等授权信息,再进行自己的业务。(此处的网页授权access_token与基础支持中的access_token不同。)
注意后端接口需要有code和state入参,state可用于传自己的参数,也可空着,但必须有。
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 |
返回说明
正确时返回的JSON数据包如下:
{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
参数 | 描述 |
---|---|
access_token | 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 |
expires_in | access_token接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新access_token |
openid | 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID |
scope | 用户授权的作用域,使用逗号(,)分隔 |
错误时微信会返回JSON数据包如下(示例为Code无效错误):
{"errcode":40029,"errmsg":"invalid code"}
4、后端若要进一步查询用户基本信息,还需向微信发送另一特定格式请求。(需scope为 snsapi_userinfo)
GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
1、先在公众号里配置好JS安全域名,和网页授权第一步在同一个位置配置。
2、获取基础支持access_token,缓存好,注意在公众号里配置IP白名单!!
https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
grant_type | 是 | 获取access_token填写client_credential |
appid | 是 | 第三方用户唯一凭证 |
secret | 是 | 第三方用户唯一凭证密钥,即appsecret |
正常情况微信返回下述JSON数据包:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
access_token | 获取到的凭证 |
expires_in | 凭证有效时间,单位:秒 |
错误时微信会返回错误码等JSON信息:
{"errcode":40013,"errmsg":"invalid appid"}
返回码说明:
返回码 | 说明 |
---|---|
-1 | 系统繁忙,此时请开发者稍候再试 |
0 | 请求成功 |
40001 | AppSecret错误或者AppSecret不属于这个公众号,请开发者确认AppSecret的正确性 |
40002 | 请确保grant_type字段值为client_credential |
40164 | 调用接口的IP地址不在白名单中,请在接口IP白名单中进行设置。(小程序及小游戏调用不要求IP地址在白名单内。) |
3、用access_token获取jsapi_ticket,缓存好。
微信文档:jsapi_ticket是公众号用于调用微信JS接口的临时票据,正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。
https请求方式: GET
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
成功返回如下JSON:
{
"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200
}
4、使用SHA1加密算法生成签名signature=sha1(string1),string1字为 jsapi_ticket=...&noncestr=...×tamp=...&url=...键值对形式,这4个参数是按字段名的ASCII码从小到大排序,均为小写,noncestr是后端自己随机生成的字符串,url不转义,不包含#及后面的部分。
(注意返回给前端的config中,包括:appid、timestamp、nonceStr、signature,noncestr的key一定要写成nonceStr,前端传进接口的url要encode,在后端decode后再计算签名)