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

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

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

问题描述

在微信小程序中,如何获取用户的手机号?我们可以通过调用 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静态化是一种先将动态生成的网页内容转换为静态的HTML网页,然后将静态的网页通过Web服务器展示给用户的技术。它可以将动态的数据变为静态的网页文件,从而减轻服务器的负载,提高网站性能,也方便搜索引擎的抓取。下面是PHP静态化的实现代码和示例。 1. 实现代码 1.1. 页面静态化 页面静态化是指将动态页面生成静态HTML文件,通过访问这些静态文件来节约…

    PHP 2023年5月27日
    00
  • 最新版多语言BNB链上智能合约区块链高手可以研究研究

    demo软件园每日更新资源,请看到最后就能获取你想要的: 1.多语言BNB链上智能合约区块链 别人发的我没啥用,还有前面发的和这个好像不一样 自己需要的下载玩,这个本来就没有后台,别下载了找我说不完整。看着还是挺不错的。 这玩意好像还有人改盗u 页面效果: 1.数据挖掘与预测分析 数据挖掘与预测分析电子书封面 读者评价 不过的技术工具书,对rapid min…

    PHP 2023年4月17日
    00
  • PHP获取当前时间的5种实现方式

    以下是“PHP获取当前时间的5种实现方式”的完整攻略。 1. 使用date()函数获取当前时间 date()函数是PHP中用于获取日期和时间的函数,可以用来获取当前时间。函数的基本语法如下: date(format,timestamp) 其中,format是必须的参数,表示日期的输出格式;timestamp参数是可选的,表示要格式化的时间戳。如果不带time…

    PHP 2023年5月26日
    00
  • php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)

    针对“php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)”这个问题,我为您提供以下攻略: 问题描述 在使用 PHP 进行文件下载时,有时会出现下载的文件内容乱码或损坏的情况,这可能会影响用户的使用体验。例如,下载的图片或压缩包打不开、PDF 文档无法正常阅读等。那么在 PHP 中该如何避免或解决这个问题呢? 解决方法 方法一:设置响应头部信息 通过…

    PHP 2023年5月26日
    00
  • PHP常见字符串操作函数与用法总结

    PHP常见字符串操作函数与用法总结 在PHP中,字符串是一种常见的数据类型,应用广泛。多数情况下,操作字符串是不可避免的。为了方便开发,PHP提供了多种字符串操作函数,以帮助我们轻松操作字符串。 字符串长度计算 计算字符串的长度是一个常见的操作。我们可以使用strlen函数,获取一个字符串的长度: //获取字符串长度 $str = "hello w…

    PHP 2023年5月23日
    00
  • PHP生成器(generator)和协程的实现方法详解

    PHP生成器(generator)和协程的实现方法详解 什么是生成器和协程 在深入探讨生成器和协程的实现方法之前,我们先来了解一下它们的基本概念: 生成器(generator)是一种特殊的函数,可以在每次调用时生成一些值,但并不会一次性生产所有可能的值。生成器使得处理大量数据变得更加高效。 协程(coroutine)是一种单线程并发处理的方式,可以在不创建新…

    PHP 2023年5月26日
    00
  • 详解php微信小程序消息推送配置

    详解PHP微信小程序消息推送配置 什么是微信小程序消息推送? 微信小程序消息推送是指向用户发送微信推送服务所提供的通知。你可以通过向微信服务器发送推送消息,通知订阅用户相关的信息。 准备工作 在推送消息之前,你需要先完成以下准备: 确保已使用微信开放平台账号登录小程序的后台管理界面 在小程序后台开通了“服务号”或“订阅号”的功能 已经拥有了自己的微信公众号开…

    PHP 2023年5月23日
    00
  • PHP获取数组中某元素的位置及array_keys函数应用

    关于PHP获取数组中某元素的位置及array_keys函数应用,以下是详细的攻略: 获取数组中某元素的位置 有以下两种方式可以获取数组中某元素的位置: 1. 使用array_search函数 array_search函数可以在数组中搜索给定的值,如果找到则返回该值的键,如果失败则返回FALSE。示例代码如下: <?php $array = array(…

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