目錄
前言
微信小程序AppID和AppSecret一起使用可調用微信公眾接口能力,這里介紹通過 wx.login() 拿到code,將code傳到后台服務器, 后台服務器結合小程序的 appid 和 appsecret 去請求微信服務器拿到用戶的 openid 進行自己的業務邏輯處理。

環境
SpringBoot + 小程序
具體實現
小程序
- index.wxml
<button type='primary' open-type='getUserInfo' bindgetuserinfo='doCodeLogin'>微信登錄</button>
- index.js
Page({
doCodeLogin() {
// code
wx.login({
success: (res) => {
if (res.code) {
wx.request({
url: 'http://localhost:8081/v1/login/codeLogin?code=' + res.code,
method: 'POST',
success: (res) => {
// Login Success TO DO
console.log(res.data)
wx.setStorageSync('userData', res.data)
wx.redirectTo({
url: '../index/index'
})
}
})
}
}
})
}
}
SpringBoot
- application.yml
wechat:
appid: 小程序APPID
appsecret: 小程序Secret
code2session: https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code
- LoginController.java
@RestController
@RequestMapping("/login")
public class LoginController {
@Value("${wechat.code2session}")
private String code2SessionUrl;
@Value("${wechat.appid}")
private String appid;
@Value("${wechat.appsecret}")
private String appsecret;
@Autowired
private ObjectMapper mapper;
@Autowired
private UserRepository userRepository;
/**
* code登陸
* @param code
* @return
*/
@PostMapping("codeLogin")
public UnifyMessage codeLogin(@RequestParam String code) {
/**
* code2Session 接口Url 拼接
* code2Session開發者服務器使用臨時登錄憑證code獲取 session_key、
* 用戶userid以及用戶所在企業的corpid等信息。
* https://work.weixin.qq.com/api/doc/90000/90136/91507
*/
String url = MessageFormat.format(this.code2SessionUrl, this.appid, this.appsecret, code);
RestTemplate rest = new RestTemplate();
String sessionText = rest.getForObject(url, String.class);
/**
* code2Session 接口 返回值
*/
Map<String, Object> codeLoginResp = new HashMap<>();
try {
/**
* codeLoginResp 格式如下
* {
* "session_key": "oImL2VXoGLMvae/5bsgJkA==",
* "openid": "oBfjq4p7h0kuQEV4_mYRtNj1FX8s"
* }
*/
codeLoginResp = mapper.readValue(sessionText, Map.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
/**
* 獲取用戶openId
*/
String openid = codeLoginResp.getOrDefault("openid", "").toString();
if (StringUtils.isEmpty(openid)) {
throw new UnPermissionException("Code登陸失敗");
}
/**
* 業務邏輯處理。。。
*/
Optional<User> userOptional = userRepository.findByOpenid(openid);
if (userOptional.isPresent()) {
// TODO: Login success
return new UnifyMessage(0, "登陸成功", "");
} else {
// TODO: Login failed
}
return null;
}
}
- 登錄調用
