java110 il y a 6 ans
Parent
commit
70f0fb95f6

+ 9 - 0
java110-bean/src/main/java/com/java110/vo/api/smallWeChat/ApiSmallWeChatDataVo.java

@@ -20,6 +20,7 @@ public class ApiSmallWeChatDataVo implements Serializable {
     private String objType;
     private String mchId;
     private String objTypeName;
+    private String wId;
 
     public String getOperate() {
         return operate;
@@ -151,4 +152,12 @@ public class ApiSmallWeChatDataVo implements Serializable {
     public void setPayPassword(String payPassword) {
         this.payPassword = payPassword;
     }
+
+    public String getwId() {
+        return wId;
+    }
+
+    public void setwId(String wId) {
+        this.wId = wId;
+    }
 }

+ 108 - 10
java110-core/src/main/java/com/java110/core/factory/AuthenticationFactory.java

@@ -9,6 +9,8 @@ import com.auth0.jwt.algorithms.Algorithm;
 import com.auth0.jwt.exceptions.JWTVerificationException;
 import com.auth0.jwt.interfaces.Claim;
 import com.auth0.jwt.interfaces.DecodedJWT;
+import com.java110.core.context.ApiDataFlow;
+import com.java110.core.context.DataFlow;
 import com.java110.utils.cache.JWTCache;
 import com.java110.utils.cache.MappingCache;
 import com.java110.utils.constant.CommonConstant;
@@ -16,19 +18,29 @@ import com.java110.utils.constant.MappingConstant;
 import com.java110.utils.constant.ResponseConstant;
 import com.java110.utils.exception.NoAuthorityException;
 import com.java110.utils.util.StringUtil;
-
-import com.java110.core.context.ApiDataFlow;
-import com.java110.core.context.DataFlow;
 import org.apache.commons.codec.digest.DigestUtils;
 
 import javax.crypto.Cipher;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.DESKeySpec;
+import javax.crypto.spec.IvParameterSpec;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.UnsupportedEncodingException;
-import java.security.*;
+import java.security.InvalidParameterException;
+import java.security.Key;
+import java.security.KeyFactory;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.MessageDigest;
+import java.security.PrivateKey;
+import java.security.PublicKey;
 import java.security.spec.PKCS8EncodedKeySpec;
 import java.security.spec.X509EncodedKeySpec;
-import java.util.*;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
 
 /**
  * 鉴权工厂类
@@ -37,6 +49,92 @@ import java.util.*;
 public class AuthenticationFactory {
 
     private final static String PASSWD_SALT = "hc@java110";
+    /**
+     * 偏移变量,固定占8位字节
+     */
+    private final static String IV_PARAMETER = "12345678";
+    /**
+     * 密钥算法
+     */
+    private static final String ALGORITHM = "DES";
+    /**
+     * 加密/解密算法-工作模式-填充模式
+     */
+    private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding";
+    /**
+     * 默认编码
+     */
+    private static final String CHARSET = "utf-8";
+
+
+    /**
+     * 生成key
+     *
+     * @param password
+     * @return
+     * @throws Exception
+     */
+    private static Key generateKey(String password) throws Exception {
+        DESKeySpec dks = new DESKeySpec(password.getBytes(CHARSET));
+        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
+        return keyFactory.generateSecret(dks);
+    }
+
+
+    /**
+     * DES加密字符串
+     *
+     * @param password 加密密码,长度不能够小于8位
+     * @param data     待加密字符串
+     * @return 加密后内容
+     */
+    public static String encrypt(String password, String data) {
+        if (password == null || password.length() < 8) {
+            throw new RuntimeException("加密失败,key不能小于8位");
+        }
+        if (data == null)
+            return null;
+        try {
+            Key secretKey = generateKey(password);
+            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
+            IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
+            cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
+            byte[] bytes = cipher.doFinal(data.getBytes(CHARSET));
+
+            //JDK1.8及以上可直接使用Base64,JDK1.7及以下可以使用BASE64Encoder
+            //Android平台可以使用android.util.Base64
+            return new String(Base64.getEncoder().encode(bytes));
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return data;
+        }
+    }
+
+    /**
+     * DES解密字符串
+     *
+     * @param password 解密密码,长度不能够小于8位
+     * @param data     待解密字符串
+     * @return 解密后内容
+     */
+    public static String decrypt(String password, String data) {
+        if (password == null || password.length() < 8) {
+            throw new RuntimeException("加密失败,key不能小于8位");
+        }
+        if (data == null)
+            return null;
+        try {
+            Key secretKey = generateKey(password);
+            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
+            IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
+            cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
+            return new String(cipher.doFinal(Base64.getDecoder().decode(data.getBytes(CHARSET))), CHARSET);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return data;
+        }
+    }
 
     /**
      * 用户密码 md5签名
@@ -79,8 +177,7 @@ public class AuthenticationFactory {
         return md5(reqInfo);
     }
 
-    public static String SHA1Encode(String sourceString)
-    {
+    public static String SHA1Encode(String sourceString) {
         String resultString = null;
         try {
             resultString = new String(sourceString);
@@ -92,8 +189,7 @@ public class AuthenticationFactory {
     }
 
 
-    public static final String byte2hexString(byte[] bytes)
-    {
+    public static final String byte2hexString(byte[] bytes) {
         StringBuffer buf = new StringBuffer(bytes.length * 2);
         for (int i = 0; i < bytes.length; i++) {
             if ((bytes[i] & 0xFF) < 16) {
@@ -117,7 +213,7 @@ public class AuthenticationFactory {
         String reqInfo = dataFlow.getTransactionId() + dataFlow.getRequestTime() + dataFlow.getAppId();
         String url = dataFlow.getRequestHeaders().get("REQUEST_URL");
         String param = "";
-        if(url.indexOf("?") > 0){
+        if (url.indexOf("?") > 0) {
             param = url.substring(url.indexOf("?"));
         }
         //,DELETE
@@ -443,6 +539,8 @@ public class AuthenticationFactory {
         System.out.printf("passwdMd5 " + passwdMd5("wuxw2015"));
 
     }
+
+
 }
 
 

+ 25 - 1
java110-core/src/main/java/com/java110/core/factory/WechatFactory.java

@@ -23,6 +23,8 @@ public class WechatFactory {
 
     private static Logger logger = LoggerFactory.getLogger(WechatFactory.class);
 
+    private static final String password = "you are bad boy!";
+
 
     private static final String WECHAT = "WECHAT";
 
@@ -53,7 +55,8 @@ public class WechatFactory {
 
     /**
      * 刷新 access_token
-     * @param appId 应用ID
+     *
+     * @param appId     应用ID
      * @param appSecure 应用秘钥
      * @return
      */
@@ -75,4 +78,25 @@ public class WechatFactory {
         }
         return "";
     }
+
+    /**
+     * 获取微信页面ID
+     *
+     * @param appId
+     * @return
+     */
+    public static String getWId(String appId) {
+        return AuthenticationFactory.encrypt(password,appId);
+    }
+
+    /**
+     * 获取微信AppId
+     *
+     * @param wId
+     * @return
+     */
+    public static String getAppId(String wId) {
+        return AuthenticationFactory.decrypt(password,wId);
+    }
+
 }

