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