最近在弄小程序,阅读了微信官方文档,上面说可以在后台获取用户的openid和unionid这些敏感信息,当然网上也有不少帖子,有的是在前台获取的,不过这里不太建议把这些敏感信息放在前台,毕竟不太安全。。。你懂得。如果你是一名Java工程师的话那么恭喜你,在接下来的官方文档中会让你气不打一出来,为啥?因为敏感信息放在了微信的加密字段里,官方的对称解密demo有php,node..。。。等。就是java,这里给大家分享一下,当然也借鉴了网上很多骨灰级大神的文章。

小程序代码如下:

// 登录wx.login({success: function (r) {var code = r.code;//登录凭证if (code) {//2、调用获取用户信息接口wx.getUserInfo({success: function (res) {console.log({ encryptedData: res.encryptedData, iv: res.iv, code: code })//3.解密用户信息 获取unionId//...//3.请求自己的服务器,解密用户信息 获取unionId等加密信息wx.request({url: '',//自己的服务接口地址method: 'post',header: {'content-type': 'application/x-www-form-urlencoded'},data: { encryptedData: res.encryptedData, iv: res.iv, code: code },success: function (data) {//4.解密成功后 获取自己服务器返回的结果if (data.data.status == 1) {var userInfo_ = data.data.userInfo;console.log(userInfo_)} else {console.log('解密失败')}},fail: function () {console.log('系统错误')}})},fail: function () {console.log('获取用户信息失败')}})} else {console.log('获取用户登录态失败!' + r.errMsg)}},fail: function () {callback(false)}})

发送请求的时候好多人不知道在小程序里如何请求自己的接口,这里微信官方文档封装了一个wx.request方法,在这里有各种参数,如url代表路径,data代表请求数据,method代表请求的方法,其实你把它当做ajax就行了,不过这里有个不同的就是这里的请求路径的域名正式发布的时候必须是Https协议的,不过开发的时候自己配置不校验域名就行了,如下:

下面是java对称解密的方法

1、首先是工具类

