nyoj_lvy实战开发系列《一》:发送JSON信息,加密数据解密算法,UnionID机制说明

这是一款来自小程序免费开发制作网的小程序demo源码,希望大家喜欢。

前期小程序开发只进行到根据微信用户登录获取的code 去微信的API去获取到该用户的openId和session_key,到了第二阶段,老大让我重写OAuthManager的代码来实现微信小程序和微信公众号平台获取用户信息的优化,即将OAuthManager重写成父类抽象类,微信小程序(WechatAppManager)和微信公众号(PublicAccountMananger)来继承并开发,具体方法不赘述。。。

在开发微信小程序的时候,由于对于需求的不理解,导致半天都发在获取用户信息的方法上,由于微信小程序没有access_token,所以,用户信息只能从前台发出,后台负责接收并封装JSON格式的用户信息。。。

在这里,我要重点阐述我在发送JSON信息时候所遇到的低级错误!!!

1.发送JSON格式信息,需要Headers添加


  1. ContentType:application/json

后台始终接收不到,就因为少了一个这个headers,接着因为JSON的格式是


  1. {
  2. "code": "CODE",
  3. "wechatAppUserInfo": {
  4. "errMsg": "getUserInfo:ok",
  5. "rawData": "{\"nickName\":\"NICKNAME\",\"gender\":0,\"language\":\"LANGUAGE\",\"city\":\"CITY\",\"province\":\"PROVINCE\",\"country\":\"COUNTRY\",\"avatarUrl\":\"AVATARURL\"}",
  6. "signature": "SIGNATURE",
  7. "encryptData": "ENCRYPTDATA"
  8. }
  9. }

请注意好JSON格式,格式错了也是发不过去的,可以上网在线监测自己的JSON格式,后台接收的时候,我出于方便的目的,用dto的形式接收将json数据封装成一个dto,直接接收


  1. public String getSessionByCode(@RequestBody WechatAppUser wechatAppUser, HttpServletRequest request)

WechatAppUser里只有两个属性(code , wechatAppUserInfo(wechatAppUserInfo)是一个封装类)  我将rawData和encryptData也进行了封装。。。

经过一系列的封装,反序列化之后,我们需要将encryptData数据进行解密,这个解密的过程让我心焦。。。  整了两天才发现原来是自己的数据出问题。。。  加密数据解密算法

接口如果涉及敏感数据(如wx.getUserInfo当中的 openid ),接口的明文内容将不包含敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptData )进行对称解密。 解密算法如下:

1.对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
2.对称解密的目标密文为 Base64_Decode(encryptData),
3.对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节
4.对称解密算法初始向量 iv = aeskey, 同样是16字节 

上网各种百度该解密算法,让我在千万条链接中找到了它 
http://blog.csdn.net/aflight/article/details/13626385 
这个链接的key和iv是自动生成的,需要自己手动修改代码(iv的生成需要传入session_key转化的byte[])


  1. //生成iv
  2. public static AlgorithmParameters generateIV(byte [] iv) throws Exception{
  3. //iv 为一个 16 字节的数组,这里采用和 iOS 端一样的构造方法,数据全为0
  4. AlgorithmParameters params = AlgorithmParameters.getInstance(KEY_ALGORITHM);
  5. params.init(new IvParameterSpec(iv));
  6. return params;
  7. }
  8.  
  9. //转化成JAVA的密钥格式
  10. public static Key convertToKey(byte[] keyBytes) throws Exception{
  11. SecretKey secretKey = new SecretKeySpec(keyBytes,KEY_ALGORITHM);
  12. return secretKey;
  13. }

解密的代码


  1. byte[] data = WechatAppDecryptor.decrypt(wechatAppUser.getWechatAppUserInfo().getEncryptData(),
  2. oAuthResult.getSession_key());
  3. logger.debug("解密得到的数据 : " + new String(data,"UTF-8"));
  4. wechatAppUser.getWechatAppUserInfo().setEncryptDatas(CacheUtil.doJacksonDeserialize(new String(data,"UTF-8"),EncryptData.class));

灰常好,这里我们就可以得到微信用户的基本信息以及最重要的unionId  UnionID机制说明:

如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

简而言之就是根据这个字段,用户在数据库中只会存在一条数据!!!

encryptData 解密后为以下 json 结构


  1. {
  2. "openId": "OPENID",
  3. "nickName": "NICKNAME",
  4. "gender": 1,
  5. "city": "CITY",
  6. "province": "PROVINCE",
  7. "country": "COUNTRY",
  8. "avatarUrl": "AVATARURL",
  9. "unionId": "UNIONID"
  10. }

免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。

本资源来自易用通,如有侵权,请联系站长。

【小程序源码网资源版权风险说明】:
本站为避免不必要的纷争,分享的所有资源中一切可能有版权风险的资源将全部转载自第三方网站或平台,站长只为大家提供相关资源的介绍和跳转引导。 因可能有疏忽大意,所以如有遗漏资源侵犯了您的合法权利,请联系站长删除。
【小程序源码网资源下载使用说明】:
本站所分享的一切QQ小程序源码,thinkphp整站源码,微信小程序源码,图文教程等资源仅供用户学习参考使用,任何人不得作其他用途,违者自行承担所有责任。
【小程序源码网毫无人看的介绍】:
本站又称Z站,原名贼娘网,开站于2018年,换过三任站长,目前站长是第四任站长,本站是一个主要分享免费开源小程序源码/网站源码/免费素材/教程资源的网站,主要小程序资源有用于学习的小程序源码,也有正版原创可商用的小程序源码,是一个公益博客型网站。
【小程序源码网原创源码版权申明】:
未经小程序源码网许可,任何人不得擅自使用本站原创首发源码进行商业行为(除本站VIP用户在期限内,版权无使用限制),否则将依法承担相应赔偿责任。
【小程序源码网转载文章版权申明】:
本站所转载的QQ小程序或微信小程序源码与其他资源仅供学习,任何人不得作其他用途,违者自行承担所有责任。
【小程序源码网站长最后的屁话】:
如有您认为本站有任何侵犯您合法权益的文章,或者您有什么疑问需求,欢迎联系站长QQ,站长24小时在线,备注公司名称和源码版权问题或者需要小程序定制开发等站长业务类型可急速处理,如果您只是交流小程序的一些开发问题或源码问题可以加入QQ群讨论,就不用加站长啦,对于白嫖党,QQ群才是处理问题的天堂,当然站长也欢迎大家骚扰~
小程序源码网 » nyoj_lvy实战开发系列《一》:发送JSON信息,加密数据解密算法,UnionID机制说明
嘿,投喂下嘛!