微信小程序getPhoneNumber获取用户手机号

下面我将详细讲解“微信小程序getPhoneNumber获取用户手机号”的完整攻略。

1. 获取用户手机号的前提条件

在使用getPhoneNumber获取用户手机号之前,必须满足以下条件:

  • 该用户已经授权过小程序获取用户手机号;
  • 开启了“获取用户手机号”权限;
  • 正在使用微信运行的环境;
  • 用户允许小程序使用手机号码。

2. 如何获取用户手机号

获取用户手机号需要使用微信小程序的API接口:wx.login和wx.getUserInfo。以下分别进行讲解。

2.1. 调用wx.login接口

在调用wx.login接口时,需传递一个success方法,该方法中包含了code,即登入微信的code。代码如下:

wx.login({
  success: function (res) {
    console.log(res.code);
  }
})

2.2. 调用wx.getUserInfo接口

在调用wx.getUserInfo接口时,也需要传递一个success方法,该方法中包含了rawData和signature。代码如下:

wx.getUserInfo({
  success: function(res) {
    console.log(res.rawData);
    console.log(res.signature);
  }
})

2.3. 解密数据

获取到用户信息之后,还需要解密数据才能获取到用户手机号。解密的具体步骤如下:

2.3.1. 引入crypto-js库

在小程序中引入crypto-js库,用于进行解密。需要注意的是,由于微信小程序不能直接使用npm包,所以需要在项目中引入crypto-js.min.js文件。例如:

<script src="/lib/crypto-js.min.js"></script>

2.3.2. 生成session_key和iv

在获取用户信息时,微信会返回session_key和iv两个值,用于解密用户数据。具体代码如下:

// 将session_key和iv转换为Base64编码
var session_key = wx.getStorageSync('session_key');
var iv = wx.getStorageSync('iv');
session_key = CryptoJS.enc.Base64.parse(session_key);
iv = CryptoJS.enc.Base64.parse(iv);

2.3.3. 解密encryptedData

获取到用户信息之后,即可对用户数据进行解密。具体代码如下:

// 获取到用户的encryptedData
var encryptedData = res.encryptedData;

// 将encryptedData转换为Base64编码
encryptedData = CryptoJS.enc.Base64.parse(encryptedData);

// 进行解密
var decryptedData = CryptoJS.AES.decrypt({
  ciphertext: encryptedData
}, session_key, {
  iv: iv,
  mode: CryptoJS.mode.CBC,
  padding: CryptoJS.pad.Pkcs7
});

// 将解密后的数据转换为字符串格式
var decryptedStr = CryptoJS.enc.Utf8.stringify(decryptedData);
console.log(decryptedStr);

2.4. 获取用户手机号

最后,从解密后的数据中提取出用户手机号码。具体代码如下:

var data = JSON.parse(decryptedStr);
console.log(data);

if (data.phoneNumber) {
  console.log('用户手机号码为:' + data.phoneNumber);
} else {
  console.log('获取用户手机号码失败');
}

3. 示例说明

下面,我将使用两个实际的例子来说明如何获取用户手机号。

示例一

wx.login({
  success: function (res) {
    // 获取用户信息
    wx.getUserInfo({
      success: function(res) {
        // 解密用户数据
        var session_key = wx.getStorageSync('session_key');
        var iv = wx.getStorageSync('iv');
        session_key = CryptoJS.enc.Base64.parse(session_key);
        iv = CryptoJS.enc.Base64.parse(iv);
        var encryptedData = res.encryptedData;
        encryptedData = CryptoJS.enc.Base64.parse(encryptedData);
        var decryptedData = CryptoJS.AES.decrypt({
          ciphertext: encryptedData
        }, session_key, {
          iv: iv,
          mode: CryptoJS.mode.CBC,
          padding: CryptoJS.pad.Pkcs7
        });
        var decryptedStr = CryptoJS.enc.Utf8.stringify(decryptedData);

        // 获取用户手机号
        var data = JSON.parse(decryptedStr);
        console.log(data);
        if (data.phoneNumber) {
          console.log('用户手机号码为:' + data.phoneNumber);
        } else {
          console.log('获取用户手机号码失败');
        }
      }
    })
  }
})

示例二

wx.login({
  success: function (res) {
    // 发送code到后端,获取session_key和openid
    wx.request({
      url: 'https://example.com/api/login',
      data: {
        code: res.code
      },
      success: function(res) {
        wx.setStorageSync('session_key', res.data.session_key);
        wx.setStorageSync('openid', res.data.openid);

        // 获取用户信息
        wx.getUserInfo({
          success: function(res) {
            // 解密用户数据
            var session_key = wx.getStorageSync('session_key');
            var iv = wx.getStorageSync('iv');
            session_key = CryptoJS.enc.Base64.parse(session_key);
            iv = CryptoJS.enc.Base64.parse(iv);
            var encryptedData = res.encryptedData;
            encryptedData = CryptoJS.enc.Base64.parse(encryptedData);
            var decryptedData = CryptoJS.AES.decrypt({
              ciphertext: encryptedData
            }, session_key, {
              iv: iv,
              mode: CryptoJS.mode.CBC,
              padding: CryptoJS.pad.Pkcs7
            });
            var decryptedStr = CryptoJS.enc.Utf8.stringify(decryptedData);

            // 获取用户手机号
            var data = JSON.parse(decryptedStr);
            console.log(data);
            if (data.phoneNumber) {
              console.log('用户手机号码为:' + data.phoneNumber);
            } else {
              console.log('获取用户手机号码失败');
            }
          }
        })
      }
    })
  }
})

