From 98b1a0affd69bbe63223c21fdd2c404e8bedfccb Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期三, 20 五月 2020 17:25:08 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/div' into 2.1.2 --- utils/src/main/java/org/yeshi/utils/wx/WXXCXUtil.java | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 111 insertions(+), 4 deletions(-) diff --git a/utils/src/main/java/org/yeshi/utils/wx/WXXCXUtil.java b/utils/src/main/java/org/yeshi/utils/wx/WXXCXUtil.java index 28f3870..441f7a9 100644 --- a/utils/src/main/java/org/yeshi/utils/wx/WXXCXUtil.java +++ b/utils/src/main/java/org/yeshi/utils/wx/WXXCXUtil.java @@ -1,8 +1,22 @@ package org.yeshi.utils.wx; import java.io.InputStream; +import java.security.AlgorithmParameters; +import java.security.Security; +import java.util.Arrays; +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import org.apache.commons.codec.binary.Base64; +import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.yeshi.utils.HttpUtil; +import org.yeshi.utils.entity.wx.WXAPPInfo; +import org.yeshi.utils.entity.wx.WXMPSessionInfo; +import org.yeshi.utils.entity.wx.WXMPUserInfo; + +import com.google.gson.Gson; import net.sf.json.JSONObject; @@ -11,9 +25,7 @@ public static InputStream getXCXCode(String accessToken, String path, String scene) { String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken; JSONObject data = new JSONObject(); - - data.put("scene", "123123,12312321123"); - + data.put("scene", scene); data.put("page", path); // JSONObject color = new JSONObject(); // color.put("r", ); @@ -22,7 +34,11 @@ // // data.put("line_color", color); - return HttpUtil.postForInputstream(url, data.toString()); + try { + return HttpUtil.postForInputstream(url, data.toString()); + } catch (Exception e) { + return null; + } } // 鑾峰彇鏈夐檺鐨勫皬绋嬪簭鐮� @@ -34,4 +50,95 @@ return HttpUtil.postForInputstream(url, data.toString()); } + public static WXMPSessionInfo getSessionInfo(WXAPPInfo app, String code) { + try { + String url = String.format( + "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", + app.getAppId(), app.getAppSecret(), code); + String result = HttpUtil.get(url); + System.out.println(result); + JSONObject json = JSONObject.fromObject(result); + WXMPSessionInfo info = new WXMPSessionInfo(json.optString("openid"), json.optString("session_key"), + json.optString("unionid")); + if (org.yeshi.utils.StringUtil.isNullOrEmpty(info.getOpenId())) + return null; + return info; + } catch (Exception e) { + } + return null; + } + + /** + * 閫氳繃瑙e瘑淇℃伅鑾峰彇鐢佃瘽鍙风爜 + * + * @param sessionKey + * @param encryptedData + * @param iv + * @return + */ + public static String getPhoneNumber(String sessionKey, String encryptedData, String iv) { + String result = decrpt(sessionKey, encryptedData, iv); + if (!org.yeshi.utils.StringUtil.isNullOrEmpty(result)) { + JSONObject data = JSONObject.fromObject(result); + if (data.optString("countryCode").equalsIgnoreCase("86"))// 鍙兘鑾峰彇涓浗鐨勬墜鏈哄彿 + return data.optString("purePhoneNumber"); + } + return null; + } + + /** + * 鑾峰彇鐢ㄦ埛淇℃伅 + * + * @param sessionKey + * @param encryptedData + * @param iv + * @return + */ + public static WXMPUserInfo getUserInfo(String sessionKey, String encryptedData, String iv) { + String result = decrpt(sessionKey, encryptedData, iv); + if (!org.yeshi.utils.StringUtil.isNullOrEmpty(result)) { + WXMPUserInfo userInfo = new Gson().fromJson(result, WXMPUserInfo.class); + return userInfo; + } + return null; + } + + private static String decrpt(String sessionKey, String encryptedData, String iv) { + try { + final Base64 base64 = new Base64(); + // 琚姞瀵嗙殑鏁版嵁 + byte[] dataByte = base64.decode(encryptedData.getBytes("UTF-8")); + // 鍔犲瘑绉橀挜 + byte[] keyByte = base64.decode(sessionKey.getBytes("UTF-8")); + // 鍋忕Щ閲� + byte[] ivByte = base64.decode(iv.getBytes("UTF-8")); + + // 濡傛灉瀵嗛挜涓嶈冻16浣嶏紝閭d箞灏辫ˉ瓒�. 杩欎釜if 涓殑鍐呭寰堥噸瑕� + int base = 16; + if (keyByte.length % base != 0) { + int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0); + byte[] temp = new byte[groups * base]; + Arrays.fill(temp, (byte) 0); + System.arraycopy(keyByte, 0, temp, 0, keyByte.length); + keyByte = temp; + } + // 鍒濆鍖� + Security.addProvider(new BouncyCastleProvider()); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); + 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, "UTF-8"); + return result; + } + } catch (Exception e) { + System.out.println(e.getMessage()); + } + return null; + + } + } -- Gitblit v1.8.0