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

微信小程序可以使用手机号作为用户的唯一标识,可以通过微信提供的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实现一个简单url路由功能实例

    请参考以下完整攻略,步骤如下: 1. 了解URL路由的概念 路由,通俗来说就是将URL映射到对应的程序上去执行,以满足不同需求的访问需求。比如我们可以把 URL 中的参数作为查询数据库的条件,或者是根据 URL 中的参数选择不同的模板文件来渲染页面等等。 2. 编写.htaccess文件 .htaccess是apache生成服务器配置文件通道之一,使用它可以…

    PHP 2023年5月26日
    00
  • 详解PHP中数组函数的巧用

    详解PHP中数组函数的巧用 PHP作为一门脚本语言,常常需要处理大量的数据,而数组作为一种常见的数据结构,其所涉及的操作也非常多。在这里,我们将介绍PHP中一些常用的数组函数,以及它们的一些巧用方法,希望对PHP开发者的工作有所帮助。 implode() / explode() 在处理字符串时,经常会遇到将一串字符串分割成多个子串的情况,或者将多个子串拼接成…

    PHP 2023年5月26日
    00
  • php安装php_rar扩展实现rar文件读取和解压的方法

    安装php_rar扩展可以实现rar文件读取和解压缩。具体步骤如下: 步骤1:确认环境 首先需要确认操作系统及PHP版本。php_rar扩展提供了Linux和Windows版本,同时支持PHP5和PHP7,所以需要根据实际情况选择对应的版本。 步骤2:下载安装文件 下载对应版本的php_rar扩展,可以到官网https://pecl.php.net/pack…

    PHP 2023年5月26日
    00
  • 用asp与php实现百度ping服务的代码

    下面是详细讲解“用asp与php实现百度ping服务的代码”的完整攻略。 1. 什么是百度ping服务 首先,我们需要了解百度ping服务是什么。百度ping服务是百度提供的一项推送服务,可以让站长自动向百度搜索引擎推送新的或变更的网站页。推送方式有两种,分别为XML-RPC API和HTTP API。 2. 实现百度ping服务的代码 2.1 ASP实现百…

    PHP 2023年5月23日
    00
  • php获取当前url地址的方法小结

    当需要获取当前URL地址时,在PHP中有几种不同的方法可以实现。以下是各种方法的详细说明。 1. 使用\$_SERVER[“REQUEST_URI”] 可以使用以下的PHP代码来获取当前URL地址: $current_url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER[…

    PHP 2023年5月26日
    00
  • 超常用的PHP正则表达式收集整理

    超常用的PHP正则表达式收集整理 前言 正则表达式是一个十分强大的工具,可以用来处理各种字符串操作,例如匹配、替换、分割等。在PHP开发中,正则表达式也是一种十分常见的技巧。然而,正则表达式语法复杂,需要我们认真学习和练习。本文将整理收集了一些超常用的PHP正则表达式,供大家参考和学习。 常见正则表达式 匹配中文字符 preg_match(‘/^[\x{4e…

    PHP 2023年5月26日
    00
  • PHP如何将数据库查询结果输出为json格式

    将数据库查询结果以 JSON 格式输出是使用 PHP 开发 Web 应用程序时非常常见的操作,下面是实现这个功能的完整攻略: 步骤一:PDO 连接数据库 要查询数据库并将其结果输出为 JSON 格式,我们需要首先建立与数据库的连接。在 PHP 中,我们可以使用 PDO 库轻松地实现这一功能。以下是建立 PDO 连接的示例代码: try { $conn = n…

    PHP 2023年5月26日
    00
  • PhpStorm配置debug环境的详细过程

    下面是“PhpStorm配置debug环境的详细过程”的完整使用攻略,包括问题原因、解决方法和两个示例说明。 问题原因 在使用PhpStorm进行开发时,需要配置debug环境,便在调试代码时能够时查看变量值和代码执行情况。如果没有正确配置debug环境,将无法进行有效的调试。 解决方法 以下是配置Storm debug环境的方法: 配置Xdebug 首先,…

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