微信小程序获取用户手机号-java+uniapp版【伸手党福利】
该代码实现了一个基于微信小程序的手机号自动登录功能。前端通过按钮触发获取用户手机号的操作,调用微信的 getPhoneNumber 接口获取加密数据,并将加密数据、code 等参数发送到后端。后端通过微信的 jscode2session 接口获取 session_key 和 openid,并返回给前端。前端使用 WXBizDataCrypt 解密数据,获取用户手机号,并调用注册接口完成用户注册。后
·
前端:
<template>
<button class="cu-btn bg-gradual-orange lg round margin-top-xl" open-type="getPhoneNumber"
@getphonenumber="handleGetPhone" :loading="loading">
<text class="text-xl">手机号自动登录</text>
</button>
</template>
async handleGetPhone(e) {
console.log("开始获取手机号");
if (e.detail.errMsg === 'getPhoneNumber:ok') {
this.loading = true;
const loginRes = await uni.login({
provider: 'weixin'
});
console.log("loginRes", loginRes);
console.log("loginRes[1].code", loginRes[1].code);
try {
console.log('encryptedData:', e.detail.encryptedData);
console.log('iv:', e.detail.iv);
console.log('code:', loginRes[1].code);
const params = {
appId: "xxxxxxxxxxxxxxxxxxx",
code: loginRes[1].code,
encryptedData: e.detail.encryptedData,
iv: e.detail.iv,
"grant_type": "authorization_code"
}
console.log("后端发起");
this.$http.post('/frontuser/getWechatUserInfo/',
params
)
.then(res => {
console.log("后端发起内容:");
console.log(res);
if(res.data.code == 200){
let tmp = res.data.data;
let openid = tmp.openid;
let session_key = tmp.session_key;
const pc = new WXBizDataCrypt(params.appId, session_key);
const data = pc.decryptData(params.encryptedData, params.iv);
console.log('解密后的数据:', data);
console.log('手机号:', data.phoneNumber);
console.log('国家码:', data.countryCode);
console.log('区号:', data.purePhoneNumber);
this.username = data.phoneNumber;
// 注册用户
this.$http.post('/frontuser/Register/', {
phoneNumber: data.phoneNumber
})
.then(res => {
if(res.data.code === 200) {
console.log("注册成功");
//重新刷新小程序
console.log(res.data.data);
uni.reLaunch({
url: '/pages/FRONTpages/index'
});
} else {
uni.showToast({
title: res.data.msg,
icon: 'none'
});
}
})
.catch(err => {
uni.showToast({
title: '注册失败',
icon: 'none'
});
console.error(err);
});
}
}).catch(err => {
uni.showToast({
icon: 'none',
title: '发起失败,请联系管理员!',
duration: 2000
})
console.log(err);
})
} catch (error) {
uni.showToast({
title: '获取手机号失败',
icon: 'none'
});
} finally {
this.loading = false;
}
}
}
后端
@Slf4j
@RestController
@RequestMapping("/frontuser")
public class FrontUserController {
@PostMapping("/getWechatUserInfo")
public Result<?> getWechatUserInfo(
@RequestBody JSONObject jsonObject
) {
try {
String appId = "xxxxxxxxxxxxxxxxx";
String appSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
String code = jsonObject.getString("code");
System.out.println("code:" + code);
// 调用微信接口获取session_key和openid
String response = Unirest.get("https://api.weixin.qq.com/sns/jscode2session")
.queryString("appid", appId)
.queryString("secret", appSecret)
.queryString("js_code", code)
.queryString("grant_type", "authorization_code")
.asString().getBody();
System.out.println("response:" + response);
// 解析返回数据
// 由于 JSONObject(String) 构造函数未定义,使用 parseObject 方法解析字符串
JSONObject jsonResponse = JSONObject.parseObject(response);
System.out.println(jsonResponse);
String openid = jsonResponse.getString("openid");
String session_key = jsonResponse.getString("session_key");
JSONObject data = new JSONObject();
data.put("openid", openid);
data.put("session_key", session_key);
// 返回解密后的用户信息
return Result.OK(data);
} catch (UnirestException e) {
log.error("微信接口调用失败", e);
return Result.error("微信接口调用失败");
} catch (Exception e) {
log.error("数据处理异常", e);
return Result.error("数据处理异常");
}
}
}
更多推荐
所有评论(0)