首先,这里有个坑,微信开放平台和微信公众平台不是一回事。wap端登陆属于微信公众号的功能,而网页端第三方登陆才是微信开放平台的功能。
附上微信公众平台的开发者文档地址:添加链接描述。
首先要配置好微信公众号,这里还要区分一下订阅号和服务号。
订阅号:每个月可以发的消息比较多,但是没有第三方登陆和支付的功能。
服务号:可以有登陆支付等功能。
配置服务号的时候要仔细看文档,在配置token验证地址的时候,需要在自己配置的路径下面放置一个微信提供的txt文件,微信在检测到这个地址的文件是正确的时候,才会成功配置。并且还要写一个接口,微信会访问这个接口,然后接收返回值,如果正确,才能成功配置。 搞不懂微信这么做的理由。
配置好之后,可以按着文档进行操作了。
第一步带着回调地址跳转到微信授权页面,跳转代码:
response.sendRedirect(WeChatConfig.CONNECT);
public final static String CONNECT = "https://open.weixin.qq.com/connect/oauth2/authorize?"
+ "appid="+APPID
+ "&redirect_uri="+REDIRECT_URI
+ "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
如果用户进行授权,则微信会跳转到上一步填写的回跳地址。并且在地址后面带着code。接收微信跳转接口代码:
@GetMapping("/userinfo")
public void weixinUserInfo(@RequestParam(value="code") String code,HttpServletResponse response) throws IOException{
logger.info("/userinfo"+code);
System.out.println("/userinfo"+code);
JSONObject jsonObject = threeLoginService.getUserInfo(code);
String param = threeLoginService.getParameter(jsonObject);
response.sendRedirect(param);
}
第二步,拿着code去accesstoken,然后再根据accesstoken去获取详细,跳转地址:
public final static String OAUTH2 = "https://api.weixin.qq.com/sns/oauth2/access_token?"
+ "appid="+APPID+"&secret="+SECRET+"&code=%s&grant_type=authorization_code";
这里获取信息的接口我使用的是springboot自带的restTemplate进行网络请求,下一步准备换成feign,因为我各个服务之间调用的时候,主要使用feign,所以这里突然用restTemplate有点突兀。
获取accesstoken代码:
String url = String.format(WeChatConfig.OAUTH2, code);
String resultStr = restTemplate.getForObject(url, String.class);
JSONObject result = JSONObject.parseObject(resultStr);
这里使用了阿里巴巴的 json框架。
第三步使用accessToken和openId进行用户信息的获取,地址:
public final static String USERINFO = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s";
获取代码:
String openid = accessToken.getString("openid");
String url = String.format(WeChatConfig.USERINFO, token, openid);
String resultStr = restTemplate.getForObject(url, String.class);
resultStr = new String(resultStr.getBytes("ISO-8859-1"), "UTF-8");
JSONObject result = JSONObject.parseObject(resultStr);