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>
后端代码:
依赖
html
<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:
java
@Override
public 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
java
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;
}