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

微信小程序可以使用手机号作为用户的唯一标识,可以通过微信提供的API获取用户的手机号,具体操作步骤如下:

1. 开启微信用户手机号授权

在小程序的app.json文件中,设置如下选项,表示开启用户手机号授权功能:

{
  "permission": {
    "scope.userLocation": {
      "desc": "你的位置信息将用于小程序定位"
    },
    "scope.userInfo": {
      "desc": "你的基本信息将用于小程序个性化体验"
    },
    "scope.userPhone": {
      "desc": "你的手机号将用于小程序验证身份"
    }
  }
}

2. 获取用户手机号

小程序开发者可以通过wx.login接口获取到用户的code,然后将code发送到开发者后台,后台通过code获取session_key和openid,在获取到session_key后,根据微信提供的文档,通过encryptedDataiv可以解密出用户的手机号。

具体的代码示例如下:

wx.login({
  success: function (res) {
    if (res.code) {
      // 发送res.code到后台换取openId, session_key, unionId
      wx.request({
        url: 'https://api.weixin.qq.com/sns/jscode2session',
        data: {
          appid: 'your appid',
          secret: 'your app secret',
          js_code: res.code,
          grant_type: 'authorization_code'
        },
        success: function (response) {
          if (response.statusCode === 200) {
            const session_key = response.data.session_key
            const encryptedData = e.detail.encryptedData
            const iv = e.detail.iv
            wx.request({
              url: '/decryptPhoneNumber',
              method: 'POST',
              data: {
                sessionKey: session_key,
                encryptedData: encryptedData,
                iv: iv
              },
              success: function (response) {
                const phoneNumber = JSON.parse(response.data)
                console.log(phoneNumber)
              }
            })
          } else {
            console.log(response.errMsg)
          }
        }
      })
    } else {
      console.log('登录失败!' + res.errMsg)
    }
  }
})

3. 示例说明

示例1:使用微信手机号 API 加密数据

可以使用微信提供的 wx.login() 接口获取到用户的code,然后将code发送到开发者后台,通过开发者后台的接口获得unionId和session_key,最后引用wx.createCipher模块完成加密操作。具体代码示例如下:

const crypto = require('crypto')

function decodePhone(data, sessionKey) {
  // base64 decode
  const encryptedData = new Buffer(data, 'base64')
  const key = new Buffer(sessionKey, 'base64')
  const iv = key
  try {
    // 解密数据
    const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv)
    decipher.setAutoPadding(true)
    let decoded = decipher.update(encryptedData, 'binary', 'utf8')
    decoded += decipher.final('utf8');

    decoded = JSON.parse(decoded)
  } catch (err) {
    throw new Error('Illegal Buffer')
  }

  if (decoded.watermark.appid !== appid) {
    throw new Error('Illegal Buffer')
  }

  return decoded
}

Page({
  data: {},
  getPhoneNumber: function(e) {
    const detail = e.detail
    wx.login({
      success: (res) => {
        if (res.code) {
          // 发送 res.code 到后台换取 unionId, session_key 
          wx.request({
            url: '/decodePhoneNumber',
            header: {
              'content-type': 'application/x-www-form-urlencoded'
            },
            method: 'POST',
            data: {
              appid: appid,
              code: res.code,
              encryptedData: detail.encryptedData,
              iv: detail.iv
            },
            success: (res) => {
              const data = res.data
              if (data.errcode === 0) {
                const phoneNumber = decodePhone(data, data.session_key)
                console.log('用户手机号为', phoneNumber)
              }
            },
            fail: (res) => {
            }
          })
        }
      },
      fail: (res) => {
      }
    })
  }
})

示例2:手动解密数据

也可以使用手动解密的方式获取用户手机号,具体的代码示例如下:

function unescapeUnicode(data) {
  return data.replace(/\\u/g, '%u')
  .replace(/[^\x00-\x7F]/g, function(u) {return decodeURIComponent(unescape(unicodeEscape(u)))})
}

function unicodeEscape(str) {
  let res = '';
  for (let i = 0; i < str.length; i++) {
    res += '\\u' + str.charCodeAt(i).toString(16).padStart(4, '0');
  }
  return res;
} 

function decodePhone(data, sessionKey, iv) {
  // base64 decode
  const encryptedData = new Buffer(data, 'base64')
  const key = new Buffer(sessionKey, 'base64')
  iv = new Buffer(iv, 'base64')

  try {
    // 解密数据
    const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv)
    decipher.setAutoPadding(true)
    let decoded = decipher.update(encryptedData, 'binary', 'utf8')
    decoded += decipher.final('utf8')

    decoded = JSON.parse(unescapeUnicode(decoded))
  } catch (err) {
    console.error('解密出现异常', err)
    throw err
  }

  if (decoded.watermark.appid !== getApp().globalData.appId) {
    console.error('appId不一致', decoded)
    throw new Error('appId不一致')
  }

  return decoded
}

