使用miniapp实现微信登陆

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,--->不存在,注册保存用户信息,并返回用户信息

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值