微信小程序获取unionID思路整理

小程序能够获取到unionid的前提

1.小程序必须绑定在微信开放平台上,不绑定是没有的(PS:绑定开放平台需要开发者资质认证,认证收费的奥)
2.需要微信用户授权小程序
具体的代码实现(我在index.js的onLoad中实现的)
encryptedData的解密:模仿 官网给的例子中的 Node 的demo,使用 CryptoJS实现纯 js 下解密用户信(网上大部分都是用的java服务器解密的,但是我在调的时候,到了解密的那一句时,一直报错。我们现在用的是直接在微信代码里解密)

1.加入解密需要的文件,将 CryptoJS 的包放入 小程序的 utils 中(GitHub点击下载)(RdWXBizDataCrypt.js不在其中需要自己写,下面有附的代码,直接复制即可)

RdWXBizDataCrypt.js

// 引入CryptoJS
var Crypto = require('/cryptojs.js').Crypto;
var app = getApp();

function RdWXBizDataCrypt(appId, sessionKey) {
  this.appId = appId
  this.sessionKey = sessionKey
}

RdWXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) {
  // base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()进行 base64解码
  var encryptedData = Crypto.util.base64ToBytes(encryptedData)
  var key = Crypto.util.base64ToBytes(this.sessionKey);
  var iv = Crypto.util.base64ToBytes(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 = RdWXBizDataCrypt

2.index.js页面中调用解密演示

index.js

//获取应用实例
var app = getApp()
var util = require('../../utils/util.js');
var WXBizDataCrypt = require('../../utils/cryptojs/RdWXBizDataCrypt.js');
var appId = '你的微信appid';
var secret = '你的微信secret';
Page({

 
  onLoad: function (options) {
    var that = this
    setInterval(function () {
      that.setData({
        nowTemp: app.globalData.nowTemp,
      })
    }, 1000) //循环时间 这里是1
  
    wx.login({
      success: res => {
        //发起网络请求,这里可能需要服务器来求情https://api.weixin.qq.com/sns/jscode2session,不过刚才我试了试,开发者模式下也能获取到,好久不玩微信小程序了,不知道现在更新成什么样,你试一下
        wx.request({
          url: 'https://api.weixin.qq.com/sns/jscode2session',
          data: {
            appid: appId,
            secret: secret,
            js_code: res.code,
            grant_type: 'authorization_code'
          },
          header: {
            "Content-Type": "application/x-www-form-urlencoded"
          },
          method: 'GET',
          success: function (res) {
            var pc = new WXBizDataCrypt(appId, res.data.session_key)
            wx.getUserInfo({
              success: function (res) {
                var data = pc.decryptData(res.encryptedData, res.iv)
                app.globalData.unionid = data.unionId
                //解密后的id
                console.log('解密后 unionid: ', app.globalData.unionid)
              }
            })


          },
          fail: function (res) { },
          complete: function (res) { }
        });
      }
    })
  },
  

})


3.当写到这里时在index中的解密方法(decryptData())能用了,现在可以运行一下了

再补充一下关于java服务器的事:
其实java做的事很简单,微信小程序有些接口不能用,比如https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code,这个接口现在就不能在小程序用了,但是他又是必须的,微信官方就让咱们用自己的服务器去用这个接口。

具体步骤 :
1.小程序请求自己的java服务器接口
2.java服务器收到请求,开始请求https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code  这个接口
3.java服务器将请求到的数据返回给微信小程序
4.完事
对就这么简单,java就做了一个中间过度的作用,这样就起到了安全作用,具体为什么安全我也不知道,官方说安全我也这样说了

获取unionid时注意

附录

微信官方文档

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#%E5%8A%A0%E5%AF%86%E6%95%B0%E6%8D%AE%E8%A7%A3%E5%AF%86%E7%AE%97%E6%B3%95

 

 

 

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackieDYH

谢谢您嘞!我会继续加油地

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值