微信小程序实现微信登录的简单方法(用wxjava)

发布时间:2024-01-23 16:51:58

微信登录

小程序登录 | 微信开放文档 (qq.com)

在这里插入图片描述

说明

  1. 小程序微信授权登录(学生测试使用) 测试账号申请入口https://mp.weixin.qq.com/wxamp/sandbox?doc=1
  2. 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
  3. 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台账号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台账号) 和 会话密钥 session_key

之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

注意事项

  1. 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥
  2. 临时登录凭证 code 只能使用一次

我们采用**微信开发 Java SDK(非官方提供)**简化开发。这个SDK支持微信支付、开放平台、公众号、企业号/企业微信、小程序等的后端开发。

官方地址:http://wxjava.fly2you.cn/zh-CN/

  1. service-user模块中导入依赖

    <dependency>
        <groupId>com.github.binarywang</groupId>
        <artifactId>wx-java-miniapp-spring-boot-starter</artifactId>
        <version>4.5.0</version>
    </dependency>
    

    注意:SDK版本为4.1.0的话,不会自动产生对象类型!需要后续手动注入!此处我踩了坑!

  2. 在nacos注册中心增加配置信息(换成你自己的)

    wx:
      miniapp:
        appid: xxx # 小程序微信公众平台appId
        secret: xxx  # 小程序微信公众平台api秘钥
        msgDataFormat: JSON
    
  3. 在IOC容器中会自动产生对象类型,可以自动注入

  • WxMaService
  • WxMaConfig
  1. 当时导入小程序,选择测试号,产生用与测试的APPID(需要申请测试号)
  2. 进入微信开发者工具,编辑器->project.config.json文件修改appId。注意:非应用开发者用户无法修改!

下面是一个方法示例:

/**
	 * 采用微信javaSDK实现微信小程序登录
 	 * @param code
	 * @return
	 */
	@Override
	public Map<String, String> wxLogin(String code) {
		try {
			//根据code调用微信SDK获取用户会话信息 得到微信用户唯一标识
			WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(code);
			if (sessionInfo != null) {
				String openid = sessionInfo.getOpenid();
				//根据openid查询用户记录
				LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
				queryWrapper.eq(UserInfo::getWxOpenId,openid);
				UserInfo userInfo = userInfoMapper.selectOne(queryWrapper);

				//根据openid未得到用户记录 新增用户记录且采用MQ异步初始化账户(余额)信息
				if(userInfo==null){
					userInfo = new UserInfo();
					userInfo.setWxOpenId(openid);
					userInfo.setNickname("用户" + IdUtil.getSnowflake().nextId());
					userInfo.setAvatarUrl("https://oss.aliyuncs.com/aliyun_id_photo_bucket/default_handsome.jpg");
					userInfoMapper.insert(userInfo);
				}
				//根据openid获取用户记录

				//为登录微信用户生成令牌并存到redis
				String token = IdUtil.fastSimpleUUID();
				String loginKey = RedisConstant.USER_LOGIN_KEY_PREFIX + token;
				UserInfoVo userInfoVo = BeanUtil.copyProperties(userInfo, UserInfoVo.class);
				redisTemplate.opsForValue().set(loginKey, userInfoVo, RedisConstant.USER_LOGIN_KEY_TIMEOUT, TimeUnit.SECONDS);
				//响应令牌
				Map<String,String> mapResult = new HashMap<>();
				mapResult.put("token", token);
				return mapResult;

			}
			return null;
		} catch (WxErrorException e) {
			log.error("微信登录异常:{}",e);
			throw new RuntimeException(e);
		}
	}

文章来源:https://blog.csdn.net/weixin_73195042/article/details/135773181
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。