微信开发文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
1. 先在配置文件中进行配置
# 微信公众号配置
wx:
appid: wx2904694ea2XXXXX
secret: c1f3dcb6fa8949db30XXXXXXXXXXXX
2. 引入JSON依赖
<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.70</version>
</dependency>
3. 编写接口
package com.xxx.service;
public interface WXService {
// 通过code换取OpenId
String getOpenId(String code);
// 获取token
String getBaseToken();
// 判断是否关注公众号
String getSubscribe(String openid, String accessToken);
}
4. 实现接口
package com.upmsproj.wp.wx.service.impl;
@Service
@RequiredArgsConstructor
@Transactional
@Slf4j
public class WXServiceImpl implements WXService {
@Value("${wx.appid}")
private String appid;
@Value("${wx.secret}")
private String secret;
private final RestTemplate restTemplate;
@Override
public String getOpenId(String code) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid
+ "&secret=" + secret + "&code=" + code + "&grant_type=authorization_code";
String forObject = restTemplate.getForObject(url, String.class);
JSONObject jsonObject = JSON.parseObject(forObject);
String openid = jsonObject.getString("openid");
log.info("用户AccessToken:" + forObject);
return openid;
}
@Override
public String getBaseToken() {
// https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
"&appid=" + appid + "&secret=" + secret;
String forObject = restTemplate.getForObject(url, String.class);
log.info("baseToken:" + forObject);
JSONObject jsonObject = JSON.parseObject(forObject);
return jsonObject.getString("access_token");
}
@Override
public String getSubscribe(String openid, String accessToken) {
// https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
String userInfoUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="
+ accessToken + "&openid=" + openid + "&lang=zh_CN";
String forObject = restTemplate.getForObject(userInfoUrl, String.class);
JSONObject jsonObject = JSON.parseObject(forObject);
log.info("是否关注公众号:" + forObject);
Integer subscribe = jsonObject.getInteger("subscribe");
if (subscribe == 1){
// 如果已经关注公众号返回昵称
return jsonObject.getString("nickname");
}
return null;
}
}
5. 控制层实现
package com.upmsproj.wp.wx.controller;
@Api(tags = "微信公众号获取信息")
@RequiredArgsConstructor
@RequestMapping("wx")
@Slf4j
@Controller
public class WXController {
private final WXService wxService;
@ApiOperation(value = "扫码绑定")
@GetMapping("login")
public String login(@RequestParam String code, @RequestParam String state) {
String openId = wxService.getOpenId(code);
String baseToken = wxService.getBaseToken();
String nickname = wxService.getSubscribe(openId, baseToken);
// 如果还没进行关注
if (nickname == null) {
log.info("还没关注");
return "wxFail";
}
// state传递用户Kid
wxService.updateUserInfo(state, openId, nickname);
return "wxSuccess";
}
}
6. Controller 获取 code 和 state
文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
# 案例:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=重定向URL(使用 urlEncode 对链接进行处理)&response_type=code&scope=snsapi_base&state=自定义携带参数&connect_redirect=1#wechat_redirect
# 完整写法:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect
# 在微信中进行访问后会进行跳转到指定的URL:
指定的重定向URL?code=043HmHkl2BYmO741SYkl2qRaRR1HmHk6&state=123#/index
其中:code和state为我们想要的参数值