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


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

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

    具体的代码实现(我在index.js的onLoad中实现的)
    encryptedData的解密:模仿 官网给的例子中的 Node 的demo,使用 CryptoJS实现纯 js 下解密用户信(网上大部分都是用的java服务器解密的,但是我在调的时候,到了解密的那一句时,一直报错。我们现在用的是直接在微信代码里解密)

    借鉴的 https://www.cnblogs.com/cai-rd/p/6816849.html

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


    RdWXBizDataCrypt.js
    /**
    * Created by rd on 2017/5/4.
    */
    // 引入CryptoJSvar
    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:

    //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;
    wx.login({
    success: res => {
    //发起网络请求
    wx.request({
    //这是我自己的java服务器的接口,将login()获得的code发送的服务器换取session_key
    url: 'https://abc.anzhonghui.xyz/WxtestServlet/UserController?method=getUnionId',
    data: {
    js_code: res.code,
    },
    header: {
    'content-type': 'application/x-www-form-urlencoded'
    },
    method: 'GET',
    success: function (res) {
    console.log(res.data.session_key)
    //拿到session_key实例化WXBizDataCrypt()这个函数在下面解密用
    var pc = new WXBizDataCrypt(appId, res.data.session_key)
    wx.getUserInfo({
    success: function (res) {
    //拿到getUserInfo()取得的res.encryptedData, res.iv,调用decryptData()解密
    var data = pc.decryptData(res.encryptedData, res.iv)
    // data.unionId就是咱们要的东西了
    app.globalData.unionid = data.unionId
    console.log('解密后 unionid: ', app.globalData.unionid)
    },
    fail: function (res) {
    console.log(res)
    }
    })
    },
    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时走的坑
    先看一下官方的说法

    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的小伙伴,麻烦评论一下谢谢。
    我写了一个获取unionid的小demo,注释都写了,按照这个demo就能获取到,前提是我上面说的几个条件都具备。
    CSDN着实是让人恶心,为了钱钱钱,想尽了法子压榨,剥削。又把积分改成了二十五,我上传到了百度网盘,免费分享给大家,大家一定要保持程序员开元的优良传统。
    复制这段内容后打开百度网盘手机App,操作更方便哦 链接:https://pan.baidu.com/s/1UPGZ1DH1JzwfOkzgcOwqZA 提取码:h14y


    原文链接:https://blog.csdn.net/a493001894/article/details/80323403

  • 相关阅读:
    找东西
    检测内存泄漏
    八月份月度反思
    博客之路
    快速开发~Rafy框架的初步认识
    VS快捷键的简单总结
    web前端使用工具的总结
    直接把数据库中的数据保存在CSV文件中
    AngularJs HTML DOM、AngularJS 事件以及模块的学习(5)
    AngularJS控制器和AngularJS过滤器的学习(3)
  • 原文地址:https://www.cnblogs.com/Ph-one/p/12171345.html
Copyright © 2020-2023  润新知