平凉市网站建设_网站建设公司_Ruby_seo优化
2025/12/30 6:39:10 网站建设 项目流程

1.获取openid和sessionKey
yml文件配置appid和secret(申请小程序应用的时候提供):

wechat: appid: 0000 secret: 1111111111

实体类:

package com.jmdz.api.utils.GetWeiXin; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class LoginRequest { @ApiModelProperty("微信登录code") private String code; @ApiModelProperty("租户id") private Integer tenantId; @ApiModelProperty("微信昵称") private String nickName; @ApiModelProperty("微信头像") private String avatarUrl; @ApiModelProperty("性别 0-未知 1-男性 2-女性") private Integer gender; @ApiModelProperty("微信unionId") private String unionId; @ApiModelProperty("国家") private String country; @ApiModelProperty("省份") private String province; @ApiModelProperty("手机号") private String phone; @ApiModelProperty("微信openId") private String openId; @ApiModelProperty("城市") private String city; }

接口调用:

说明:1.接口返回是自己写的方法,可以根据框架自己处理

2.code是小程序前端获取到的

package com.jmdz.api.utils.GetWeiXin; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.jmdz.api.entity.WxUser; import com.jmdz.api.mapper.WxUserDao; import com.jmdz.api.service.WxUserService; import com.jmdz.api.vo.BaseResult; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.util.Date; /** * 微信用户(WxUser)表接口实现 * * @author add * @since 2025-12-29 */ @RestController @RequestMapping("/auth") public class LoginController { @Value(value = "${wechat.appid}") private String appid; @Value(value = "${wechat.secret}") private String secret; @Resource private WxUserDao wxUserDao; @PostMapping("/login") public BaseResult login(@RequestBody LoginRequest request) { // 1. 用 code 获取 openid 和 session_key String url = "https://api.weixin.qq.com/sns/jscode2session" + "?appid=" + appid + "&secret=" + secret + "&js_code=" + request.getCode() + "&grant_type=authorization_code"; // 发送 HTTP 请求获取 session RestTemplate restTemplate = new RestTemplate(); String response = restTemplate.getForObject(url, String.class); // 解析响应,获取 openid 和 session_key JSONObject jsonObject = JSON.parseObject(response); String openid = jsonObject.getString("openid"); String sessionKey = jsonObject.getString("session_key"); WxUser users = wxUserDao.selectOne(new QueryWrapper<WxUser>().eq("open_id", openid)); if (users != null) { return BaseResult.ok("已注册").setData(users); } else { // 2. 处理用户信息,存储到数据库 WxUser user = new WxUser(); user.setOpenId(openid); user.setUsername(request.getNickName()); user.setSessionKey(sessionKey); user.setIsManage(0); // 默认不是管理员 user.setCreateTime(new Date()); user.setDelFlag(0); // 默认不是删除 user.setTenantId(request.getTenantId()); // 租户id user.setCreateBy("system"); int insert = wxUserDao.insert(user); // 返回结果给前端 if (insert <= 0) { return BaseResult.error(500, "登录失败"); } else { return BaseResult.ok("登录成功").setData(user); } } } }

2.获取小程序的手机号,用户名以及头像
在POM文件增加SDK

<dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-miniapp</artifactId> <version>4.4.0</version> </dependency>

用户信息加密实体类:

package com.jmdz.api.utils.send; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel("微信登录DTO") public class WxLoginDto { @ApiModelProperty(value = "微信登录code", required = true) private String code; @ApiModelProperty("加密的用户数据") private String encryptedData; @ApiModelProperty("加密算法的初始向量") private String iv; @ApiModelProperty("加密的手机号数据") private String phoneEncryptedData; @ApiModelProperty("手机号加密算法的初始向量") private String phoneIv; }

Config类:

package com.jmdz.api.utils.send; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.config.WxMaConfig; import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class WxMaConfiguration { @Value(value = "${wechat.appid}") private String appid; @Value(value = "${wechat.secret}") private String secret; @Bean public WxMaConfig wxMaConfig() { WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); config.setAppid(appid); config.setSecret(secret); return config; } @Bean public WxMaService wxMaService(WxMaConfig wxMaConfig) { WxMaService wxMaService = new WxMaServiceImpl(); wxMaService.setWxMaConfig(wxMaConfig); return wxMaService; } }

service:

public interface WxUserService extends IService<WxUser> { /** * 获取微信小程序服务实例 * @return WxMaService */ WxMaService getWxMaService(); }

impl:

@Service("wxUserService") public class WxUserServiceImpl extends ServiceImpl<WxUserDao, WxUser> implements WxUserService { @Autowired private WxMaService wxMaService; /*添加获取WxMaService的方法*/ public WxMaService getWxMaService() { return this.wxMaService; } }

接口调用:(本人将用户名,头像,以及手机号放在一起了,应该是单独请求的将4.1去掉就是分别调用的方法)

package com.jmdz.api.utils.send; 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.bean.WxMaUserInfo; import com.jmdz.api.entity.WxUser; import com.jmdz.api.service.WxUserService; import com.jmdz.api.vo.BaseResult; import com.jmdz.api.vo.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; ; @Api(tags = "微信用户管理") @RestController @RequestMapping("/wxUser") @Slf4j public class WxUserController { @Resource private WxUserService wxUserService; @ApiOperation(value = "微信登录获取用户信息", notes = "通过微信登录code获取用户信息") @PostMapping("/getInfo") public BaseResult<WxUser> wxLogin(@RequestBody WxLoginDto loginDto) { try { // 1. 获取WxMaService实例 WxMaService wxMaService = wxUserService.getWxMaService(); // 2. 使用code获取session信息 WxMaJscode2SessionResult session = wxMaService.jsCode2SessionInfo(loginDto.getCode()); String openId = session.getOpenid(); String sessionKey = session.getSessionKey(); // 3. 检查用户是否已存在 WxUser existingUser = wxUserService.lambdaQuery() .eq(WxUser::getOpenId, openId) .one(); // 4. 如果有加密数据,解密用户信息 if (loginDto.getEncryptedData() != null && loginDto.getIv() != null) { WxMaUserInfo userInfo = wxMaService.getUserService() .getUserInfo(sessionKey, loginDto.getEncryptedData(), loginDto.getIv()); // 4.1 解密手机号 String phoneNumber = null; if (loginDto.getPhoneEncryptedData() != null && loginDto.getPhoneIv() != null) { WxMaPhoneNumberInfo phoneInfo = wxMaService.getUserService() .getPhoneNoInfo(sessionKey, loginDto.getPhoneEncryptedData(), loginDto.getPhoneIv()); phoneNumber = phoneInfo.getPhoneNumber(); } // 创建或更新用户 WxUser wxUser = existingUser != null ? existingUser : new WxUser(); wxUser.setOpenId(openId); wxUser.setPhone(phoneNumber); wxUser.setUsername(userInfo.getNickName()); wxUser.setAvatarUrl(userInfo.getAvatarUrl()); if (existingUser == null) { wxUserService.save(wxUser); } else { wxUserService.updateById(wxUser); } return BaseResult.ok("修改成功").setData(wxUser); } return BaseResult.ok("获取成功").setData(existingUser); } catch (Exception e) { log.error("获取微信信息失败", e); return BaseResult.error("获取微信信息失败: " + e.getMessage()); } } @ApiOperation(value = "获取用户手机号", notes = "解密微信手机号") @PostMapping("/getPhoneNumber") public Result<String> getPhoneNumber(@RequestBody WxLoginDto loginDto) { try { // 1. 获取WxMaService实例 WxMaService wxMaService = wxUserService.getWxMaService(); // 2. 使用code获取session信息 WxMaJscode2SessionResult session = wxMaService.jsCode2SessionInfo(loginDto.getCode()); String sessionKey = session.getSessionKey(); // 3. 解密手机号 WxMaPhoneNumberInfo phoneInfo = wxMaService.getUserService() .getPhoneNoInfo(sessionKey, loginDto.getPhoneEncryptedData(), loginDto.getPhoneIv()); String phoneNumber = phoneInfo.getPhoneNumber(); // 4. 更新用户手机号 String openId = session.getOpenid(); wxUserService.lambdaUpdate() .eq(WxUser::getOpenId, openId) .set(WxUser::getPhone, phoneNumber) .update(); return Result.OK("手机号获取成功", phoneNumber); } catch (Exception e) { log.error("获取手机号失败", e); return Result.error("获取手机号失败: " + e.getMessage()); } } }

小程序端调用:

// 1. 微信登录 wx.login({ success: (res) => { const code = res.code; // 获取用户信息 wx.getUserInfo({ success: (userRes) => { const encryptedData = userRes.encryptedData; const iv = userRes.iv; // 调用后端接口 wx.request({ url: '/jeecg-boot/wxUser/wxLogin', method: 'POST', data: { code: code, encryptedData: encryptedData, iv: iv }, success: (result) => { console.log('登录成功', result.data); } }); } }); } }); // 2. 获取手机号 wx.getPhoneNumber({ success: (res) => { const phoneEncryptedData = res.encryptedData; const phoneIv = res.iv; // 再次登录获取新的code wx.login({ success: (loginRes) => { const newCode = loginRes.code; // 调用后端接口 wx.request({ url: '/jeecg-boot/wxUser/getPhoneNumber', method: 'POST', data: { code: newCode, phoneEncryptedData: phoneEncryptedData, phoneIv: phoneIv }, success: (result) => { console.log('手机号获取成功', result.data); } }); } }); } });

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询