微信小程序登陆

一 问题引入

我们之前的登陆都是:网页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();
    }
}
相关推荐
Maitians1 小时前
微信小程序 - 手机震动
微信小程序·小程序
像素之间2 小时前
在微信小程序中使用骨架屏
微信小程序·小程序
幽络源小助理8 小时前
美食推荐系统微信小程序
微信小程序·小程序·美食
帅次8 小时前
Flutter Container 组件详解
android·flutter·ios·小程序·kotlin·iphone·xcode
深空数字孪生10 小时前
小程序 UI 设计,怎样在方寸间实现高效交互
ui·小程序·交互
幽络源小助理10 小时前
超市售货管理平台小程序
小程序
帅次13 小时前
Flutter setState() 状态管理详细使用指南
android·flutter·ios·小程序·kotlin·android studio·iphone
浩宇软件开发13 小时前
基于微信小程序的天气预报app
微信小程序·小程序·天气app
用户61204149221314 小时前
小程序做的超市商品管理系统
微信小程序·敏捷开发·小程序·云开发
说私域15 小时前
基于开源AI智能名片链动2+1模式S2B2C商城小程序的项目投资保障研究
人工智能·小程序·开源·零售