一 问题引入
我们之前的登陆都是:网页http传来请求,我们java来做这个请求的校验。
但是如果微信小程序登陆,就要用到相关的api来实现。
二 快速入门
1 引入依赖
官方依赖,在里面找合适的,去设置版本号。由于我这里在父工程就设置过了,所以省略
Maven Repository: com.github.binarywang >> weixin-java-miniapp (mvnrepository.com)
java
<dependencies>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
</dependency>
2 配置类
使用微信小程序api要设置微信小程序的id和密钥。我们在yml文件设置,并自己设置配置类来读取
java
wx:
miniapp:
appId: 你的微信小程序id # 小程序微信公众平台appId
secret: 你的微信小程序id秘钥 # 小程序微信公众平台api秘钥
java
@Component
@Data
@ConfigurationProperties(prefix = "wx.miniapp")
public class WxConfigProperties {
private String appId;
private String secret;
}
3 将微信小程序对象放入spring中
java
package com.atguigu.daijia.customer.config;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class WxConfigOperator {
@Autowired
private WxConfigProperties wxConfigProperties;
@Bean
public WxMaService wxMaService() {
//微信小程序id和秘钥
WxMaDefaultConfigImpl wxMaConfig = new WxMaDefaultConfigImpl();
wxMaConfig.setAppid(wxConfigProperties.getAppId());
wxMaConfig.setSecret(wxConfigProperties.getSecret());
WxMaService service = new WxMaServiceImpl();
service.setWxMaConfig(wxMaConfig);
return service;
}
}
4 具体实现登陆
service层
实现思路:前端约定,从前端传来code,传回去用户的id。
我们先用微信小程序的方法来解析code,获得openid。判断是否是第一次登陆。如果是,则将信息保存到数据库,并返回用户id。如果不是直接返回用户id。
java
package com.atguigu.daijia.customer.service.impl;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import com.atguigu.daijia.customer.mapper.CustomerInfoMapper;
import com.atguigu.daijia.customer.mapper.CustomerLoginLogMapper;
import com.atguigu.daijia.customer.service.CustomerInfoService;
import com.atguigu.daijia.model.entity.customer.CustomerInfo;
import com.atguigu.daijia.model.entity.customer.CustomerLoginLog;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, CustomerInfo> implements CustomerInfoService {
@Autowired
private WxMaService wxMaService;
@Autowired
private CustomerInfoMapper customerInfoMapper;
@Autowired
private CustomerLoginLogMapper customerLoginLogMapper;
// 微信小程序登陆
@Override
public Long login(String code) {
//1 获取code值,使用微信工具包对象,获取微信唯一标识openid
String openid = null;
try {
WxMaJscode2SessionResult sessionInfo =
wxMaService.getUserService().getSessionInfo(code);
openid = sessionInfo.getOpenid();
} catch (WxErrorException e) {
throw new RuntimeException(e);
}
//2 根据openid查询数据库表,判断是否第一次登录
//如果openid不存在返回null,如果存在返回一条记录
//select * from customer_info ci where ci.wx_open_id = ''
LambdaQueryWrapper<CustomerInfo> lqw = new LambdaQueryWrapper<>();
lqw.eq(CustomerInfo::getWxOpenId, openid);
CustomerInfo customerInfo = customerInfoMapper.selectOne(lqw);
//3 如果第一次登录,添加信息到用户表
if(customerInfo == null) {
customerInfo = new CustomerInfo();
customerInfo.setNickname(String.valueOf(System.currentTimeMillis()));
customerInfo.setAvatarUrl("https://oss.aliyuncs.com/aliyun_id_photo_bucket/default_handsome.jpg");
customerInfo.setWxOpenId(openid);
customerInfoMapper.insert(customerInfo);
}
//4 记录登录日志信息
CustomerLoginLog customerLoginLog = new CustomerLoginLog();
customerLoginLog.setCustomerId(customerInfo.getId());
customerLoginLog.setMsg("小程序登录");
customerLoginLogMapper.insert(customerLoginLog);
//5 返回用户id
return customerInfo.getId();
}
}