java微信小程序获取手机号登录

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

例如:java获取手机号微信小程序登录


一、导入微信小程序sdk

<!-- 微信小程序sdk -->
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-miniapp</artifactId>
            <version>4.5.0</version>
        </dependency>

二、配置类文件弄一下appid和密钥

在这里插入图片描述

三、sdk中的wxMaService需要配置一下bean

package com.anju.framework.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 cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl;
import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps;
import me.chanjar.weixin.common.redis.WxRedisOps;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;

import javax.annotation.Resource;

/**
 * @date :Created in 2023/8/11 15:34
 */
@Configuration
public class BeanConfig {
    @Value("${wechat.appId}")
    private String appId;
    @Value("${wechat.appSecret}")
    private String appSecret;
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 创建WxMaService Bean
     * @return WxMaService实例
     */
    @Bean(name = "wxMaService")
    public WxMaService wxMaService() {
        WxMaService wxMaService = new WxMaServiceImpl();
        WxRedisOps wxRedisOps = new RedisTemplateWxRedisOps(stringRedisTemplate);
        WxMaDefaultConfigImpl wxMaConfig = new WxMaRedisBetterConfigImpl(wxRedisOps, "consumer");
        wxMaConfig.setAppid(appId);
        wxMaConfig.setSecret(appSecret);
        wxMaService.setWxMaConfig(wxMaConfig);
        return wxMaService;
    }
}

四、实现登录、 获取用户手机号、获取用户openid

 /**
     * 登录
     * @author LeiFengLiang
     * @createTime  2023/9/18 14:33 
     * @Param [dto]
     * @return com.alibaba.fastjson2.JSONObject 
     **/
	@Override
    @Transactional(rollbackFor = Exception.class)
    public JSONObject login(LoginVo dto) {
        if (StringUtils.isAllBlank(dto.getMobile(), dto.getPhoneCode())) {
            throw new ServiceException("请选择授权/手机号登录");
        }
        String loginCode = dto.getLoginCode();
        String openId = null;
        String mobile = null;
        try {
            // 获取微信用户服务
            WxMaUserService userService = wxMaService.getUserService();
            // 通过登录凭证获取微信小程序的会话信息
            WxMaJscode2SessionResult sessionInfo = userService.getSessionInfo(loginCode);
            openId = sessionInfo.getOpenid();
        } catch (WxErrorException e) {
            throw new RuntimeException(e);
        }
        // 授权手机号登录
        if (StringUtils.isNotBlank(dto.getPhoneCode())) {
            // 根据手机号验证码获取手机号
            mobile = getMobilePhoneByWeixin(dto.getPhoneCode());
        }
        // 根据手机号查询用户信息
        Member member = getByMobile(mobile);
        Date now = new Date();

        // 如果用户不存在,则创建新用户
        if (member == null) {
            member = new Member();
            //member.setHeader("https://trhealth-oss.oss-cn-shenzhen.aliyuncs.com/c28318e8-8025-4a5c-8e84-27682735097c.png");
            member.setNickname(DesensitizedUtil.mobilePhone(mobile));
            member.setOpenId(openId);
            member.setBalance(BigDecimal.ZERO);
            member.setCreateTime(now);
        } else {
            // 如果用户存在,则更新用户的openId
            member.setOpenId(openId);
        }
        // 保存或更新用户信息
        this.saveOrUpdate(member);

        // 创建登录令牌
        Map<String, Object> map = new HashMap<>();
        map.put("memberId", member.getMemberId());

        String key = CacheConstants.WX_LOGIN_TOKEN + member.getMemberId();
        LoginToken loginToken = redisCache.getCacheObject(key);

        // 如果登录令牌不存在,则创建新的令牌并存入缓存
        if (loginToken == null) {
            String token = JwtUtil.createToken(map);
            loginToken = new LoginToken();
            loginToken.setExpireTime(DateUtil.offsetHour(now, 2).getTime());
            loginToken.setToken(token);
            redisCache.setCacheObject(key, loginToken, 3, TimeUnit.HOURS);
        } else {
            // 如果登录令牌存在,则判断是否过期,如果过期则更新令牌的过期时间
            if (now.getTime() >= loginToken.getExpireTime()) {
                loginToken.setExpireTime(DateUtil.offsetHour(now, 2).getTime());
                redisCache.setCacheObject(key, loginToken, 3, TimeUnit.HOURS);
            }
        }
        // 返回登录结果
        return JSONObject.of("token", loginToken.getToken(), "memberId", member.getMemberId());
    }

 /**
     * 获取微信用户手机号
     *
     * @param code code值
     */
    public String getMobilePhoneByWeixin(String code) {
        try {
            String accessToken = wxMaService.getAccessToken();
            String url = UrlBuilder
                    .of("https://api.weixin.qq.com/wxa/business/getuserphonenumber")
                    .addQuery("access_token", accessToken)
                    .build();
            Map<String, Object> paramBody = new HashMap<>(2);
            paramBody.put("code", code);
            String result = HttpUtil.post(url, JSON.toJSONString(paramBody));
            JSONObject jsonObject = JSON.parseObject(result);
            if ("40029".equals(jsonObject.getString("errcode"))) {
                throw new RuntimeException("code无效");
            }
            if ("-1".equals(jsonObject.getString("errcode"))) {
                throw new RuntimeException("微信系统繁忙");
            }
            JSONObject phoneInfo = jsonObject.getJSONObject("phone_info");
            return phoneInfo.getString("phoneNumber");
        } catch (WxErrorException e) {
            e.printStackTrace();
            throw new RuntimeException("获取手机号失败");
        }
    }
/**
     * 获取openid
     * @author LeiFengLiang
     * @createTime  2023/9/16 15:25
     * @Param [code]
     * @return java.lang.String
     **/
    private String getOpenIdFromWeChat(String code) {
        String appid = wxConfig.getAppId();
        String secret = wxConfig.getAppSecret();
        String url = String.format("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", appid, secret, code);
        String str = WeChatUtil.httpRequest(url, "GET", null);
        JSONObject jsonObject = JSONObject.parseObject(str);
        log.info("获取openId返回数据:{}", jsonObject);
        if (jsonObject.containsKey("openid")) {
            return jsonObject.getString("openid");
        } else {
            throw new RuntimeException("获取OpenId失败:"+jsonObject);
        }
    }

总结

以上就是今天要讲的内容,本文仅仅为个人小菜鸟的笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值