微信小程序登录

文章目录


1.后端代码

代码如下(示例):

java 复制代码
package com.ulinkle.base.controller.wx;

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import cn.binarywang.wx.miniapp.util.WxMaConfigHolder;
import com.ulinkle.base.api.BaseStaffService;
import com.ulinkle.base.api.LoginService;
import com.ulinkle.common.core.exception.CheckedException;
import com.ulinkle.common.core.utils.ArgumentAssert;
import com.ulinkle.common.core.web.page.DataResponse;
import com.ulinkle.domain.base.ao.BaseWxGetPhoneAo;
import com.ulinkle.domain.base.entity.BaseStaff;
import com.ulinkle.domain.base.vo.WxLoginVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Optional;

@RestController
@RequestMapping("/wx/agent")
@Api(tags = "小程序登录相关: 提货点")
@AllArgsConstructor
@Slf4j
@Validated
public class LoginWxAgentController {
    private final WxMaService wxMaService;
    private final BaseStaffService baseStaffService;
    private final LoginService loginService;

    /**
     * 登陆接口
     */
    @GetMapping("/login")
    @ApiOperation(value = "小程序登录:如果用户已经绑定了手机号和openId,则返回值中包含token,否则返回空的token")
    public DataResponse<WxLoginVo> login(@ApiParam(name = "appid", value = "微信appid", required = true)
                                         @RequestParam("appid") @NotBlank(message = "appid不能为空") String appid,
                                         @ApiParam(name = "code", value = "微信用户code", required = true)
                                         @RequestParam("code") @NotBlank(message = "code不能为空") String code) {
        if (StringUtils.isBlank(code)) {
            return DataResponse.builderFailed("empty jscode");
        }
        if (!wxMaService.switchover(appid)) {
            throw new CheckedException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));
        }

        try {
            WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);
            WxLoginVo vo = WxLoginVo.builder()
                    .openid(session.getOpenid())
                    .sessionKey(session.getSessionKey())
                    .unionid(session.getUnionid()).build();

            Optional<BaseStaff> staffOptional = baseStaffService.getByOpenId(session.getOpenid());
            BaseStaff baseStaff = staffOptional.orElse(null);
            if (baseStaff != null && StringUtils.isNotEmpty(baseStaff.getTelephone())) {
                String token = loginService.createToken(baseStaff);
                vo.setToken(token);
                log.info("用户小程序登录成功,token:{},用户ID:{},用户名称:", token, baseStaff.getId(), baseStaff.getUserName());
            }
            return DataResponse.builderSuccess(vo);
        } catch (WxErrorException e) {
            log.error(e.getMessage(), e);
            return DataResponse.builderFailed(e.getMessage());
        } finally {
            WxMaConfigHolder.remove();//清理ThreadLocal
        }
    }

    /**
     * <pre>
     * 更具手机号匹配用户openId,并绑定
     * </pre>
     */
    @PostMapping("/phone")
    @ApiOperation(value = "小程序绑定手机号和openId,用户必须先在系统等级并填写手机号,然后通过本接口绑定手机号和openId")
    public DataResponse<String> phone(@ApiParam(name = "ao", value = "参数不能为空", required = true)
                                      @RequestBody @NotNull BaseWxGetPhoneAo ao) {
        if (!wxMaService.switchover(ao.getAppid())) {
            throw new CheckedException(String.format("未找到对应appid=[%s]的配置,请核实!", ao.getAppid()));
        }
        try {
            WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(ao.getCode());
            ArgumentAssert.notNull(phoneNoInfo, "获取手机号信息失败,code:{},openId:{}", ao.getCode(), ao.getOpenid());
            BaseStaff staff = baseStaffService.getStaffByTelephone(phoneNoInfo.getPurePhoneNumber());
            ArgumentAssert.isTrue(staff != null, "用户尚未录入,手机号:{}", phoneNoInfo.getPurePhoneNumber());
            ArgumentAssert.isTrue(StringUtils.isBlank(staff.getOpenId()), "手机号已绑定其他微信账号");

            //更新openId
            BaseStaff updateStaff = new BaseStaff();
            updateStaff.setId(staff.getId());
            updateStaff.setOpenId(ao.getOpenid());
            baseStaffService.updateById(updateStaff);

            String token = loginService.createToken(staff);
            log.info("用户小程序登录成功,token:{},用户ID:{},用户名称:{}", token, staff.getId(), staff.getUserName());
            return DataResponse.builderSuccess("登录成功", token);
        } catch (WxErrorException e) {
            throw new CheckedException(e);
        } finally {
            WxMaConfigHolder.remove();//清理ThreadLocal
        }
    }

}
java 复制代码
    /**
     * 创建令牌
     *
     * @author : zhang
     * @date : 2023-01-11 9:42
     */
    public String createToken(BaseStaff baseStaff) {
        BaseOrg org = orgService.getById(baseStaff.getOrgId());
        LoginStaffVo loginStaff = BeanPlusUtil.toBean(baseStaff, LoginStaffVo.class);
        loginStaff.setOrgName(org.getOrgName());
        String jsonStaff = JSON.toJSONString(loginStaff);
        String encry = AESHelper.encry(jsonStaff, AESHelper.KEY);
        //生成token 用户ID+年月日
        String encryPre = AESHelper.encry(baseStaff.getId() + DateTimeUtils.parseDateToStr(DateTimeUtils.YYYY_MM_DD_HH_MM_SS, new Date()), AESHelper.KEY);
        String token = (encryPre + ".@lasttToken").replace("@lasttToken", encry);

        //设置过期时间  刷新令牌
        redisTemplate.opsForValue().set(SystemConstants.getTokenKey(1,baseStaff.getUserName()), "Bearer " + token, Constants.SYS_TOKEN_EXPIRE_HOUR, TimeUnit.HOURS);
        return token;
    }
