第4步 收到code+state
扫码确认登录之后,就会回调到重定向的地址(获得code和state)
5.通过code+appid+appsecret向微信开放平台请求access_token(在service里写一个方法)
先配置一个获取access_token的连接(WeChatConfig) /** * 微信开放平台access_token连接 * %s替换 */ private final static String OPEN_ACCESS_TOKEN_URL="https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
@Autowired WeChatConfig weChatConfig; @Override public User saveWeChatUser(String code) { /** * * 功能描述: 获取access_token * * @param: * @return: * @auther: LiGang * @date: 2019/2/23 22:16 */ String accessTokenUrl=String.format(WeChatConfig.getOpenAccessTokenUrl(),weChatConfig.getOpenAppid(),weChatConfig.getOpenAppsecret(),code); Map<String, Object> baseMap = HttpUtils.doGet(accessTokenUrl); if (baseMap==null|| baseMap.isEmpty()){ return null; } String access_token = (String) baseMap.get("access_token"); String openid = (String) baseMap.get("openid"); return null; }
编写接口
@Autowired WxUserService wxUserService;
................
@GetMapping("/user/callback")//携带code返回后回调到这 public void weChatCallback(String code, String state, HttpServletResponse response){ System.out.println("code"+code); System.out.println("stste"+state); wxUserService.saveWeChatUser(code); }
以上文档:
第二步:通过code获取access_token(service)
通过code获取access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
返回说明
正确的返回:
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE", "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }
错误返回样例:
{"errcode":40029,"errmsg":"invalid code"}
/没有写
刷新access_token有效期
access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:
1. 若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
2. 若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。
refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。
请求方法
获取第一步的code后,请求以下链接进行refresh_token:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 应用唯一标识 |
grant_type | 是 | 填refresh_token |
refresh_token | 是 | 填写通过access_token获取到的refresh_token参数 |
返回说明
正确的返回:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
参数说明
参数 | 说明 |
---|---|
access_token | 接口调用凭证 |
expires_in | access_token接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新access_token |
openid | 授权用户唯一标识 |
scope | 用户授权的作用域,使用逗号(,)分隔 |
错误返回样例:
{"errcode":40030,"errmsg":"invalid refresh_token"}