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

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

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

问题描述

在微信小程序中,如何获取用户的手机号?我们可以通过调用 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匹配连续的数字或字母的正则表达式

    要匹配连续的数字或字母,可以使用正则表达式中的元字符(metacharacter)来进行匹配。常用的元字符有.、*、+、?、|等,而用来匹配数字或字母的元字符有\d和\w。 使用\d+匹配连续的数字 \d用来匹配数字,\d+则表示匹配一个或多个数字(即连续的数字)。下面是一个例子,展示了如何使用\d+来匹配字符串中的连续数字: <?php $str =…

    PHP 2023年5月26日
    00
  • Laravel实现用户多字段认证的解决方法

    请允许我详细讲解“Laravel实现用户多字段认证的解决方法”的完整攻略。 问题背景 在实际的应用场景中,我们经常需要使用多字段完成用户身份认证。比如,我们的用户既可以使用email登录,也可以使用手机号码登录。Laravel默认提供的用户认证仅支持单字段认证,因此我们需要做一些额外的工作,来实现多字段认证。 解决方法 我们可以通过自定义Laravel的认证…

    PHP 2023年5月23日
    00
  • 深入PHP获取随机数字和字母的方法详解

    深入PHP获取随机数字和字母的方法详解 随机数是在编程中经常用到的一个功能。在PHP中,可以使用rand()函数、mt_rand()函数、shuffle()函数、array_rand()函数等多种方法来生成随机数。然而,如果需要生成随机的数字和字母组成的字符串,则需要采用其他方法。下面我们将深入介绍如何在PHP中获取随机数字和字母。 方法一:使用shuffl…

    PHP 2023年5月26日
    00
  • 区块链桥接是什么意思?什么是区块链桥?

    区块链技术的发展越来越成熟,但是仍存在着各种不同的公链之间的信息孤岛问题,即不同的公链之间无法有效地通信和信息互通。区块链桥接便是为了解决这个问题而产生的技术方案。 什么是区块链桥接? 区块链桥接(Blockchain Bridge)是一种技术,用于连接不同公链之间的数据和价值转移。它实现了不同公链之间的无缝链接,让它们之间的数据和价值可以互通有无。 所谓区…

    PHP 2023年5月27日
    00
  • php 带逗号千位符数字的处理方法

    当我们需要在显示一些数字时,会有时候希望在千分位上使用逗号(或者句号),这样可以让数字更加清晰易懂。在PHP中,可以使用内置函数实现千位符的展示。接下来,我将为您介绍PHP中带逗号千位符数字的处理方法的完整攻略。 使用number_format()函数实现千位符展示 PHP中,内置的number_format()函数就可以轻松实现数字的千位符展示。numbe…

    PHP 2023年5月26日
    00
  • php使用str_replace替换多维数组的实现方法分析

    PHP使用str_replace替换多维数组的实现方法分析 在PHP中,使用str_replace()函数可以方便地进行字符串替换操作。但是该函数只能对单个字符串进行操作,对于多维数组的替换操作,我们需要进行额外的处理。 下面是实现多维数组替换的几种方法: 方法一:递归函数实现 使用递归函数可以方便地实现对多维数组的替换操作。具体的做法是,对于一个数组,如果…

    PHP 2023年5月26日
    00
  • Laravel框架学习笔记(一)环境搭建

    Laravel框架学习笔记(一)环境搭建 Laravel是一种广泛使用的PHP Web应用程序框架,具有优雅的语法和高度可读性。在开始使用Laravel之前,需要准备好一些环境: 1.环境要求 PHP >= 7.2.5 OpenSSL PHP 扩展 PDO PHP 扩展 Mbstring PHP 扩展 Tokenizer PHP 扩展 XML PHP …

    PHP 2023年5月23日
    00
  • PHP实现用户登录的案例代码

    下面是详细的讲解过程,包含了实现用户登录的完整攻略和两条示例说明。 1. 需求分析 首先,我们需要了解用户登录的功能模块要求,包括以下几点: 用户可以输入用户名和密码进行登录 登录成功后会跳转到主页或个人中心页面 登录失败会提示错误信息并保留用户填写的用户名 登录状态下用户不能重复登录或访问未授权的资源 2. 数据库表设计 在实现用户登录功能的前提下,需要设…

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