IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 小程序 ---- (获取手机号码) -> 正文阅读

[移动开发]小程序 ---- (获取手机号码)

小程序 ---- (获取手机号码)

一、获取session_key

验证登录状态,获取openid和session_key。

由于目前小程序没有提供API可以调用获取手机号码,所以如果想要获取手机号码只能是,就先要在app.js检测用户登录状态,如果没有登录或者状态过期了,就跳转到login页面,引导用户点击button调用按钮的API,即open-type=“getPhoneNumber” bindgetphonenumber=“getPhoneNumber”

app.js如下

let that = this;
// 验证登录
wx.checkSession({
  success: (res) => {},
  fail: () => {
    wx.login({
      success: res => {
        if (res.errMsg == 'login:ok') {
          wx.request({
            url: `https://api.weixin.qq.com/sns/jscode2session?appid=你的小程序appid&secret=你的小程序secret&js_code=${res.code}&grant_type=authorization_code`,
            method: 'GET',
            success: (result) => {
              // 这里可以把数据存在Storage里面,也可以这样直接用,我们选择后者
              that.globalData.userinfo.openid = result.data.openid;
              that.globalData.userinfo.session_key = result.data.session_key;
              wx.navigateTo({
                url: '/pages/login/index',
              })
            }
          })
        }
      }
    })
  }
})

login.wxml如下:

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">登录</button>

二、解析手机号码

看一下官方的用法获取到的数据:

这里拿到两个数据,用户手机号码就隐藏在这两串数据里面,我们参考一下官方的说明,看要如何进行解密

官方的用法
获取的结果:
获取的结果
参考官方的说明,发现都是Base64_Decode,故我们选择crypto.js进行数据分析:
在这里插入图片描述
点击下载crypto.js,然后将文件放置在文件夹里面,路径如下:
路径如下
封装解密的crypto.js文件,放置于utils文件夹里面:
封装
crypto.js的代码如下:

var Crypto = require('./cryptojs/cryptojs.js').Crypto;
var app = getApp();
function CRYPOT(appId, sessionKey) {
    this.appId = appId
    this.sessionKey = sessionKey
}
CRYPOT.prototype.decryptData = function(encryptedData, iv) {
    // base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()进行 base64解码
    var encryptedData = Crypto.util.base64ToBytes(encryptedData)
    // console.log(sessionKey)
    var key = Crypto.util.base64ToBytes(this.sessionKey);
    var iv = Crypto.util.base64ToBytes(iv);
    // console.log(encryptedData,key,iv)
    // 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
    var mode = new Crypto.mode.CBC(Crypto.pad.pkcs7);
    try {
        // 解密
        var bytes = Crypto.AES.decrypt(encryptedData, key, {
            asBpytes: true,
            iv: iv,
            mode: mode
        });
        var decryptResult = JSON.parse(bytes);

    } catch (err) {
        console.log(err)
    }
    if (decryptResult.watermark.appid !== this.appId) {
        console.log(err)
    }
    return decryptResult
}
module.exports = CRYPOT

login.js如下:

getPhoneNumber(e) {
  if (e.detail.errMsg == 'getPhoneNumber:ok') {
    let phone = e.detail.encryptedData;
    let iv = e.detail.iv;
    const CRYPOT= require('../../utils/crypot.js');
    const cp = new CRYPOT('你的小程序appid', app.globalData.userinfo.session_key);
    const data = cp .decryptData(phone, iv);
    app.globalData.userinfo.phone = data.phoneNumber;
    // 这里request是自己封装的网络请求模块,下面会分享出来,用wx.request也可以
    request('/login',{phoneNum: data.phoneNumber},'GET')
    .then(res => {
      wx.setStorageSync('token', res.data.data)
      wx.showToast({
        title: '登录成功',
      })
      setTimeout(()=> {
        wx.navigateBack({
          delta: 1,
        })
      },1000)
    })
  } else {}
},

以上就可以获取用户手机号码进行登录了,下面分享request.js。

这里哔哔两句,公司的辣鸡后端这些都不做,要前端做,踏马了个巴子的,无了个大语!

在这里插入图片描述

exports.request = function (requestMapping, data, requestWay, contentType) {
  wx.showLoading({
    title: '请稍后',
  })
  return new Promise(function (resolve, reject) {
    wx.request({
      url: 'http://159.75.41.107:8082' + requestMapping,
      data: data,
      header: {
        'content-type': contentType || "application/x-www-form-urlencoded", // 默认值
        'token': wx.getStorageSync('token')
      },
      timeout: 3000,
      method: requestWay,
      success(res) {
        //console.log(res)
        if (res.data.success == false || res.data.statusCode == 404) {
          reject(res)
        } else {
          resolve(res)
        }
      },
      fail: (e) => {
        wx.showToast({
          title: '连接失败',
          icon: 'none'
        })
      },
      complete: () => {
        wx.hideLoading()
      }
    })
  })
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-30 15:43:53  更:2021-11-30 15:44:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:41:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码