From 3f7bcb1fb68b78a2cd2a87b44098f1de70378d92 Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期一, 30 十二月 2019 18:59:59 +0800 Subject: [PATCH] 完成微信小程序登录流程 --- utils/src/main/java/org/yeshi/utils/wx/WXXCXUtil.java | 97 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 92 insertions(+), 5 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 bd71466..b8a5e40 100644 --- a/utils/src/main/java/org/yeshi/utils/wx/WXXCXUtil.java +++ b/utils/src/main/java/org/yeshi/utils/wx/WXXCXUtil.java @@ -1,11 +1,23 @@ 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.aliyun.openservices.shade.io.netty.util.internal.StringUtil; +import com.google.gson.Gson; import net.sf.json.JSONObject; @@ -37,20 +49,95 @@ return HttpUtil.postForInputstream(url, data.toString()); } - public static String getOpenId(WXAPPInfo app, String code) { + 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); - String openId = json.optString("openid"); - if (!StringUtil.isNullOrEmpty(openId)) { - return openId; - } + 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