+ 3 - 0
java110-utils/src/main/java/com/java110/utils/constant/WechatConstant.java

@@ -13,6 +13,9 @@ public class WechatConstant {
     //微信域
     public static final String WECHAT_DOMAIN = "WECHAT";
 
+    //微信ID
+    public static final String PAGE_WECHAT_APP_ID = "_wId";//微信id 一般是appId
+
     public static final String KEY_PROPERTY_FEE_TEMPLATE_ID = "PROPERTY_FEE_TEMPLATE_ID";
 
     public static final String TOKEN = "TOKEN";

+ 8 - 3
service-api/src/main/java/com/java110/api/listener/smallWeChat/ListSmallWeChatsListener.java

@@ -5,6 +5,7 @@ import com.java110.api.listener.AbstractServiceApiListener;
 import com.java110.core.annotation.Java110Listener;
 import com.java110.core.context.DataFlowContext;
 import com.java110.core.event.service.api.ServiceDataFlowEvent;
+import com.java110.core.factory.WechatFactory;
 import com.java110.core.smo.store.ISmallWeChatInnerServiceSMO;
 import com.java110.dto.smallWeChat.SmallWeChatDto;
 import com.java110.utils.constant.ServiceCodeSmallWeChatConstant;
@@ -90,11 +91,15 @@ public class ListSmallWeChatsListener extends AbstractServiceApiListener {
     }
 
     private void freshSecure(List<ApiSmallWeChatDataVo> smallWeChats, String appId) {
-        if (OWNER_APP.equals(appId)) {
-            return;
-        }
+//        if (OWNER_APP.equals(appId)) {
+//            return;
+//        }
 
         for (ApiSmallWeChatDataVo apiSmallWeChatDataVo : smallWeChats) {
+            apiSmallWeChatDataVo.setwId(WechatFactory.getWId(apiSmallWeChatDataVo.getAppId()));
+            if(OWNER_APP.equals(appId)){
+                continue;
+            }
             apiSmallWeChatDataVo.setAppSecret("");
             apiSmallWeChatDataVo.setPayPassword("");
         }