uniapp 微信公众号 获取手机号并存储

uni-app 是一个跨平台框架,可以通过编写一套代码来构建不同平台的应用,包括微信公众号。实现获取用户手机号并存储,可以按照以下步骤进行:

  1. 前端页面:展示获取手机号按钮并调用微信授权接口
  2. 后端服务器:接收并存储用户手机号

一、前端部分

首先,我们需要在前端页面上创建一个按钮,点击按钮后触发微信的获取手机号接口。

<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 方法。这个方法会获取微信返回的 encryptedDataiv,然后调用后端接口,将这些数据发送到服务器。

二、后端部分

后端部分需要接收前端发送的 encryptedDataiv,然后使用微信提供的解密算法解密出用户的手机号,并将其存储在数据库中。以下是一个基于 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 函数是一个模拟的存储操作,你需要根据实际情况将其替换为实际的数据库存储逻辑。

三、整体流程说明

  1. 用户点击按钮:前端页面展示一个按钮,用户点击后会触发 getPhoneNumber 方法。
  2. 微信授权:如果用户同意授权,微信会返回 encryptedDataiv,前端将其发送到后端服务器。
  3. 后端解密:后端接收到 encryptedDataiv 后,使用微信提供的解密算法解密出用户的手机号。
  4. 存储手机号:解密成功后,将手机号存储到数据库中,返回成功或失败的消息给前端。

四、注意事项

  1. session_key 的获取和存储:在用户登录时,需要获取并存储 session_key。可以通过微信的登录接口获取到 session_key
  2. 数据安全:在实际应用中,务必确保数据传输和存储的安全性,避免用户信息泄露。
  3. 错误处理:在解密和存储过程中,需要添加完整的错误处理逻辑,确保系统的健壮性。

通过以上步骤,便可以在 uni-app 中实现微信公众号获取用户手机号并存储的功能。如果你需要对接其他平台,只需根据平台的不同修改相应的代码逻辑即可。

UniApp结合Java技术实现微信账号登录,通常需要通过微信的JS-SDK来进行。以下是大致步骤: 1. **注册配置**:首先在微信公众平台注册公众号,启用JS-SDK。在`mp.weixin.qq.com`上申请小程序服务号或企业号。 2. **引入JS-SDK**:在Java后端项目中,你需要在前端页面引入微信的JavaScript SDK库,通常是通过CDN链接获取。 3. **服务器端接口**:后端创建一个接口,用于接收前端发起的微信授权请求。这个接口会调用微信提供的JS-Code换取Access Token。 ```java String jsCode = request.getParameter("js_code"); // 使用jsCode换取access_token等信息 Map<String, String> params = new HashMap<>(); params.put("js_code", jsCode); params.put("appid", "your_appid"); params.put("secret", "your_secret"); // 小程序的AppSecret // 发送请求到微信服务器换取access_token等 // 示例: AccessTokenResponse response = getAccessTokenFromWechat(params); ``` 4. **验证获取用户信息**:有了Access Token,可以进一步获取用户的OpenID和UnionID,然后利用OpenID去微信API获取用户的详细信息,包括手机号。 ```java // 获取用户基本信息 User user = getUserInfo(accessToken, openId); // 检查手机号是否已绑定 if (user.getPhone() != null) { // 手机号已存在,处理登录逻辑 } else { // 用户未绑定手机号,提示用户绑定 } ``` 5. **存储和处理**:最后,将用户信息保存至数据库,根据业务需求处理登录或注册流程。 注意:整个过程需要遵守微信开发者协议,确保安全性,例如对敏感数据进行加密传输。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值