java 复制代码
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class WxLoginVo implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("sessionKey")
    private String sessionKey;

    @ApiModelProperty("openid")
    private String openid;

    @ApiModelProperty("unionid")
    private String unionid;

    @ApiModelProperty("token:不存在需要获取手机号码")
    private String token;
}
java 复制代码
import
io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BaseWxGetPhoneAo implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty("微信appid")
    @NotEmpty(message = "appid不能为空")
    private String appid;

    @ApiModelProperty("openid")
    @NotEmpty(message = "openid不能为空")
    private String openid;

    @ApiModelProperty("unionid")
    @NotEmpty(message = "unionid不能为空")
    private String unionid;

    @ApiModelProperty("获取手机号的动态code")
    @NotEmpty(message = "code不能为空")
    private String code;
}
xml 复制代码
    <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-miniapp</artifactId>
            <version>4.6.0</version>
        </dependency>

2.前端代码

ai待生成

相关推荐
幽络源小助理8 小时前
SpringBoot+小程序高校素拓分管理系统源码 – 幽络源免费分享
spring boot·后端·小程序
Mr -老鬼8 小时前
移动端跨平台适配技术框架:从发展到展望
android·ios·小程序·uni-app
内存不泄露9 小时前
棋牌预约小程序系统论文
小程序
计算机徐师兄11 小时前
Java基于微信小程序的食堂线上预约点餐系统【附源码、文档说明】
java·微信小程序·食堂线上预约点餐系统小程序·食堂线上预约点餐微信小程序·java食堂线上预约点餐小程序·食堂线上预约点餐小程序·食堂线上预约点餐系统微信小程序
说私域1 天前
短视频私域流量池的变现路径创新:基于AI智能名片链动2+1模式S2B2C商城小程序的实践研究
大数据·人工智能·小程序
毕设源码-邱学长1 天前
【开题答辩全过程】以 基于微信小程序的松辽律所咨询系统的设计与实现为例,包含答辩的问题和答案
微信小程序·小程序
+VX:Fegn08951 天前
计算机毕业设计|基于springboot + vue物流配送中心信息化管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·小程序·课程设计
说私域1 天前
B站内容生态下的私域流量运营创新:基于AI智能名片链动2+1模式与S2B2C商城小程序的融合实践
人工智能·小程序·流量运营
计算机毕设指导61 天前
基于微信小程序的钓鱼论坛系统【源码文末联系】
java·spring boot·mysql·微信小程序·小程序·tomcat·maven
qq_12498707531 天前
基于微信小程序的宠物交易平台的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·微信小程序·小程序·毕业设计·计算机毕业设计