微信小程序通过code去获取微信用户的加密信息

今天项目要获取用户信息,我发现官方给的解密demo就是没有java  我ca,我就找了这哥们的  (多谢   @未来之路   这哥们的答案)

一、微信小程序

第一步:调用 wx.login获取code 文档地址

第二步:判断用户是否授权读取用户信息 文档地址

第三步:调用wx.getUserInfo读取用户数据 文档地址

第四步:由于小程序后台授权域名无法授权微信的域名,所以我们只能通过我们自己的服务器去调用微信服务器去获取用户信息,故我们将wx.login获取code 和 wx.getUserInfo 获取的encryptedData与iv 通过wx.request 请求传入后台

服务器返回的数据:

小程序代码:

[html] view plain copy

  1. //调用登录接口,获取 code  
  2. wx.login({  
  3.   success: function (res) {  
  4.     wx.getSetting({  
  5.       success(setRes) {  
  6.         // 判断是否已授权  
  7.         if (!setRes.authSetting['scope.userInfo']) {  
  8.           // 授权访问  
  9.           wx.authorize({  
  10.             scope: 'scope.userInfo',  
  11.             success() {  
  12.               //获取用户信息  
  13.               wx.getUserInfo({  
  14.                 lang: "zh_CN",  
  15.                 success: function (userRes) {  
  16.                   //发起网络请求  
  17.                   wx.request({  
  18.                     url: config.loginWXUrl,  
  19.                     data: {  
  20.                       code: res.code,  
  21.                       encryptedData: userRes.encryptedData,  
  22.                       iv: userRes.iv  
  23.                     },  
  24.                     header: {  
  25.                       "Content-Type": "application/x-www-form-urlencoded"  
  26.                     },  
  27.                     method: 'POST',  
  28.                     //服务端的回掉  
  29.                     success: function (result) {  
  30.                       var data = result.data.result;  
  31.                       data.expireTime = nowDate + EXPIRETIME;  
  32.                       wx.setStorageSync("userInfo", data);  
  33.                       userInfo = data;  
  34.                     }  
  35.                   })  
  36.                 }  
  37.               })  
  38.             }  
  39.           })  
  40.         } else {  
  41.           //获取用户信息  
  42.           wx.getUserInfo({  
  43.             lang: "zh_CN",  
  44.             success: function (userRes) {  
  45.               //发起网络请求  
  46.               wx.request({  
  47.                 url: config.loginWXUrl,  
  48.                 data: {  
  49.                   code: res.code,  
  50.                   encryptedData: userRes.encryptedData,  
  51.                   iv: userRes.iv  
  52.                 },  
  53.                 header: {  
  54.                   "Content-Type": "application/x-www-form-urlencoded"  
  55.                 },  
  56.                 method: 'POST',  
  57.                 success: function (result) {  
  58.                   var data = result.data.result;  
  59.                   data.expireTime = nowDate + EXPIRETIME;  
  60.                   wx.setStorageSync("userInfo", data);  
  61.                   userInfo = data;  
  62.                 }  
  63.               })  
  64.             }  
  65.           })  
  66.         }  
  67.       }  
  68.     })  
  69.   }  
  70. })  

 

二、java服务端

根据code获取openid与解码用户信息 代码

所需要的jar包

[java] view plain copy

  1. <dependency>  
  2.    <groupId>org.codehaus.xfire</groupId>  
  3.    <artifactId>xfire-core</artifactId>  
  4.    <version>1.2.6</version>  
  5. </dependency>  
  6. <dependency>  
  7.    <groupId>org.bouncycastle</groupId>  
  8.    <artifactId>bcprov-jdk16</artifactId>  
  9.    <version>1.46</version>  
  10. </dependency>  

