提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
例如: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);
}
}
总结
以上就是今天要讲的内容,本文仅仅为个人小菜鸟的笔记