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

yizhihongxing

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

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

问题描述

在微信小程序中,如何获取用户的手机号?我们可以通过调用 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实现的表单验证类完整示例”的完整攻略,我向您提供以下步骤: 1. 首先确定需要验证的表单字段 在实现表单验证类之前,我们需要明确需要进行验证的表单字段。一般来说,表单中需要验证的字段主要包括以下几种: 用户名/昵称 邮箱地址 手机号码 密码 重复密码(确认密码) 验证码 你可以通过查看你要实现表单验证类的业务需求,来确定需要验证的表单字段。 2.…

    PHP 2023年5月27日
    00
  • 微信成语猜猜看在哪?微信小程序成语猜猜看入口及答案大全

    微信成语猜猜看在哪?攻略全解 介绍 微信成语猜猜看,是一款非常受欢迎的小游戏。该游戏通过给出一组汉字,让玩家猜出对应的成语,一共有1000多个关卡,难度逐渐升级。 入口 微信成语猜猜看可以在微信小程序中找到。具体操作流程如下: 打开微信小程序。 在顶部搜索框中输入“成语猜猜看”。 点击进入应用程序,并开始游戏。 玩法 进入游戏后,可以直接开始第一关。 界面上…

    PHP 2023年5月23日
    00
  • php生成随机数或者字符串的代码

    生成随机数或字符串是PHP开发中的常见需求,下面我将详细介绍PHP生成随机数或字符串的代码实现,包括生成指定长度的随机数、生成随机字符串、生成指定格式的随机字符串等。 生成指定长度的随机数 这里我们使用PHP内置的 mt_rand 函数和 range 函数结合来生成指定长度的随机数。 function create_random_numbers($lengt…

    PHP 2023年5月26日
    00
  • 分享十款最出色的PHP安全开发库中文详细介绍

    针对分享“分享十款最出色的PHP安全开发库中文详细介绍”的完整攻略,我来进行详细讲解。 一、介绍 PHP安全开发库是一些常用的PHP代码库,用来实现对面向Web的应用程序进行安全开发和健壮性编程。PHP安全开发库中精选出10个最出色的,是可以帮助开发者最大程度保障代码的安全性和健壮性的库。 二、PHP安全开发库 下面是十款最出色的PHP安全开发库: PHPI…

    PHP 2023年5月23日
    00
  • 一个PHP二维数组排序的函数分享

    让我们来讲解“一个PHP二维数组排序的函数分享”的完整攻略。 问题描述 在开发PHP程序时,经常会涉及到对二维数组进行排序的情况。二维数组是一个特殊的数组,它包含多个子数组,在排序时需要考虑到子数组的顺序,且每个子数组中的元素可能是不同的数据类型。因此,我们需要编写一个通用的函数来完成对二维数组的排序。 解决方案 为了解决上述问题,我们可以编写一个函数来完成…

    PHP 2023年5月26日
    00
  • PHP使用自定义key实现对数据加密解密的方法

    对于PHP使用自定义key实现对数据加密和解密的方法,一般有以下几个步骤: 定义自定义key,这个key可以是一个字符串,也可以是一个文件,根据实际需求进行定义。如果采用字符串,可以直接在代码中定义,比如: $key = ‘mysecretkey’; 加密数据,使用加密函数对需要加密的数据进行处理。在PHP中,可以使用mcrypt库或openssl库中的函数…

    PHP 2023年5月26日
    00
  • PHP读取txt文件的内容并赋值给数组的代码

    为了让大家更好理解,我将详细讲解PHP读取txt文件的内容并赋值给数组的完整攻略,包括代码和示例。 一、读取txt文件并将内容存入数组 要读取一个txt文件并将其内容存储在一个数组中,我们可以使用PHP的内置函数file(),该函数将一个文件中的所有行读入一个数组中。 $lines = file(‘file.txt’); 这个代码片段中,file()函数将文…

    PHP 2023年5月26日
    00
  • php 文件夹删除、php清除缓存程序

    下面是对于 “php 文件夹删除、php清除缓存程序” 的详细讲解: PHP文件夹删除 删除文件夹是网站开发过程中经常用到的操作,PHP也提供了删除文件夹的相关函数,使用时只需要传递正确的文件夹路径即可,具体操作步骤如下: 步骤1:判断文件夹是否存在 为了避免误删除,我们需要先确认一下要删除的文件夹是否存在。可以使用PHP中的is_dir()函数来检查。 $…

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