[java] view plain copy

  1. /** 
  2.  * 微信小程序信息获取 
  3.  *  
  4.  * @author zhy 
  5.  */  
  6. public class WXAppletUserInfo {  
  7.     private static Logger log = Logger.getLogger(WXAppletUserInfo.class);  
  8.       
  9.     /** 
  10.      * 获取微信小程序 session_key 和 openid 
  11.      *  
  12.      * @author zhy 
  13.      * @param code 调用微信登陆返回的Code 
  14.      * @return 
  15.      */  
  16.     public static JSONObject getSessionKeyOropenid(String code){  
  17.         //微信端登录code值  
  18.         String wxCode = code;  
  19.         ResourceBundle resource = ResourceBundle.getBundle("weixin");   //读取属性文件  
  20.         String requestUrl = resource.getString("url");  //请求地址 https://api.weixin.qq.com/sns/jscode2session  
  21.         Map<String,String> requestUrlParam = new HashMap<String,String>();  
  22.         requestUrlParam.put("appid", resource.getString("appId"));  //开发者设置中的appId  
  23.         requestUrlParam.put("secret", resource.getString("appSecret")); //开发者设置中的appSecret  
  24.         requestUrlParam.put("js_code", wxCode); //小程序调用wx.login返回的code  
  25.         requestUrlParam.put("grant_type""authorization_code");    //默认参数  
  26.           
  27.         //发送post请求读取调用微信 https://api.weixin.qq.com/sns/jscode2session 接口获取openid用户唯一标识  
  28.         JSONObject jsonObject = JSON.parseObject(UrlUtil.sendPost(requestUrl, requestUrlParam));  
  29.         return jsonObject;  
  30.     }  
  31.       
  32.     /** 
  33.      * 解密用户敏感数据获取用户信息 
  34.      *  
  35.      * @author zhy 
  36.      * @param sessionKey 数据进行加密签名的密钥 
  37.      * @param encryptedData 包括敏感数据在内的完整用户信息的加密数据 
  38.      * @param iv 加密算法的初始向量 
  39.      * @return 
  40.      */  
  41.     public static JSONObject getUserInfo(String encryptedData,String sessionKey,String iv){  
  42.         // 被加密的数据  
  43.         byte[] dataByte = Base64.decode(encryptedData);  
  44.         // 加密秘钥  
  45.         byte[] keyByte = Base64.decode(sessionKey);  
  46.         // 偏移量  
  47.         byte[] ivByte = Base64.decode(iv);  
  48.         try {  
  49.                // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要  
  50.             int base = 16;  
  51.             if (keyByte.length % base != 0) {  
  52.                 int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);  
  53.                 byte[] temp = new byte[groups * base];  
  54.                 Arrays.fill(temp, (byte0);  
  55.                 System.arraycopy(keyByte, 0, temp, 0, keyByte.length);  
  56.                 keyByte = temp;  
  57.             }  
  58.             // 初始化  
  59.             Security.addProvider(new BouncyCastleProvider());  
  60.             Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");  
  61.             SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");  
  62.             AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");  
  63.             parameters.init(new IvParameterSpec(ivByte));  
  64.             cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化  
  65.             byte[] resultByte = cipher.doFinal(dataByte);  
  66.             if (null != resultByte && resultByte.length > 0) {  
  67.                 String result = new String(resultByte, "UTF-8");  
  68.                 return JSON.parseObject(result);  
  69.             }  
  70.         } catch (NoSuchAlgorithmException e) {  
  71.             log.error(e.getMessage(), e);  
  72.         } catch (NoSuchPaddingException e) {  
  73.             log.error(e.getMessage(), e);  
  74.         } catch (InvalidParameterSpecException e) {  
  75.             log.error(e.getMessage(), e);  
  76.         } catch (IllegalBlockSizeException e) {  
  77.             log.error(e.getMessage(), e);  
  78.         } catch (BadPaddingException e) {  
  79.             log.error(e.getMessage(), e);  
  80.         } catch (UnsupportedEncodingException e) {  
  81.             log.error(e.getMessage(), e);  
  82.         } catch (InvalidKeyException e) {  
  83.             log.error(e.getMessage(), e);  
  84.         } catch (InvalidAlgorithmParameterException e) {  
  85.             log.error(e.getMessage(), e);  
  86.         } catch (NoSuchProviderException e) {  
  87.             log.error(e.getMessage(), e);  
  88.         }  
  89.         return null;  
  90.     }  
  91. }  


发送请求的代码

[java] view plain copy

  1.       /** 
  2. * 向指定 URL 发送POST方法的请求 
  3.  
  4. * @param url 发送请求的 URL 
  5. * @param param 请求参数 
  6. * @return 所代表远程资源的响应结果 
  7. */  
  8. ublic static String sendPost(String url, Map<String, ?> paramMap) {  
  9.       PrintWriter out = null;  
  10.       BufferedReader in = null;  
  11.       String result = "";  
  12.         
  13.       String param = "";  
  14. Iterator<String> it = paramMap.keySet().iterator();  
  15.   
  16. while(it.hasNext()) {  
  17.     String key = it.next();  
  18.     param += key + "=" + paramMap.get(key) + "&";  
  19. }  
  20.   
  21.       try {  
  22.           URL realUrl = new URL(url);  
  23.           // 打开和URL之间的连接  
  24.           URLConnection conn = realUrl.openConnection();  
  25.           // 设置通用的请求属性  
  26.           conn.setRequestProperty("accept""*/*");  
  27.           conn.setRequestProperty("connection""Keep-Alive");  
  28.           conn.setRequestProperty("Accept-Charset""utf-8");  
  29.           conn.setRequestProperty("user-agent""Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");  
  30.           // 发送POST请求必须设置如下两行  
  31.           conn.setDoOutput(true);  
  32.           conn.setDoInput(true);  
  33.           // 获取URLConnection对象对应的输出流  
  34.           out = new PrintWriter(conn.getOutputStream());  
  35.           // 发送请求参数  
  36.           out.print(param);  
  37.           // flush输出流的缓冲  
  38.           out.flush();  
  39.           // 定义BufferedReader输入流来读取URL的响应  
  40.           in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));  
  41.           String line;  
  42.           while ((line = in.readLine()) != null) {  
  43.               result += line;  
  44.           }  
  45.       } catch (Exception e) {  
  46.         log.error(e.getMessage(), e);  
  47.       }  
  48.       //使用finally块来关闭输出流、输入流  
  49.       finally{  
  50.           try{  
  51.               if(out!=null){  
  52.                   out.close();  
  53.               }  
  54.               if(in!=null){  
  55.                   in.close();  
  56.               }  
  57.           }  
  58.           catch(IOException ex){  
  59.               ex.printStackTrace();  
  60.           }  
  61.       }  
  62.       return result;  
  63.   }  

 

 

 

如果大佬们觉得有用的话  请关注一下小弟的副业 淘宝店https://shop135377658.taobao.com/shop/view_shop.htm?spm=a211vu.server-web-home.category.d53.64f02d5879I9Wp&mytmenu=mdianpu&user_number_id=1709908377

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值