2.需要微信用户授权小程序
具体的代码实现(我在index.js的onLoad中实现的)encryptedData的解密:模仿官网给的例子中的Node的demo,使用实现纯js下解密用户信(网上大部分都是用的java服务器解密的,但是我在调的时候,到了解密的那一句时,一直报错。我们现在用的是直接在微信代码里解密)
借鉴的https://www.cnblogs.com/cai-rd/p/6816849.html
1.加入解密需要的文件,将CryptoJS的包放入小程序的utils中()(RdWXBizDataCrypt.js不在其中需要自己写,下面有附的代码,直接复制即可)
RdWXBizDataCrypt.js/Createdbyrdon2017/5/4.///引入CryptoJSvarCrypto=require('/cryptojs.js').Crypto;varapp=getApp();functionRdWXBizDataCrypt(appId,sessionKey){this.appId=appIdthis.sessionKey=sessionKey}RdWXBizDataCrypt.prototype.decryptData=function(encryptedData,iv){//base64decode:使用CryptoJS中Crypto.util.base64ToBytes()进行base64解码varencryptedData=Crypto.util.base64ToBytes(encryptedData)varkey=Crypto.util.base64ToBytes(this.sessionKey);variv=Crypto.util.base64ToBytes(iv);//对称解密使用的算法为AES-128-CBC,数据采用PKCS#7填充varmode=newCrypto.mode.CBC(Crypto.pad.pkcs7);try{//解密varbytes=Crypto.AES.decrypt(encryptedData,key,{asBpytes:true,iv:iv,mode:mode});vardecryptResult=JSON.parse(bytes);}catch(err){console.log(err)}if(decryptResult.watermark.appid!==this.appId){console.log(err)}returndecryptResult}module.exports=RdWXBizDataCrypt
2.我在index.js中调用解密的index.js:
//index.js//这是关键引入RdWXBizDataCrypt.js这个JS文件是用来解密用的,下面会说到//这个地方一定要注意了,路径一定要写正确,不要用系统提示的会报错,../../才是根路径varWXBizDataCrypt=require('../../utils/cryptojs/RdWXBizDataCrypt.js');//获取应用实例varapp=getApp()varappId="你的小程序id";varsecret='你的小程序secret';Page({data:{motto:'HelloWorld',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(){varthat=this;wx.login({success:res={//发起网络请求wx.request({//这是我自己的java服务器的接口,将login()获得的code发送的服务器换取session_keyurl:'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()这个函数在下面解密用varpc=newWXBizDataCrypt(appId,res.data.session_key)wx.getUserInfo({success:function(res){//拿到getUserInfo()取得的res.encryptedData,res.iv,调用decryptData()解密vardata=pc.decryptData(res.encryptedData,res.iv)//data.unionId就是咱们要的东西了app.globalData.unionid=data.unionIdconsole.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服务器收到请求,开始请求
3.java服务器将请求到的数据返回给微信小程序
4.完事
对就这么简单,java就做了一个中间过度的作用,这样就起到了安全作用,具体为什么安全我也不知道,官方说安全我也这样说了
获取unionid时走的坑先看一下官方的说法
官方说的很好,在满足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













