1.引入相关依赖项
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>${weixin-java-miniapp.version}</version>
</dependency>
2.设置配置项目
#applcation.yml
wx:
miniapp:
appid: **************
secret: **************
msg-data-format: JSON
2.1 读取配置项目
@ConfigurationProperties(prefix = "wx.miniapp")
@EnableConfigurationProperties(WxMaProperties.class)
@Data
public class WxMaProperties {
/**
* 设置微信小程序的appid
*/
private String appid;
/**
* 设置微信小程序的Secret
*/
private String secret;
private String msgDataFormat;
}
3.设置配置类
解释:配置微信项:如配置微信支付的一些信息 意思是一样的
@Configuration
@EnableConfigurationProperties(WxMaProperties.class)
public class WxMaConfiguration {
@Bean
public WxMaService wxMaService(WxMaProperties properties) {
WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
config.setAppid(properties.getAppid());//appid
config.setSecret(properties.getSecret());//appsecret
config.setMsgDataFormat(properties.getMsgDataFormat());
WxMaService service = new WxMaServiceImpl();
service.setWxMaConfig(config);
return service;
}
}
4.编写相关逻辑代码
Cotroller层
public class XcxLoginController {
private final XcxLoginService xcxLoginService;
@GetMapping("/login")
public ResultBean xcxLogin(
@RequestParam("code") String code, //appCode 前端传入
@RequestParam("encryptedData") String encryptedData, //密钥 前端传入
@RequestParam("iv") String iv //偏移量 前端传入
){
log.info("开始微信登陆====>");
AppLoginOrRegisterReq appLoginOrRegisterReq = new AppLoginOrRegisterReq(code, encryptedData, iv); //封装 code encryptedData iv
String phone = xcxLoginService.xcxLogin(appLoginOrRegisterReq); //service层
Subject subject = SecurityUtils.getSubject(); //放入session中 相当于返回一个token
PhoneVerifyCodeToken phoneVerifyCodeToken = new PhoneVerifyCodeToken().setPhone(phone);
subject.login(phoneVerifyCodeToken);
log.info("登陆成功====>");
return ResultBean.success();
}
}
Service层:
@Slf4j
@Service
@RequiredArgsConstructor
public class XcxLoginServiceImpl implements XcxLoginService {
private final WxMaService wxMaService;
private final MemeberService memeberService;
private final StringRedisTemplate redisTemplate;
@Override
public String xcxLogin(AppLoginOrRegisterReq appLoginOrRegisterReq) {
WxMaJscode2SessionResult sessionInfo = null;
log.info("准备认证-====>");
String code = appLoginOrRegisterReq.getCode();
if (StringUtils.isEmpty(code)) {
log.info("微信小程序授权失败:原因code:{}", code);
throw new AppException("微信小程序授权失败");
}
//开始授权 获取openId 和 sessionKey
try {
sessionInfo = wxMaService.getUserService().getSessionInfo(code);
} catch (Exception e) {
e.printStackTrace();
}
log.info("获取openId-====>");
if (sessionInfo == null || StringUtils.isEmpty(sessionInfo.getOpenid()) || StringUtils.isEmpty(sessionInfo.getSessionKey())) {
throw new AppException("系统繁忙,请稍后重试!");
}
if (StringUtils.isEmpty(appLoginOrRegisterReq.getEncryptedData()) || StringUtils.isEmpty(appLoginOrRegisterReq.getIv())) {
log.info("微信小程序拉取登录失败:原因:{}", appLoginOrRegisterReq.getEncryptedData() + appLoginOrRegisterReq.getIv());
throw new AppException("微信小程序拉取登录失败!");
}
log.info("获取openId2-====>");
//获取 手机号码
WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(sessionInfo.getSessionKey(), appLoginOrRegisterReq.getEncryptedData(), appLoginOrRegisterReq.getIv());
if (phoneNoInfo == null || StringUtils.isEmpty(phoneNoInfo.getPhoneNumber())) {
log.info("手机号信息获取失败:{}", JSON.toJSONString(phoneNoInfo));
throw new AppException("登陆失败请稍后再试!");
}
log.info("认证结束 准备登陆");
//验证用户是否存在 不存在则注册 存在则登陆
MemeberEntity memeberEntity = memeberService.loginByPhone(phoneNoInfo.getPhoneNumber());
//没有此用户则进行注册
if (memeberEntity == null) {
//此方法已经废弃 只能通过前端获取回传给后端
//WxMaUserInfo wxMaUserInfo = wxMaService.getUserService().getUserInfo(sessionInfo.getSessionKey(), appLoginOrRegisterReq.getEncryptedData(), appLoginOrRegisterReq.getIv());
memeberEntity = new MemeberEntity();
memeberEntity.setAvatarUrl("https://oss.axiling.com/applets/isc-app/null-url.png");
log.info("设置图片");
memeberEntity.setOpenId(sessionInfo.getOpenid());
log.info("设置sessionInfo.getOpenid():{}", sessionInfo.getOpenid());
memeberEntity.setNickname(phoneNoInfo.getPhoneNumber());
log.info("设置name");
String phoneNumber = phoneNoInfo.getPhoneNumber();
log.info("设置手机号");
memeberEntity.setPhone(phoneNumber);
log.info("设置手机号2");
// memeberEntity.setSalt(generateSalt());
log.info("设置盐值");
// 这里开始注册
log.info("开始注册=======>");
memeberService.appRegister(memeberEntity);
;
}
String phone = memeberEntity.getPhone();
log.info("准备认证结束-====>");
return phone;
}
}
至此结束:大致的逻辑
获取用户信息----->存在说明有此用户--->返回登陆信息如:token,--->不存在,注册保存用户信息,并返回用户信息