微信数据解密程序简单实现

本文介绍了如何在微信小程序中实现数据解密,以便将加密数据备份到自定义数据库。首先,通过code换取session_key和openid,然后使用AES-CBC解密encryptedData,最后将解密后的用户信息存入数据库。
摘要由CSDN通过智能技术生成

开发过微信程序的,小程序的基本都知道微信小程序从微信服务那边获取到的数据好多一部分数据都是加密的,所以你在取到这些数据的时候想往我们自己的数据库进行备份数据的话就需要对这些加密的数据进行解密,解密完成才能往我们自己的数据库进行数据同步。好了直接上代码了。。。。。在此附上一份微信数据解密的流程图供大家熟悉----------------------


(服务端 java)自己的服务器发送code到微信服务器获取openid(用户唯一标识)和session_key(会话密钥),
最后将encryptedData、iv、session_key通过AES解密获取到用户敏感数据
好了上Controller层代码--》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

1、获取秘钥并处理解密的controller

  1. /**
  2. * 解密用户敏感数据
  3. *
  4. * @param encryptedData 明文,加密数据
  5. * @param iv 加密算法的初始向量
  6. * @param code 用户允许登录后,回调内容会带上 code(有效期五分钟),开发者需要将 code 发送到开发者服务器后台,使用code 换取 session_key api,将 code 换成 openid 和 session_key
  7. * @return
  8. */
  9. @ResponseBody
  10. @RequestMapping(value = "/decodeUser", method = RequestMethod.POST)
  11. public Map decodeUser(String encryptedData, String iv, String code) {
  12. Map map = new HashMap();
  13. //登录凭证不能为空
  14. if (code == null || code.length() == 0) {
  15. map.put( "status", 0);
  16. map.put( "msg", "code 不能为空");
  17. return map;
  18. }
  19. //小程序唯一标识 (在做小程序的时候无论是公众号还是小程序都需要申请账号注册,所以在注册成功后会有一个唯一标识id
  20.               在微信小程序管理后台获取)
  21. String wxspAppid = "wxd8980e77d335c871";
  22. //小程序的 app secret (secret 同样是在注册成功后获取到的随机码,在微信小程序管理后台获取)
  23. String wxspSecret = "85d29ab4fa8c797423f2d7da5dd514cf";
  24. //授权(这个code就是前台获取到的微信数据那边的授权码,这里写死了,必填)
  25. String grant_type = "authorization_code";
  26. 1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid
  27. //请求参数
  28. String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type;
  29. //发送请求
  30. String sr = HttpRequest.sendGet( "https://api.weixin.qq.com/sns/jscode2session", params);
  31. //解析相应内容(转换成json对象)
  32. JSONObject json = JSONObject.fromObject(sr);
  33. //获取会话密钥(session_key)
  34. String session_key = json.get( "session_key").toString();
  35. //用户的唯一标识(openid)
  36. String openid = (String) json.get( "openid");
  37. 2、对encryptedData加密数据进行AES解密
  38. try {
  39. String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8");
  40. if ( null != result && result.length() > 0) {
  41. map.put( "status", 1);
  42. map.put( "msg", "解密成功");
  43.                    // 这个时候就可以去注入我们自己的service接口去往自己的数据库去同步数据了
  44. JSONObject userInfoJSON = JSONObject.fromObject(result);
  45. Map userInfo = new HashMap();
  46. userInfo.put( "openId", userInfoJSON.get( "openId"));
  47. userInfo.put( "nickName", userInfoJSON.get( "nickName"));
  48. userInfo.put( "gender", userInfoJSON.get( "gender"));
  49. userInfo.put( "city", userInfoJSON.get( "city"));
  50. userInfo.put( "province", userInfoJSON.get( "province"));
  51. userInfo.put( "country", userInfoJSON.get( "country"));
  52. userInfo.put( "avatarUrl", userInfoJSON.get( "avatarUrl"));
  53. userInfo.put( "unionId", userInfoJSON.get( "unionId"));
  54. map.put( "userInfo", userInfo);
  55. return map;
  56. }
  57. } catch (Exception e) {
  58. e.printStackTrace();
  59. }
  60. map.put( "status", 0);
  61. map.put( "msg", "解密失败");
  62. return map;
  63. }

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》上需要解密的工具类--------------

解密工具类 AesCbcUtil 

  1. import org.apache.commons.codec.binary.Base64;
  2. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  3. import javax.crypto.BadPaddingException;
  4. import javax.crypto.Cipher;
  5. import javax.crypto.IllegalBlockSizeException;
  6. import javax.crypto.NoSuchPaddingException;
  7. import javax.crypto.spec.IvParameterSpec;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值