微信小程序获取手机号的踩坑记录

下面是详细讲解“微信小程序获取手机号的踩坑记录”的完整攻略。

微信小程序获取手机号的踩坑记录

问题描述

在微信小程序中,如何获取用户的手机号?我们可以通过调用 wx.login 接口获取用户的 code,然后在后端服务器上调用微信提供的 session_key 接口获取到用户的 openidsession_key,最后使用 session_key 来解密用户的手机号码。但是在实际开发中,我们可能会遇到以下问题:

  1. 如何在前端将 code 发送到后端服务器?
  2. 如何在后端服务器中使用 session_key 解密用户的手机号?
  3. 当用户拒绝授权手机号时,如何处理?

下面将逐一解答这些问题。

问题一:如何在前端将 code 发送到后端服务器?

在微信小程序中,我们可以使用 wx.login 接口获取用户的登录凭证 code,然后将 code 发送到后端服务器进行处理。具体代码如下:

// 在前端中调用 wx.login 接口获取 code
wx.login({
  success(res) {
    if (res.code) {
      wx.request({
        url: 'https://example.com/login',
        data: {
          code: res.code
        },
        success(res) {
          console.log(res.data)
        }
      })
    } else {
      console.log('登录失败!' + res.errMsg)
    }
  }
})

当用户点击“获取手机号”按钮时,我们可以先调用 wx.login 接口获取 code,然后将 code 发送到后端服务器,后端服务器再通过微信提供的接口获取 session_keyopenid 等信息,最后返回给前端。

问题二:如何在后端服务器中使用 session_key 解密用户的手机号?

获取到用户的 session_key 后,我们就可以使用解密算法来解密用户的手机号。具体步骤如下:

  1. 对加密数据进行 Base64 解码,得到加密后的数据 encryptedData
  2. 对 session_key 进行 Base64 解码,得到解密密钥 aesKey
  3. 对 IV(初始向量) 进行 Base64 解码,得到解密算法的初始向量 iv
  4. 使用解密密钥 aesKey 和初始向量 iv,进行 AES-128-CBC 解密,得到原始数据。

具体代码如下:

// 在后端服务器中使用 Node.js 的 crypto 库进行加解密操作
const crypto = require('crypto')

const sessionKey = 'xxxxxxxxxxxxxx' // 换成实际的 session_key
const encryptedData = 'xxxxxxxxxxxxxx' // 换成实际的加密后的数据
const iv = 'xxxxxxxxxxxxxx' // 换成实际的初始向量

const sessionKeyBuffer = new Buffer.from(sessionKey, 'base64')
const encryptedDataBuffer = new Buffer.from(encryptedData, 'base64')
const ivBuffer = new Buffer.from(iv, 'base64')

const decipher = crypto.createDecipheriv('aes-128-cbc', sessionKeyBuffer, ivBuffer)
let decoded = decipher.update(encryptedDataBuffer, 'binary', 'utf8')
decoded += decipher.final('utf8')

console.log(decoded) // 输出用户的手机号

注意,上述代码中的算法和密钥需要与前端中加密数据使用的算法和密钥保持一致。

问题三:当用户拒绝授权手机号时,如何处理?

在小程序中,当用户拒绝授权手机号时,我们可以根据返回的 errMsg 字段来判断用户是否授权成功。具体代码如下:

wx.getPhoneNumber({
  success(res) {
    console.log(res.encryptedData) // 获取加密后的手机号
  },
  fail(res) {
    if (res.errMsg === 'getPhoneNumber:fail user deny') {
      console.log('用户拒绝授权')
    } else {
      console.log('获取手机号失败!' + res.errMsg)
    }
  }
})

当用户拒绝授权时,我们可以给用户提示“您需要授权手机号才能使用该功能”,并提供相应的引导。如果用户授权失败,也需要给出相应的提示。

示例说明

下面给出两个示例说明:

示例一:获取用户手机号码

  1. 用户点击“获取手机号”按钮。
  2. 前端调用 wx.login 接口,获取 code
  3. 前端将 code 发送到后端服务器,后端服务器通过微信提供的接口获取 session_keyopenid 等信息,最后返回给前端。
  4. 前端显示一个页面,提示用户“请授权手机号码”,并提供“去授权”的按钮。
  5. 用户点击“去授权”的按钮,前端调用 wx.getPhoneNumber 接口,等待用户授权。
  6. 用户授权后,前端获取加密后的手机号数据。
  7. 前端将加密数据发送到后端服务器,后端服务器使用解密算法解密出用户的手机号码。
  8. 后端服务器将手机号码返回给前端,前端显示用户的手机号码。