Page({
  data: {},
  getPhoneNumber: function(e) {
    const detail = e.detail
    wx.login({
      success: (res) => {
        if (res.code) {
          wx.request({
            url: '/api/user/phone-number',
            header: {
              'content-type': 'application/x-www-form-urlencoded'
            },
            method: 'POST',
            data: {
              code: res.code,
              encryptedData: detail.encryptedData,
              iv: detail.iv
            },
            success: (res) => {
              const data = res.data
              if (data.success) {
                const phoneNumber = decodePhone(detail.encryptedData, data.session_key, detail.iv)
                console.log('用户手机号为', phoneNumber)
                // 修改页面上的手机号展示信息
              } else {
                console.error(data.msg)
              }
            },
            fail: (res) => {
            }
          })
        }
      },
      fail: (res) => {
      }
    })
  }
})

在以上的代码中,我们通过wx.login()获取到用户的code,再将其发给后台以获得session_key,最后利用得到的手机号的密文、session_key以及iv,使用crypto模块的decipher()方法解密数据。

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

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

相关文章

  • 分享一个php 的异常处理程序

    下面我将详细讲解如何分享一个 PHP 的异常处理程序。 步骤一:编写 PHP 异常处理程序 首先,我们需要在 PHP 中编写一个异常处理程序。PHP 可以使用 try-catch 块来捕获和处理异常。以下是一个简单的示例: try { // 在这里运行你的代码 } catch (Exception $e) { // 处理异常 echo ‘Caught exc…

    PHP 2023年5月30日
    00
  • php写入、删除与复制文件的方法

    下面我就介绍一下PHP写入、删除和复制文件的方法。 PHP写入文件的方法 在PHP中,写入文件的主要函数是file_put_contents()。这个函数接收两个参数:要写入的文件名和要写入的内容。如果文件不存在,则会自动创建文件。如果文件已经存在,则会覆盖原有内容。 下面是一个简单的例子,演示如何使用file_put_contents()方法将数据写入到”…

    PHP 2023年5月26日
    00
  • php实现斐波那契数列代码分享

    以下是详细讲解“php实现斐波那契数列代码分享”的完整攻略: 什么是斐波那契数列? 斐波那契数列是一个以递归方法定义的数列,其中每一项都是前两项之和。即:$f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2) $。 实现斐波那契数列的方法 实现斐波那契数列有多种方式,这里我们演示最基本的两种实现方法。 方法一:递归实现 递归实现是最直接的方法,也…

    PHP 2023年5月23日
    00
  • 浅析PHP递归函数返回值使用方法

    浅析PHP递归函数返回值使用方法 1. 什么是递归函数 递归函数是指在函数内部调用函数本身的函数,这种函数会不断地重复调用自己,直到满足某个退出条件时才停止调用。递归函数通常用于需要反复处理某个问题的情况,例如遍历树形结构或者查找某个数据结构中的数据等。在PHP中,也可以使用递归函数来处理复杂的数据结构或者算法问题。 2. 递归函数返回值的使用方法 在使用递…

    PHP 2023年5月26日
    00
  • 日常整理PHP中简单的图形处理(经典)

    日常整理PHP中简单的图形处理(经典) 在PHP中,图形处理是很常见的需求,为了使图形更加美观或者更加符合需求,我们通常需要对图形进行处理和调整。本文将介绍一些PHP中常用的图形处理方法和技巧,帮助读者更好地实现自己需要的图形。 一、生成缩略图 有时候我们需要对一张图片进行缩放处理,通常是生成一个缩略图,使得图片在浏览时不会影响用户的网络和用户体验。PHP中…

    PHP 2023年5月23日
    00
  • PDO实现学生管理系统

    实现一个学生管理系统,需要使用数据库来存储学生的信息,而PHP提供了许多不同的数据库接口,其中PDO是一个流行的选择,因为它提供了一个统一的方式访问多种不同类型的数据库。 下面是实现PDO学生管理系统的完整攻略: 创建数据库表 首先需要创建一个包含学生信息的数据表。例如,可以创建一个名为“students”的表,包含学生的姓名、年龄、性别、成绩等字段。在执行…

    PHP 2023年5月24日
    00
  • 一个简单安全的PHP验证码类 附调用方法

    让我来为您详细讲解一个简单安全的PHP验证码类,同时附上调用方法。 什么是验证码 验证码通常是一种用于验证用户身份的安全技术。主要应用在网络应用程序中,用于防止恶意的自动机器人的恶意攻击,以及保护网站用户的隐私。 简单安全的PHP验证码类 下面是一个简单安全的PHP验证码类的代码示例: <?php namespace App\Code; class C…

    PHP 2023年5月26日
    00
  • MariaDB 新版本实力逆袭不仅仅是 MySQL 替代品

    MariaDB 新版本实力逆袭不仅仅是 MySQL 替代品 MariaDB 简介 MariaDB是MySQL的一个分支,是一个开源的关系数据库管理系统(RDBMS),由社区开发并由MariaDB公司支持和维护。MariaDB建立在MySQL的基础之上,添加了更多的开源特性和性能优化,并继续维护MySQL的API和命令语法,兼容MySQL的所有数据和应用程序。…

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