uni-app
是一个跨平台框架,可以通过编写一套代码来构建不同平台的应用,包括微信公众号。实现获取用户手机号并存储,可以按照以下步骤进行:
- 前端页面:展示获取手机号按钮并调用微信授权接口
- 后端服务器:接收并存储用户手机号
一、前端部分
首先,我们需要在前端页面上创建一个按钮,点击按钮后触发微信的获取手机号接口。
<template>
<view class="container">
<button @tap="getPhoneNumber" open-type="getPhoneNumber">获取手机号</button>
</view>
</template>
<script>
export default {
methods: {
getPhoneNumber(e) {
if (e.mp.detail.errMsg === 'getPhoneNumber:ok') {
// 用户允许授权,获取手机号信息
const { encryptedData, iv } = e.mp.detail;
// 调用后端接口,发送 encryptedData 和 iv
this.getPhoneNumberFromServer(encryptedData, iv);
} else {
// 用户拒绝授权
uni.showToast({
title: '用户拒绝授权',
icon: 'none'
});
}
},
getPhoneNumberFromServer(encryptedData, iv) {
uni.request({
url: 'https://your-backend-server.com/api/getPhoneNumber', // 替换成你的后端服务器地址
method: 'POST',
data: {
encryptedData,
iv,
session_key: uni.getStorageSync('session_key') // 确保已获取并存储用户 session_key
},
success: (res) => {
if (res.data.success) {
uni.showToast({
title: '手机号获取成功',
icon: 'success'
});
// 可以在这里处理手机号
} else {
uni.showToast({
title: '手机号获取失败',
icon: 'none'
});
}
},
fail: () => {
uni.showToast({
title: '请求失败',
icon: 'none'
});
}
});
}
}
}
</script>
<style>
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
button {
padding: 10px 20px;
background-color: #1AAD19;
color: white;
border: none;
border-radius: 5px;
}
</style>
在上面的代码中,我们创建了一个按钮,当用户点击按钮并同意授权后,会触发 getPhoneNumber
方法。这个方法会获取微信返回的 encryptedData
和 iv
,然后调用后端接口,将这些数据发送到服务器。
二、后端部分
后端部分需要接收前端发送的 encryptedData
和 iv
,然后使用微信提供的解密算法解密出用户的手机号,并将其存储在数据库中。以下是一个基于 Node.js 和 Express 的示例代码:
const express = require('express');
const bodyParser = require('body-parser');
const crypto = require('crypto');
const app = express();
app.use(bodyParser.json());
app.post('/api/getPhoneNumber', (req, res) => {
const { encryptedData, iv, session_key } = req.body;
// 微信小程序提供的解密算法
function decryptData(encryptedData, iv, sessionKey) {
const decodedKey = Buffer.from(sessionKey, 'base64');
const decodedIV = Buffer.from(iv, 'base64');
const decodedData = Buffer.from(encryptedData, 'base64');
try {
const decipher = crypto.createDecipheriv('aes-128-cbc', decodedKey, decodedIV);
decipher.setAutoPadding(true);
let decrypted = decipher.update(decodedData, 'binary', 'utf8');
decrypted += decipher.final('utf8');
return JSON.parse(decrypted);
} catch (err) {
console.error('解密失败:', err);
return null;
}
}
const decryptedData = decryptData(encryptedData, iv, session_key);
if (decryptedData) {
// 存储手机号逻辑,这里可以是存储到数据库
const phoneNumber = decryptedData.phoneNumber;
// 假设我们有一个函数 savePhoneNumber 存储手机号
savePhoneNumber(phoneNumber).then(() => {
res.json({ success: true, phoneNumber });
}).catch(err => {
console.error('存储失败:', err);
res.json({ success: false, message: '存储失败' });
});
} else {
res.json({ success: false, message: '解密失败' });
}
});
function savePhoneNumber(phoneNumber) {
// 此处为示例,实际应将手机号存储到数据库中
return new Promise((resolve, reject) => {
// 模拟异步存储操作
setTimeout(() => {
console.log('手机号存储成功:', phoneNumber);
resolve();
}, 1000);
});
}
app.listen(3000, () => {
console.log('服务器已启动,端口 3000');
});
在后端代码中,我们首先通过 decryptData
函数解密 encryptedData
,然后将解密后的数据(包含手机号)存储到数据库中。savePhoneNumber
函数是一个模拟的存储操作,你需要根据实际情况将其替换为实际的数据库存储逻辑。
三、整体流程说明
- 用户点击按钮:前端页面展示一个按钮,用户点击后会触发
getPhoneNumber
方法。 - 微信授权:如果用户同意授权,微信会返回
encryptedData
和iv
,前端将其发送到后端服务器。 - 后端解密:后端接收到
encryptedData
和iv
后,使用微信提供的解密算法解密出用户的手机号。 - 存储手机号:解密成功后,将手机号存储到数据库中,返回成功或失败的消息给前端。
四、注意事项
- session_key 的获取和存储:在用户登录时,需要获取并存储
session_key
。可以通过微信的登录接口获取到session_key
。 - 数据安全:在实际应用中,务必确保数据传输和存储的安全性,避免用户信息泄露。
- 错误处理:在解密和存储过程中,需要添加完整的错误处理逻辑,确保系统的健壮性。
通过以上步骤,便可以在 uni-app
中实现微信公众号获取用户手机号并存储的功能。如果你需要对接其他平台,只需根据平台的不同修改相应的代码逻辑即可。