以上就是完整的“微信小程序getPhoneNumber获取用户手机号”的攻略说明,希望对你有所帮助!

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

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

相关文章

  • 详解如何利用PHP实现RPC

    利用 PHP 实现 RPC 首先需要了解何谓 RPC。RPC(Remote Procedure Call,远程过程调用)是一种进程间通信方式。其思路是:A 机器上的程序通过调用某个远程主机 B 上的程序(即服务),就像调用本地程序一样,而屏蔽了底层网络通信的细节。 下面就是利用 PHP 实现 RPC 的完整攻略: 1. 安装必要的扩展 首先,在 PHP 中实…

    PHP 2023年5月27日
    00
  • 如何在VSCode配置PHP开发环境

    下面我将详细讲解如何在VSCode配置PHP开发环境的完整攻略: 1. 安装PHP环境 在开始配置PHP开发环境之前,需要先安装PHP环境。可以通过使用官网提供的二进制版本进行安装。 例如,下载最新版的PHP 8.0.x,解压后将PHP文件夹复制到C:\PHP目录下,然后将C:\PHP添加进系统环境变量中。 确保安装成功,可以在命令行中运行php -v命令,…

    PHP 2023年5月24日
    00
  • 五种单件模式之Singleton的实现方法详解

    五种单件模式之Singleton的实现方法详解 什么是单例模式? 单例模式是一种常用的设计模式之一,它的目的在于保证一个类仅有一个实例,并提供一个访问该实例的全局访问点。 Singleton模式的实现方法 方法一:懒汉式 在第一次调用getInstance()方法时,才会创建实例进行初始化。 示例代码: class Singleton { private s…

    PHP 2023年5月27日
    00
  • 学习php分页代码实例

    学习 PHP 分页代码实例的完整攻略如下: 1. 了解分页的概念 分页是指将一个大数据集合分成多个部分进行展示的过程。在网站开发中,常常用到分页功能来避免大量数据在一次性进行呈现时导致页面加载缓慢或者崩溃的问题。 2. 确定需要使用的分页方案 在 PHP 中,实现分页的方式有很多,例如使用 SQL 中的 LIMIT 语句、利用数组的 array_slice …

    PHP 2023年5月23日
    00
  • 微信小程序 图片等比例缩放(图片自适应屏幕)

    下面是“微信小程序 图片等比例缩放”的完整攻略: 1. 问题背景 在微信小程序开发中,我们经常会使用到图片,但是由于不同设备尺寸的差异,以及不同图片大小的差异,会导致在小程序中显示的图片大小不一致,影响了小程序的美观度和用户体验度。因此,有必要实现图片自适应屏幕,并且保持图片等比例缩放的效果。 2. 解决方案 2.1 使用 rpx 单位 rpx 是小程序的一…

    PHP 2023年5月23日
    00
  • 微信小程序非跳转式组件授权登录的方法示例

    微信小程序非跳转式组件授权登录的方法示例攻略 前言 微信小程序在发布初期只提供了跳转式授权登录的方法,需要跳转到微信官方的授权登录页面进行登录。随着微信小程序开发的不断深入和发展,现在提供了非跳转式授权登录的方法。本文将详解微信小程序的非跳转式授权登录的方法,同时提供两个示例说明。 方法 获取用户信息 获取小程序用户信息有两种方法: <1> 使用…

    PHP 2023年5月23日
    00
  • PHP随机字符串生成代码(包括大小写字母)

    生成随机字符串是WEB应用程序中经常遇到的一个问题,例如用于生成验证码或随机令牌等。在PHP中,可以通过使用rand()或mt_rand()函数结合使用字符串函数来生成随机字符串。以下是一个完整的攻略来生成包含大小写字母的随机字符串。 1. 使用rand()函数生成随机数 rand()函数是PHP中常用的生成随机数的函数,它可以生成一个介于两个指定整数之间的…

    PHP 2023年5月23日
    00
  • php的4种常见运行方式

    PHP有四种常见的运行方式,分别是在服务器端和客户端的运行,以及CLI和CGI。 服务器端运行方式 Apache模块方式 在Apache中,PHP可以作为模块运行。这种方式需要在Apache的httpd.conf配置文件中,加入以下行: LoadModule php5_module modules/libphp5.so AddType application…

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