官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
登录流程:
说明:
- 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
- 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
注意:
- 会话密钥
session_key
是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。 - 临时登录凭证 code 只能使用一次
代码:
导包pom.xml
<!--微信开发包-->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>3.3.0</version>
</dependency>
UserInfo类
public class UserInfo {
private String nickName;
private String avatarUrl;
private String country;
private String province;
private String city;
private String language;
private Byte gender;
//set get
}
controller
@Autowired
private WxMaService wxMaService;
/**
* 微信登录接口
* @param wxLoginInfo
* @param request
*/
@PostMapping(value = "/login_wx")
public JSONObject loginWx(@RequestBody WxLoginInfo wxLoginInfo, HttpServletRequest request) {
String code = wxLoginInfo.getCode();
UserInfo userInfo = wxLoginInfo.getUserInfo();
if (code == null || userInfo == null) {
LOGGER.error("code is null");
return ResponseUtil.badArgument(); //参数值错误
}
String sessionKey = null;
String openId = null;
try {
WxMaJscode2SessionResult result = wxMaService.getUserService().getSessionInfo(code);
sessionKey = result.getSessionKey();
openId = result.getOpenid();
} catch (Exception e) {
LOGGER.error("login fail by wx");
e.printStackTrace();
}
if (sessionKey == null || openId == null) {
return ResponseUtil.fail(); //登录失败
}
//登录成功处理
}
配置
配置文件application.yml
wx:
# appid 是 小程序唯一标识 官网获取
# secret 是 小程序的 app secret 官网获取
# js_code 是 登录时获取的 code
# grant_type 是 填写为 authorization_code
miniapp:
appid: XXXXXX
secret: XXXXXXX
grant_type: authorization_code
WxProperties 读取yml中的值
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
/**
* 读取微信配置文件
*/
@Component
@ConfigurationProperties(prefix = "wx.miniapp")
public class WxProperties {
private String appid;
private String secret;
private String grantType;
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getSecret() {
return secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
public String getGrantType() {
return grantType;
}
public void setGrantType(String grantType) {
this.grantType = grantType;
}
}
WxConfig 配置两个bean
package com.zcb.minimallcore.config;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.config.WxMaConfig;
import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 配置微信登录参数
*/
@Configuration
public class WxConfig {
@Autowired
private WxProperties properties;
@Bean
public WxMaConfig wxMaConfig() {
WxMaInMemoryConfig config = new WxMaInMemoryConfig();
config.setAppid(properties.getAppid());
config.setSecret(properties.getSecret());
return config;
}
@Bean
public WxMaService wxMaService(WxMaConfig maConfig) {
WxMaService service = new WxMaServiceImpl();
service.setWxMaConfig(maConfig);
return service;
}
}
可参考我的项目:微信小程序