package com.dai7.util;import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.spec.InvalidParameterSpecException;public class AesUtil {static {//BouncyCastle是一个开源的加解密解决方案,主页在http://www.bouncycastle.org/Security.addProvider(new BouncyCastleProvider());}/*** AES解密** @param data           //密文,被加密的数据* @param key            //秘钥* @param iv             //偏移量* @param encodingFormat //解密后的结果需要进行的编码* @return* @throws Exception*/public static String decrypt(String data, String key, String iv, String encodingFormat) throws Exception {//被加密的数据byte[] dataByte = Base64.decodeBase64(data);//加密秘钥byte[] keyByte = Base64.decodeBase64(key);//偏移量byte[] ivByte = Base64.decodeBase64(iv);try {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");parameters.init(new IvParameterSpec(ivByte));cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化byte[] resultByte = cipher.doFinal(dataByte);if (null != resultByte && resultByte.length > 0) {String result = new String(resultByte, encodingFormat);return result;}return null;} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidParameterSpecException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (InvalidAlgorithmParameterException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}return null;}}

2、后台接口

 @ResponseBody@RequestMapping(value = "/decodeUserInfo", method = RequestMethod.POST)public Map decodeUserInfo(String encryptedData, String iv, String code) {Map map = new HashMap();//登录凭证不能为空if (code == null || code.length() == 0) {map.put("status", 0);map.put("msg", "code 不能为空");return map;}//小程序唯一标识   (在微信小程序管理后台获取)String wxspAppid = "";//小程序的 app secret (在微信小程序管理后台获取)String wxspSecret = "";//授权(必填)String grant_type = "authorization_code";1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid //请求参数String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type;//发送请求String sr = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params);//解析相应内容(转换成json对象)JSONObject json = JSONObject.parseObject(sr);//获取会话密钥(session_key)String session_key = json.get("session_key").toString();//用户的唯一标识(openid)String openid = (String) json.get("openid");2、对encryptedData加密数据进行AES解密 try {String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8");if (null != result && result.length() > 0) {map.put("status", 1);map.put("msg", "解密成功");JSONObject userInfoJSON = JSONObject.parseObject(result);Map userInfo = new HashMap();userInfo.put("openId", userInfoJSON.get("openId"));userInfo.put("nickName", userInfoJSON.get("nickName"));userInfo.put("gender", userInfoJSON.get("gender"));userInfo.put("city", userInfoJSON.get("city"));userInfo.put("province", userInfoJSON.get("province"));userInfo.put("country", userInfoJSON.get("country"));userInfo.put("avatarUrl", userInfoJSON.get("avatarUrl"));userInfo.put("unionId", userInfoJSON.get("unionId"));map.put("userInfo", userInfo);return map;}} catch (Exception e) {e.printStackTrace();}map.put("status", 0);map.put("msg", "解密失败");return map;}

需要注意的是,工具类里用到了第三方的加解密类库。
没有用maven的同学http://download.csdn.net/download/weixin_39214304/10222169进去下载就行
使用了maven的同学在pom.xml添加依赖

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.55</version></dependency>

微信小程序在java后台获取用户unionid等敏感信息相关推荐

  1. Java小程序post如何传参,微信小程序向Java后台传输参数的方法实现

    微信小程序向Java后台传输参数的方法实现 首先,微信小程序我使用的是微信web开发者工具 想要向后台传输数据,需要在js中写 在微信小程序的官方文档中可以看到一个api叫wx.request它的作用 ...

  2. 微信小程序及Java后台测试登录

    微信小程序及Java后台测试登录 文章目录 微信小程序及Java后台测试登录 一.使用的工具以及开发环境 二.微信端登录代码. 第一种方式,使用wx.getUserInfo直接获取微信头像,昵称. 第 ...

  3. 微信小程序与Java后台的通信

    一.写在前面 最近接触了小程序的开发,后端选择Java,因为小程序的代码运行在腾讯的服务器上,而我们自己编写的Java代码运行在我们自己部署的服务器上,所以一开始不是很明白小程序如何与后台进行通信的, ...

  4. 《微信小程序》微信小程序用java后台连接数据库进行操作。

    微信小程序与Java后台的通信 一.写在前面 最近接触了小程序的开发,后端选择Java,因为小程序的代码运行在腾讯的服务器上,而我们自己编写的Java代码运行在我们自己部署的服务器上,所以一开始不是很 ...

  5. 微信小程序登录Java后台接口

    微信小程序登录java后台接口 首先看一下微信小程序的开发文档: 微信小程序开发文档 步骤: 小程序端向微信接口服务发送请求--wx.login():获取到登录临时凭证code 小程序端拿着获取到的c ...

  6. 微信小程序学习9:获取用户信息进行登录操作 wx.getUserProfile

    微信小程序学习9:获取用户信息进行登录操作wx.getUserProfile 2021年4月份左右微信对获取用户的API进行了更改.使用wx.getUserInfo只能获取用户的匿名信息. 要获取用户 ...

  7. uni-app 微信小程序 用高德sdk获取地理位置,以及天气信息

    uni-app 微信小程序采用高德sdk获取地理位置和天气信息主要有以下几个步骤: 1. 注册高德开发者,并获取应用key 概述-微信小程序插件 | 高德地图API 在这个网页最下面,按步骤来就可以了 ...

  8. java小程序详解_微信小程序登录Java后台接口(详解,附示例代码)

    首先看一下官方文档 地址:微信小程序官方文档API登录接口 我们先对官方给的时序图进行简单的分析 1.当小程序调用wx.login()时,会获得一个code(临时登录凭证),然后我们需要用wx.req ...

  9. 微信小程序——利用java后台解析Excel文件的数据

    后台为java,ssm框架 1.在SpringMvc.xml文件中增加Spring文件上传的解析器 <bean id="multipartResolver"class=&qu ...

最新文章

  1. Centos 6安装python3.5
  2. ZH奶酪:Ionic通过angularJS+tabs-item-hide实现自定义隐藏tab
  3. 026_使用eclipse生成hashCode和equals方法
  4. [3]MVC3中使用Telerik(转)
  5. 计算机网络是如何通信的【二】
  6. 奇葩面试官让我回去等通知!看我怎么虐他!
  7. Spring Security构建Rest服务-0600-SpringSecurity基本原理
  8. apache camel file(二)
  9. pc客户端软件自动化测试工具,PC客户端自动化测试工具--pywinauto
  10. oracle12c备份和恢复,oracle12C使用RMAN备份和恢复
  11. unable to find valid certification path to requested target的异常解决办法
  12. 锻炼!!!!最佳时间!!!!希望大家都要记得锻炼身体!!!!
  13. 南卡小音舱蓝牙耳机评测:超轻腔体震撼音质
  14. 学习典范【管理学之七】
  15. 用UDP实现简易的聊天室
  16. 【UWB 定位】高精度定位
  17. 远程访问本地mysql
  18. 如何做好英文外贸B2C网站的优化
  19. excel的下载导出
  20. 中国电信设的“互联星空”陷井

热门文章

  1. 高效使用Mac标签功能
  2. 2018秦皇岛ccpc赛后总结
  3. 《Python编程:从入门到实践》基础知识部分笔记和作业
  4. python之tkinter模块——基于tk得图片文字
  5. 一种MATLAB中解复杂方程(高次、指数、无解析解)的方法,可以在实现论文中公式时使用,solve函数。
  6. Ubuntu16.04如何调整屏幕分辨率至1920*1080
  7. ios10怎么设置电池颜色_IOS10秘籍:如何调整降低白点值让屏幕更暗
  8. 敏捷开发松结对编程系列:L型代码结构案例StatusFiltersDropdownList(下)
  9. R语言学习 文本处理
  10. Python3 编程第一弹 斐波纳契数列