示例二:用户拒绝授权手机号码

  1. 用户点击“获取手机号”按钮。
  2. 前端调用 wx.login 接口,获取 code
  3. 前端将 code 发送到后端服务器,后端服务器通过微信提供的接口获取 session_keyopenid 等信息,最后返回给前端。
  4. 前端显示一个页面,提示用户“请授权手机号码”,并提供“去授权”的按钮。
  5. 用户点击“去授权”的按钮,前端调用 wx.getPhoneNumber 接口,等待用户授权。
  6. 用户拒绝授权后,前端判断授权失败,并给出相应的提示。
  7. 用户可以重新点击“获取手机号”按钮,重新进行授权。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序获取手机号的踩坑记录 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • php中替换字符串中的空格为逗号’,’的方法

    在PHP中,有多种方法可以将字符串中的空格替换为逗号。以下是其中两种方法的示例解释: 方法一:使用str_replace函数 str_replace函数可以用于将字符串中指定的字符替换为另一个字符。我们可以使用该函数将空格替换为逗号。 $string = ‘Hello world PHP’; $new_string = str_replace(‘ ‘, ‘,…

    PHP 2023年5月26日
    00
  • 在微信小程序中渲染HTML内容的方法示例

    让我为您详细讲解在微信小程序中渲染HTML内容的方法示例: 1. 微信小程序官方自带的RichText组件 微信小程序中有一个开箱即用的RichText组件,它可以渲染一部分HTML标签,并支持部分CSS样式。使用方法如下: 在WXML文件中使用RichText组件 <rich-text nodes="{{html}}">&l…

    PHP 2023年5月23日
    00
  • 微信卸载后重装聊天记录还能恢复吗?重装微信恢复数据方法

    微信卸载后重装聊天记录能否恢复? 如果你卸载了微信,并重装了它,你可以通过备份和恢复功能恢复聊天记录。你需要在微信卸载之前进行备份,以便在重装后进行恢复。 备份微信聊天记录流程 在微信主页,点击右上角人头图标进入个人中心 点击设置菜单,选择聊天记录迁移 选择备份聊天记录,确认操作 等待备份完成 恢复微信聊天记录流程 在重装微信之后,按照上述步骤进入个人中心 …

    PHP 2023年5月27日
    00
  • PHP实现会员注册系统

    下面就来详细讲解一下“PHP实现会员注册系统”的完整攻略。 1. 确定需求 在开始搭建会员注册系统之前,我们需要明确该系统的需求以及功能。 一个典型的会员注册系统包括以下功能: 用户注册 用户登录 密码重置 会员信息管理 2. 创建数据库及表格 我们需要创建一个数据库,并为该数据库创建几个表格,用于存储会员相关信息。例如,我们可以创建一个名为“members…

    PHP 2023年5月24日
    00
  • PHP获取当前系统时间的方法小结

    以下是“PHP获取当前系统时间的方法小结”的完整攻略。 标准方式获取系统时间 通过以下代码可以获取当前系统时间: date_default_timezone_set(‘Asia/Shanghai’); echo date(‘Y-m-d H:i:s’); 其中date_default_timezone_set函数可以设置当前系统所在时区,其参数为时区字符串。d…

    PHP 2023年5月30日
    00
  • php通过array_unshift函数添加多个变量到数组前端的方法

    当我们需要向PHP数组的前端添加多个元素时,可以使用PHP的array_unshift函数。使用array_unshift函数,可以将一个或多个值插入到数组的开头。以下是完整的攻略: 函数语法 array_unshift ( array &$array , mixed $var [, mixed $… ] ) : int 此函数将一个或多个元素插…

    PHP 2023年5月26日
    00
  • php入门学习知识点六 PHP文件的读写操作代码

    让我们来详细讲解一下PHP文件的读写操作。首先,我们需要了解一下PHP文件读写的基本知识。 PHP文件读写操作 在PHP中,我们可以使用以下函数来进行文件的读写操作: fopen() 函数:用于打开一个文件,返回一个文件指针。 fgets() 函数:用于读取文件中的一行。 fwrite() 函数:用于向文件中写入内容。 fclose() 函数:用于关闭文件。…

    PHP 2023年5月23日
    00
  • 用PHP和MySQL保存和输出图片

    使用PHP和MySQL保存和输出图片的完整攻略包括以下步骤: 创建数据库表:首先需要创建一个用来保存图片的数据库表。表中应该包含两个列,一个是用来保存图片的二进制数据的列,另一个是用来指定图片类型的列,常用的图片类型包括JPEG、PNG和GIF。 示例代码: CREATE TABLE `images` ( `id` int(11) NOT NULL AUTO…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部