微信开放平台————获取access_token(2)

时间:2024-03-14 19:16:39

 

第4步 收到code+state

扫码确认登录之后,就会回调到重定向的地址(获得code和state)

http://xdclasstest2.ngrok.xiaomiqiu.cn/api/v1/wechat/user/callback?code=061vNjP70F1KQE1poXO70Q7bP70vNjPE&state=xdclass.net

 

微信开放平台————获取access_token(2)

 

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);

}

 

微信开放平台————获取access_token(2)

 

 

以上文档:

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=a481b68bccf8fa4f2b4a6e1c7b5281338eb9c60e&lang=zh_CN

第二步:通过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(2)

返回说明

正确的返回:

{ 
"access_token":"ACCESS_TOKEN", 
"expires_in":7200, 
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID", 
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

微信开放平台————获取access_token(2)

错误返回样例:

{"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"}