微信小程序获取unionid走过的坑--手把手教你获取

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

1.小程序必须绑定在微信开放平台上,不绑定是没有的(PS:绑定开放平台需要开发者资质认证,认证收费的奥)

2.需要微信用户授权小程序


具体的代码实现(我在index.js的onLoad中实现的)

//index.js
//这是关键 引入RdWXBizDataCrypt.js 这个JS文件是用来解密用的,下面会说到
var WXBizDataCrypt = require('../../utils/cryptojs/RdWXBizDataCrypt.js');//这个地方一定要注意了,路径一定要写正确,不要用系统提示的会报错,../
../才是根路径
//获取应用实例
var app = getApp()
var appId = "你的小程序id";
var secret = '你的小程序secret ';
Page({
  data: {
    motto: 'Hello World',
    userInfo: {},
    hasUserInfo: false,
    canIUse: wx.canIUse('button.open-type.getUserInfo'),
    openId:'',//用户唯一标识
    date:"1999-12-22",
    unionId:'',
    encryptedData:''
  },
  //事件处理函数
  bindViewTap: function() {
    wx.navigateTo({
      url: '../logs/logs'
    })
  },
onLoad: function () {
    var that =this;
    // 登录login 获取code
    wx.login({
      success: res => {
        //发起网络请求
        wx.request({
          url: 'https://api.weixin.qq.com/sns/jscode2session',//通过这个接口来获取到session_key、iv 和encryptedData,encryptedData是一个加密
文,里面就包含了咱们的unionid,但是需要对他进行解密,解密的代码是咱们自己写的我下面有。
          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) {
//到关键地方了 这句代码就是调用了最开头引用的JS文件里的函数进行解密
                var data = pc.decryptData(res.encryptedData, res.iv)
                console.log('解密后 data: ', data)
              }
            })
          },
          fail: function (res) { },
          complete: function (res) { }
        });
      }
    })

  
      // 在没有 open-type=getUserInfo 版本的兼容处理
  },

encryptedData的解密:模仿 官网给的例子中的 Node 的

demo,使用 CryptoJS实现纯 js 下解密用户信息

(网上大部分都是用的java服务器解密的,

但是我在调的时候,到了解密的那一句时,

一直报错。

我们现在用的是直接在微信代码里解密)

借鉴的 https://www.cnblogs.com/cai-rd/p/6816849.html
1.将 CryptoJS 的包放入 小程序的 utils 中(点击下载)(RdWXBizDataCrypt.js不在其中需要自己写
 2. 封装 RdWXBizDataCrypt.js
/**
* Created by rd on 2017/5/4.
*/
// 引入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
3.当写到这里时在index中的解密方法(decryptData())能用了,现在可以运行一下了

获取unionid时走的坑

先看一下官方的说法
GUANFANG

官方说的很好,在满足unionid的条件下接口

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code 返回unionid,可是自始至终我也没搞明白这个条件是啥,我一直以为微信开放品台没有给我分配unionid,但是当我用解密后才发现原来我有unionid只是这个接口没返回。 所以,通过这个接口获得unionid的小伙伴千万别再这个上面死磕了,赶紧试试解密吧。我死磕两天,都绝望了。

有知道什么时候https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&

grant_type=authorization_code

这个接口才返回unionid的小伙伴,麻烦评论一下谢谢。


阅读更多
文章标签: 微信小程 unioni
个人分类: 微信小程
想对作者说点什么? 我来说一句

微信登录获取unionid

2017年12月07日 9KB 下载

没有更多推荐了,返回首页

不良信息举报

微信小程序获取unionid走过的坑--手把手教你获取

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