uniapp中index.vue:
<template><view class="content"><button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber"type="primary">授权手机号登录 </button></view></template><script>export default {data() {return {}},onLoad() {},methods: {getPhoneNumber(e) {if (e.detail.errMsg === 'getPhoneNumber:ok') {const { encryptedData, iv } = e.detail; wx.login({success: (res) => {console.log('====>'+res.code);wx.request({url: 'http://localhost:8089/wx/user/wx-login', // 替换为你的后端接口 method: 'POST',data: {code: res.code, encryptedData,iv },success: (res) => {console.log(res);// 3. 登录成功处理 if (res.data.code === 200) {console.log(res.data.msg);}}});}});} else {console.error(' 获取手机号失败:', e.detail.errMsg); }},}}
</script><style></style>
后端代码:
依赖
<dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-miniapp</artifactId><version>4.3.0</version>
</dependency>
controller:
@PostMapping("/wx-login")public R<String> wxLogin(@RequestBody WxUserInfo userInfo) {return userInfoService.getPhoneNumber(userInfo);}
serviceImpl:
@Overridepublic R<String> getPhoneNumber(WxUserInfo userInfo) {try {WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(userInfo.getCode());log.info(session.getSessionKey());log.info(session.getOpenid());//TODO 可以增加自己的逻辑,关联业务相关数据WxMaPhoneNumberInfo phoneInfo = wxMaService.getUserService().getPhoneNoInfo(session.getSessionKey(), userInfo.getEncryptedData(), userInfo.getIv());String phoneNumber = phoneInfo.getPhoneNumber();return R.ok(phoneNumber);} catch (WxErrorException e) {log.error(e.getMessage(), e);return R.fail(e.toString());} finally {WxMaConfigHolder.remove();//清理ThreadLocal}}
WxUserInfo
package com.example.demo.domain.dto;import lombok.Data;
import lombok.experimental.Accessors;import java.io.Serializable;@Data
@Accessors(chain = true)
public class WxUserInfo implements Serializable {private String appid;private String sessionKey;/*** 签名信息*/private String signature;/*** 非敏感的用户信息*/private String rawData;/*** 加密的数据*/private String encryptedData;/*** 加密密钥*/private String iv;private String code;
}