Sfoglia il codice sorgente

完成云卓 全景 支付

java110 4 anni fa
parent
commit
e758b96c2f

+ 251 - 251
service-api/src/main/java/com/java110/api/smo/payment/adapt/plutuspay/PlutusUtil.java

@@ -1,251 +1,251 @@
-package com.java110.api.smo.payment.adapt.plutuspay;
-
-import com.alibaba.fastjson.JSONObject;
-import org.bouncycastle.util.encoders.Base64;
-
-import javax.crypto.Cipher;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-import java.io.BufferedInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.security.*;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.PKCS8EncodedKeySpec;
-import java.security.spec.X509EncodedKeySpec;
-
-
-/**
- * AES加密解密算法
- *
- * @author long
- */
-public class PlutusUtil {
-    // /** 算法/模式/填充 **/
-    private static final String CipherMode = "AES/CBC/PKCS5Padding";
-
-    private static final String SIGNATURE_ALGORITHM = "SHA256withRSA";
-
-    //密钥
-    public static String SECRET_KEY = "3738597658384d6c316a4758527a5a35";
-
-
-    // /** 创建密钥 **/
-    private static SecretKeySpec createKey(String key) {
-        byte[] data = null;
-        data = hexStringToByteArray(key);
-        return new SecretKeySpec(data, "AES");
-    }
-
-    /**
-     * 实例化私钥
-     *
-     * @return
-     */
-    private static PrivateKey getPrivateKey() {
-        PrivateKey privateKey = null;
-        String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDKO3fVJVtKuBlj\n" +
-                "T2HkhjQykS/jKiNuQ4o0IItGJwTv4IX7m+vlKwqPQFylr1POdRX0z4lwFWRWvxCv\n" +
-                "fpORW83W6a6J6LSKfDc5g5h0mhnYdYMdzLawVEM1YqJD5EVRQZHKleMvwkZbLWt0\n" +
-                "bFJ2o4uVDO7bs/ABv6UdAmOlP6K2fUcw14r5nF+sUpXw9v2wCQys3k3djGOQJQFX\n" +
-                "7/aADXsROp0xPFhHVgu18Rtjp7y5ib8bQ1obMmlf+4yThjlAMJQN9sBTOByUXLQw\n" +
-                "VCCL5oYsSs318mnJnTSmkK88pxDYp1Y2K7WQDbZtFiDbNA4bqCecQGbX+6c7NWSr\n" +
-                "dWMn0BsfAgMBAAECggEBAJXh1UKH2U1bfJV59Bemz3Da4h7+0BucuwU/SXnI2YPf\n" +
-                "Z+2+9ep3J/Bbx06UzwwpAwjZ+Aa2FBOmr/shWMVWwQwTTWSwr34j6doaiheBTr56\n" +
-                "+Z5QZuXwzY73d0PSHv3GFwOKa0KuPe69jvJOhh+fvofNegojJjJlkz4Y0zlaHIIa\n" +
-                "ri5iuKM2b5sSeoohCwJF9vmkje9UUpzYgIQhiiLe7jHIj6PP+ILA/+J0IqlqZg7Z\n" +
-                "nZIClUfy1Bn533yxCHvvM2V1gkT4zsmLtgIsJrGP3FHKW0yGj2JKaxI8T4JtjYCX\n" +
-                "QhXoYkzjr+111udD8oe0Tg/8PquFvqi5Cq0rkDqNwsECgYEA5ENMeAuENaG1TKov\n" +
-                "rpXUhmrB1tOcp/BvOLq4KIsgY6/4k2q4MbpK3qXeY90YlLaEsggD8eiEG3RNmGNR\n" +
-                "IbmnqyQBQyk+KYCMTGBTRGqwwjJjTDBkV0hOeLV8CBBcAFGKXLf15HyhuG4xRhvu\n" +
-                "Sq8YcIbvA9fSLkaaYY/pyuoQA3kCgYEA4s5r20Na9WQ5M3QLRY5HMlUb0E0SMSEd\n" +
-                "4UF6mgzpdafDWSsvcOSnJguahZ25DJk12ptKKaJPXxPEa2+u0FN/Jv9KDPkXggXS\n" +
-                "z6yS9E1HfFSbRK6An1Q+34vDahrU5lTJQ7eKYDzb2Xm1gI1VxrxdAN5+Bk3IvH1T\n" +
-                "FUowLOFGFVcCgYAYwqgX2X/05V6qO0fC02PjVM9EA15Z5T3bVH3HgBf6WEtJimkC\n" +
-                "k+etMSbnhEM3Vnkcarwq0IMMC1ijcBqL4vyqFtTAOUgR7mzJmCVQJZaY6ihVSmaI\n" +
-                "BULl2yHiKgwgyLeOiTH2IALW47UamssFdOrcwfZJX27gMC5s6NR+e1dTWQKBgFMu\n" +
-                "qdgM5/s/+sqoMMod2HbZSA4pdhaWssK+pRyCx8zi7n5xnECnW7ZUYyPGKOw59Mps\n" +
-                "UdLbOIkCUvOkTlURinze/GWtpbWGNT79aBg5j5JF5XxXE81btIOAWvc7SAIB7p7r\n" +
-                "XdDWATvNq4euTltJEkMTVt0xAgI/ZI1WXDzZkj6ZAoGBANTu3Ko+x8OgH3WdMSxD\n" +
-                "YTersdTb4j2bj3IkZF8xJemyO7qerEK6H9mkGjSZlR17bQeE3b0RF97GgIw/fIZX\n" +
-                "o6oE7re3EaCp6/PIXTzTPRlLTPNlBvFqDrNurM0YndjAgANa1tDDQ12W8Vtjvv8g\n" +
-                "mX7PvHOnfws522nLZHBz+SzT";
-
-        try {
-
-            PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(priKey.getBytes()));
-            KeyFactory keyf = KeyFactory.getInstance("RSA");
-            privateKey = keyf.generatePrivate(priPKCS8);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return privateKey;
-    }
-
-
-    //实例化公钥
-    public static PublicKey getPublicKey() {
-        PublicKey publicKey = null;
-        String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsIvJ1y1G7/BaWqcq/qVc\n" +
-                "6u7nQb7nuH9vI2MoJc2H9ZGVD27oOIPkEDy7kIiteIaq5lrj6Z8VpG4n84MycsC7\n" +
-                "/7AVScV238pdBkQM/vtm6j3jJsh7dcAU/ngMTzusUgFKlUhClR4uztQM+/obIcAl\n" +
-                "wDlGnY/Nw5XbmzE6igcLgAZLkYq54hfJSG7EyctonL8Q8SPn51eEy9TMh3jju/RH\n" +
-                "KeZzpJ5mYTFzqGU798rzv6r9uBKC/lZvuQcQwK7li4ctINA3EPmRbiLwzLZnTZBf\n" +
-                "h7AmtTMqM2NYrn6Co23NQYLdg0WPSPv1Sxj69BSJ1q62boT2gOO3rsxaK8FN3EJb\n" +
-                "sQIDAQAB";
-
-        try {
-            X509EncodedKeySpec PubKeySpec = new X509EncodedKeySpec(
-                    Base64.decode(pubKey.getBytes()));
-            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
-            // 取公钥匙对象
-            publicKey = keyFactory.generatePublic(PubKeySpec);
-        } catch (NoSuchAlgorithmException e1) {
-            e1.printStackTrace();
-        } catch (InvalidKeySpecException e1) {
-            e1.printStackTrace();
-        }
-        return publicKey;
-    }
-
-
-    // /** 加密字节数据 **/
-    public static byte[] encrypt(byte[] content, String password) {
-        try {
-            byte[] data = hexStringToByteArray(password);
-            SecretKeySpec key = new SecretKeySpec(data, "AES");
-            Cipher cipher = Cipher.getInstance(CipherMode);
-            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
-            cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(new byte[16]));
-            byte[] result = cipher.doFinal(content);
-            return result;
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-
-    /**
-     * 解密AES加密过的字符串
-     *
-     * @param content  AES加密过过的内容
-     * @param password 加密时的密码
-     * @return 明文
-     */
-    public static byte[] decrypt(byte[] content, String password) {
-        try {
-            byte[] data = hexStringToByteArray(password);
-            SecretKeySpec key = new SecretKeySpec(data, "AES");
-            Cipher cipher = Cipher.getInstance(CipherMode);
-            cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(new byte[16]));
-            byte[] result = cipher.doFinal(content);
-            return result;
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-    public static String Encryption(String url) {
-        JSONObject object = new JSONObject();
-        try {
-            byte[] b = url.getBytes("UTF-8");
-            //AES加密
-            byte[] text = PlutusUtil.encrypt(b, SECRET_KEY);
-            String content = Base64.toBase64String(text);
-
-            //签名
-            byte[] sign = PlutusUtil.sign256(text, getPrivateKey());
-            String signature = Base64.toBase64String(sign);
-
-            object.put("devId", "xqHQzM5n");
-            object.put("content", content);
-            object.put("signature", signature);
-
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-        return object.toString();
-    }
-
-
-    public static byte[] hexStringToByteArray(String s) {
-        int len = s.length();
-        byte[] b = new byte[len / 2];
-        for (int i = 0; i < len; i += 2) {
-            // 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
-            b[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character
-                    .digit(s.charAt(i + 1), 16));
-        }
-        return b;
-    }
-
-    //SHA256withRSA签名
-    public static byte[] sign256(byte[] data, PrivateKey privateKey) {
-        byte[] signed = null;
-        Signature signature = null;
-        try {
-            signature = Signature.getInstance(SIGNATURE_ALGORITHM);
-            signature.initSign(privateKey);
-            signature.update(data);
-            signed = signature.sign();
-        } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
-            e.printStackTrace();
-        }
-        return signed;
-    }
-
-
-    //SHA256withRSA验签
-    public static boolean verify256(String data, byte[] sign) {
-        if (data == null || sign == null) {
-            return false;
-        }
-        try {
-            Signature signetcheck = Signature.getInstance(SIGNATURE_ALGORITHM);
-            signetcheck.initVerify(getPublicKey());
-            signetcheck.update(Base64.decode(data));
-            return signetcheck.verify(sign);
-        } catch (Exception e) {
-            return false;
-        }
-    }
-
-    public static String post(String path,String post){
-        URL url = null;
-        try {
-            url = new URL(path);
-            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
-            httpURLConnection.setRequestMethod("POST");// 提交模式
-            // conn.setConnectTimeout(10000);//连接超时 单位毫秒
-            httpURLConnection.setReadTimeout(15000);//读取超时 单位毫秒
-            // 发送POST请求必须设置如下两行
-            httpURLConnection.setDoOutput(true);
-            httpURLConnection.setDoInput(true);
-            // 获取URLConnection对象对应的输出流
-            PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
-            // 发送请求参数
-            printWriter.write(post);//post的参数 xx=xx&yy=yy
-            // flush输出流的缓冲
-            printWriter.flush();
-            //开始获取数据
-            BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
-            ByteArrayOutputStream bos = new ByteArrayOutputStream();
-            int len;
-            byte[] arr = new byte[1024];
-            while((len=bis.read(arr))!= -1){
-                bos.write(arr,0,len);
-                bos.flush();
-            }
-            bos.close();
-            return bos.toString();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return "请求失败";
-    }
-}
+package com.java110.core.factory;
+
+import com.alibaba.fastjson.JSONObject;
+import org.bouncycastle.util.encoders.Base64;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.*;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+
+
+/**
+ * AES加密解密算法
+ *
+ * @author long
+ */
+public class PlutusFactory {
+    // /** 算法/模式/填充 **/
+    private static final String CipherMode = "AES/CBC/PKCS5Padding";
+
+    private static final String SIGNATURE_ALGORITHM = "SHA256withRSA";
+
+    //密钥
+    public static String SECRET_KEY = "3738597658384d6c316a4758527a5a35";
+
+
+    // /** 创建密钥 **/
+    private static SecretKeySpec createKey(String key) {
+        byte[] data = null;
+        data = hexStringToByteArray(key);
+        return new SecretKeySpec(data, "AES");
+    }
+
+    /**
+     * 实例化私钥
+     *
+     * @return
+     */
+    private static PrivateKey getPrivateKey() {
+        PrivateKey privateKey = null;
+        String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDKO3fVJVtKuBlj\n" +
+                "T2HkhjQykS/jKiNuQ4o0IItGJwTv4IX7m+vlKwqPQFylr1POdRX0z4lwFWRWvxCv\n" +
+                "fpORW83W6a6J6LSKfDc5g5h0mhnYdYMdzLawVEM1YqJD5EVRQZHKleMvwkZbLWt0\n" +
+                "bFJ2o4uVDO7bs/ABv6UdAmOlP6K2fUcw14r5nF+sUpXw9v2wCQys3k3djGOQJQFX\n" +
+                "7/aADXsROp0xPFhHVgu18Rtjp7y5ib8bQ1obMmlf+4yThjlAMJQN9sBTOByUXLQw\n" +
+                "VCCL5oYsSs318mnJnTSmkK88pxDYp1Y2K7WQDbZtFiDbNA4bqCecQGbX+6c7NWSr\n" +
+                "dWMn0BsfAgMBAAECggEBAJXh1UKH2U1bfJV59Bemz3Da4h7+0BucuwU/SXnI2YPf\n" +
+                "Z+2+9ep3J/Bbx06UzwwpAwjZ+Aa2FBOmr/shWMVWwQwTTWSwr34j6doaiheBTr56\n" +
+                "+Z5QZuXwzY73d0PSHv3GFwOKa0KuPe69jvJOhh+fvofNegojJjJlkz4Y0zlaHIIa\n" +
+                "ri5iuKM2b5sSeoohCwJF9vmkje9UUpzYgIQhiiLe7jHIj6PP+ILA/+J0IqlqZg7Z\n" +
+                "nZIClUfy1Bn533yxCHvvM2V1gkT4zsmLtgIsJrGP3FHKW0yGj2JKaxI8T4JtjYCX\n" +
+                "QhXoYkzjr+111udD8oe0Tg/8PquFvqi5Cq0rkDqNwsECgYEA5ENMeAuENaG1TKov\n" +
+                "rpXUhmrB1tOcp/BvOLq4KIsgY6/4k2q4MbpK3qXeY90YlLaEsggD8eiEG3RNmGNR\n" +
+                "IbmnqyQBQyk+KYCMTGBTRGqwwjJjTDBkV0hOeLV8CBBcAFGKXLf15HyhuG4xRhvu\n" +
+                "Sq8YcIbvA9fSLkaaYY/pyuoQA3kCgYEA4s5r20Na9WQ5M3QLRY5HMlUb0E0SMSEd\n" +
+                "4UF6mgzpdafDWSsvcOSnJguahZ25DJk12ptKKaJPXxPEa2+u0FN/Jv9KDPkXggXS\n" +
+                "z6yS9E1HfFSbRK6An1Q+34vDahrU5lTJQ7eKYDzb2Xm1gI1VxrxdAN5+Bk3IvH1T\n" +
+                "FUowLOFGFVcCgYAYwqgX2X/05V6qO0fC02PjVM9EA15Z5T3bVH3HgBf6WEtJimkC\n" +
+                "k+etMSbnhEM3Vnkcarwq0IMMC1ijcBqL4vyqFtTAOUgR7mzJmCVQJZaY6ihVSmaI\n" +
+                "BULl2yHiKgwgyLeOiTH2IALW47UamssFdOrcwfZJX27gMC5s6NR+e1dTWQKBgFMu\n" +
+                "qdgM5/s/+sqoMMod2HbZSA4pdhaWssK+pRyCx8zi7n5xnECnW7ZUYyPGKOw59Mps\n" +
+                "UdLbOIkCUvOkTlURinze/GWtpbWGNT79aBg5j5JF5XxXE81btIOAWvc7SAIB7p7r\n" +
+                "XdDWATvNq4euTltJEkMTVt0xAgI/ZI1WXDzZkj6ZAoGBANTu3Ko+x8OgH3WdMSxD\n" +
+                "YTersdTb4j2bj3IkZF8xJemyO7qerEK6H9mkGjSZlR17bQeE3b0RF97GgIw/fIZX\n" +
+                "o6oE7re3EaCp6/PIXTzTPRlLTPNlBvFqDrNurM0YndjAgANa1tDDQ12W8Vtjvv8g\n" +
+                "mX7PvHOnfws522nLZHBz+SzT";
+
+        try {
+
+            PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(priKey.getBytes()));
+            KeyFactory keyf = KeyFactory.getInstance("RSA");
+            privateKey = keyf.generatePrivate(priPKCS8);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return privateKey;
+    }
+
+
+    //实例化公钥
+    public static PublicKey getPublicKey() {
+        PublicKey publicKey = null;
+        String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsIvJ1y1G7/BaWqcq/qVc\n" +
+                "6u7nQb7nuH9vI2MoJc2H9ZGVD27oOIPkEDy7kIiteIaq5lrj6Z8VpG4n84MycsC7\n" +
+                "/7AVScV238pdBkQM/vtm6j3jJsh7dcAU/ngMTzusUgFKlUhClR4uztQM+/obIcAl\n" +
+                "wDlGnY/Nw5XbmzE6igcLgAZLkYq54hfJSG7EyctonL8Q8SPn51eEy9TMh3jju/RH\n" +
+                "KeZzpJ5mYTFzqGU798rzv6r9uBKC/lZvuQcQwK7li4ctINA3EPmRbiLwzLZnTZBf\n" +
+                "h7AmtTMqM2NYrn6Co23NQYLdg0WPSPv1Sxj69BSJ1q62boT2gOO3rsxaK8FN3EJb\n" +
+                "sQIDAQAB";
+
+        try {
+            X509EncodedKeySpec PubKeySpec = new X509EncodedKeySpec(
+                    Base64.decode(pubKey.getBytes()));
+            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+            // 取公钥匙对象
+            publicKey = keyFactory.generatePublic(PubKeySpec);
+        } catch (NoSuchAlgorithmException e1) {
+            e1.printStackTrace();
+        } catch (InvalidKeySpecException e1) {
+            e1.printStackTrace();
+        }
+        return publicKey;
+    }
+
+
+    // /** 加密字节数据 **/
+    public static byte[] encrypt(byte[] content, String password) {
+        try {
+            byte[] data = hexStringToByteArray(password);
+            SecretKeySpec key = new SecretKeySpec(data, "AES");
+            Cipher cipher = Cipher.getInstance(CipherMode);
+            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
+            cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(new byte[16]));
+            byte[] result = cipher.doFinal(content);
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    /**
+     * 解密AES加密过的字符串
+     *
+     * @param content  AES加密过过的内容
+     * @param password 加密时的密码
+     * @return 明文
+     */
+    public static byte[] decrypt(byte[] content, String password) {
+        try {
+            byte[] data = hexStringToByteArray(password);
+            SecretKeySpec key = new SecretKeySpec(data, "AES");
+            Cipher cipher = Cipher.getInstance(CipherMode);
+            cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(new byte[16]));
+            byte[] result = cipher.doFinal(content);
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static String Encryption(String url) {
+        JSONObject object = new JSONObject();
+        try {
+            byte[] b = url.getBytes("UTF-8");
+            //AES加密
+            byte[] text = PlutusFactory.encrypt(b, SECRET_KEY);
+            String content = Base64.toBase64String(text);
+
+            //签名
+            byte[] sign = PlutusFactory.sign256(text, getPrivateKey());
+            String signature = Base64.toBase64String(sign);
+
+            object.put("devId", "xqHQzM5n");
+            object.put("content", content);
+            object.put("signature", signature);
+
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return object.toString();
+    }
+
+
+    public static byte[] hexStringToByteArray(String s) {
+        int len = s.length();
+        byte[] b = new byte[len / 2];
+        for (int i = 0; i < len; i += 2) {
+            // 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
+            b[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character
+                    .digit(s.charAt(i + 1), 16));
+        }
+        return b;
+    }
+
+    //SHA256withRSA签名
+    public static byte[] sign256(byte[] data, PrivateKey privateKey) {
+        byte[] signed = null;
+        Signature signature = null;
+        try {
+            signature = Signature.getInstance(SIGNATURE_ALGORITHM);
+            signature.initSign(privateKey);
+            signature.update(data);
+            signed = signature.sign();
+        } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
+            e.printStackTrace();
+        }
+        return signed;
+    }
+
+
+    //SHA256withRSA验签
+    public static boolean verify256(String data, byte[] sign) {
+        if (data == null || sign == null) {
+            return false;
+        }
+        try {
+            Signature signetcheck = Signature.getInstance(SIGNATURE_ALGORITHM);
+            signetcheck.initVerify(getPublicKey());
+            signetcheck.update(Base64.decode(data));
+            return signetcheck.verify(sign);
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    public static String post(String path,String post){
+        URL url = null;
+        try {
+            url = new URL(path);
+            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
+            httpURLConnection.setRequestMethod("POST");// 提交模式
+            // conn.setConnectTimeout(10000);//连接超时 单位毫秒
+            httpURLConnection.setReadTimeout(15000);//读取超时 单位毫秒
+            // 发送POST请求必须设置如下两行
+            httpURLConnection.setDoOutput(true);
+            httpURLConnection.setDoInput(true);
+            // 获取URLConnection对象对应的输出流
+            PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
+            // 发送请求参数
+            printWriter.write(post);//post的参数 xx=xx&yy=yy
+            // flush输出流的缓冲
+            printWriter.flush();
+            //开始获取数据
+            BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            int len;
+            byte[] arr = new byte[1024];
+            while((len=bis.read(arr))!= -1){
+                bos.write(arr,0,len);
+                bos.flush();
+            }
+            bos.close();
+            return bos.toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "请求失败";
+    }
+}

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

@@ -60,6 +60,7 @@ public class WechatConstant {
 
     //支付适配器
     public static final String PAY_ADAPT = "PAY_ADAPT";
+    public static final String PAY_QR_ADAPT = "PAY_QR_ADAPT";
     //支付通知适配器
     public static final String PAY_NOTIFY_ADAPT = "PAY_NOTIFY_ADAPT";
     public static final String PAY_OWE_FEE_NOTIFY_ADAPT = "PAY_OWE_FEE_NOTIFY_ADAPT";

+ 11 - 5
service-acct/src/main/java/com/java110/acct/cmd/payment/CheckPayFinishCmd.java

@@ -8,7 +8,9 @@ import com.java110.core.event.cmd.AbstractServiceCmdListener;
 import com.java110.core.event.cmd.CmdEvent;
 import com.java110.core.factory.CallApiServiceFactory;
 import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.utils.cache.MappingCache;
 import com.java110.utils.constant.CommonConstant;
+import com.java110.utils.constant.WechatConstant;
 import com.java110.utils.exception.CmdException;
 import com.java110.utils.factory.ApplicationContextFactory;
 import com.java110.utils.util.Assert;
@@ -39,14 +41,18 @@ public class CheckPayFinishCmd extends AbstractServiceCmdListener {
         if (StringUtil.isEmpty(authCode) || authCode.length() < 2) {
             throw new IllegalArgumentException("授权码错误");
         }
+        String payQrAdapt = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.PAY_QR_ADAPT);
 
-        int pre = Integer.parseInt(authCode.substring(0, 2));
-        if (pre > 24 && pre < 31) { // 支付宝
-            qrCodePaymentSMOImpl = ApplicationContextFactory.getBean("qrCodeAliPaymentAdapt", IQrCodePaymentSMO.class);
+        if (StringUtil.isEmpty(payQrAdapt)) {
+            int pre = Integer.parseInt(authCode.substring(0, 2));
+            if (pre > 24 && pre < 31) { // 支付宝
+                qrCodePaymentSMOImpl = ApplicationContextFactory.getBean("qrCodeAliPaymentAdapt", IQrCodePaymentSMO.class);
+            } else {
+                qrCodePaymentSMOImpl = ApplicationContextFactory.getBean("qrCodeWechatPaymentAdapt", IQrCodePaymentSMO.class);
+            }
         } else {
-            qrCodePaymentSMOImpl = ApplicationContextFactory.getBean("qrCodeWechatPaymentAdapt", IQrCodePaymentSMO.class);
+            qrCodePaymentSMOImpl = ApplicationContextFactory.getBean(payQrAdapt, IQrCodePaymentSMO.class);
         }
-
         ResultVo resultVo = null;
         try {
             resultVo = qrCodePaymentSMOImpl.checkPayFinish(reqJson.getString("communityId"), orderId);

+ 13 - 5
service-acct/src/main/java/com/java110/acct/cmd/payment/QrCodePaymentCmd.java

@@ -8,7 +8,9 @@ import com.java110.core.event.cmd.AbstractServiceCmdListener;
 import com.java110.core.event.cmd.CmdEvent;
 import com.java110.core.factory.CallApiServiceFactory;
 import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.utils.cache.MappingCache;
 import com.java110.utils.constant.CommonConstant;
+import com.java110.utils.constant.WechatConstant;
 import com.java110.utils.exception.CmdException;
 import com.java110.utils.factory.ApplicationContextFactory;
 import com.java110.utils.util.Assert;
@@ -43,11 +45,17 @@ public class QrCodePaymentCmd extends AbstractServiceCmdListener {
             throw new IllegalArgumentException("授权码错误");
         }
 
-        int pre = Integer.parseInt(authCode.substring(0, 2));
-        if (pre > 24 && pre < 31) { // 支付宝
-            qrCodePaymentSMOImpl = ApplicationContextFactory.getBean("qrCodeAliPaymentAdapt", IQrCodePaymentSMO.class);
-        } else {
-            qrCodePaymentSMOImpl = ApplicationContextFactory.getBean("qrCodeWechatPaymentAdapt", IQrCodePaymentSMO.class);
+        String payQrAdapt = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.PAY_QR_ADAPT);
+
+        if(StringUtil.isEmpty(payQrAdapt)) {
+            int pre = Integer.parseInt(authCode.substring(0, 2));
+            if (pre > 24 && pre < 31) { // 支付宝
+                qrCodePaymentSMOImpl = ApplicationContextFactory.getBean("qrCodeAliPaymentAdapt", IQrCodePaymentSMO.class);
+            } else {
+                qrCodePaymentSMOImpl = ApplicationContextFactory.getBean("qrCodeWechatPaymentAdapt", IQrCodePaymentSMO.class);
+            }
+        }else{
+            qrCodePaymentSMOImpl = ApplicationContextFactory.getBean(payQrAdapt, IQrCodePaymentSMO.class);
         }
 
         ResultVo resultVo = null;

+ 172 - 0
service-acct/src/main/java/com/java110/acct/smo/impl/QrCodePlutusPaymentAdapt.java

@@ -0,0 +1,172 @@
+package com.java110.acct.smo.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.acct.smo.IQrCodePaymentSMO;
+import com.java110.core.client.RestTemplate;
+import com.java110.core.factory.PlutusFactory;
+import com.java110.dto.smallWeChat.SmallWeChatDto;
+import com.java110.intf.store.ISmallWeChatInnerServiceSMO;
+import com.java110.utils.cache.MappingCache;
+import com.java110.utils.constant.WechatConstant;
+import com.java110.utils.util.PayUtil;
+import com.java110.vo.ResultVo;
+import org.bouncycastle.util.encoders.Base64;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+/**
+ * 微信支付
+ */
+@Service
+public class QrCodePlutusPaymentAdapt implements IQrCodePaymentSMO {
+    private static Logger logger = LoggerFactory.getLogger(QrCodePlutusPaymentAdapt.class);
+
+    //微信支付
+    public static final String DOMAIN_WECHAT_PAY = "WECHAT_PAY";
+    // 微信服务商支付开关
+    public static final String WECHAT_SERVICE_PAY_SWITCH = "WECHAT_SERVICE_PAY_SWITCH";
+
+    //开关ON打开
+    public static final String WECHAT_SERVICE_PAY_SWITCH_ON = "ON";
+
+
+    private static final String WECHAT_SERVICE_APP_ID = "SERVICE_APP_ID";
+
+    private static final String WECHAT_SERVICE_MCH_ID = "SERVICE_MCH_ID";
+
+    public static final String PAY_UNIFIED_ORDER_URL = "https://api.plutuspay.com/open/v2/pay";
+
+
+    @Autowired
+    private ISmallWeChatInnerServiceSMO smallWeChatInnerServiceSMOImpl;
+
+    @Autowired
+    private RestTemplate outRestTemplate;
+
+    @Override
+    public ResultVo pay(String communityId, String orderNum, double money, String authCode, String feeName) throws Exception {
+        logger.info("【小程序支付】 统一下单开始, 订单编号=" + orderNum);
+        SortedMap<String, String> resultMap = new TreeMap<String, String>();
+        //生成支付金额,开发环境处理支付金额数到0.01、0.02、0.03元
+        double payAmount = PayUtil.getPayAmountByEnv(MappingCache.getValue("HC_ENV"), money);
+        //添加或更新支付记录(参数跟进自己业务需求添加)
+
+        String systemName = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.PAY_GOOD_NAME);
+
+        SmallWeChatDto shopSmallWeChatDto = null;
+
+        SmallWeChatDto smallWeChatDto = new SmallWeChatDto();
+        smallWeChatDto.setObjId(communityId);
+        List<SmallWeChatDto> smallWeChatDtos = smallWeChatInnerServiceSMOImpl.querySmallWeChats(smallWeChatDto);
+        if (smallWeChatDtos == null && smallWeChatDtos.size() < 1) {
+            shopSmallWeChatDto = new SmallWeChatDto();
+            shopSmallWeChatDto.setObjId(communityId);
+            shopSmallWeChatDto.setAppId(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appId"));
+            shopSmallWeChatDto.setAppSecret(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appSecret"));
+            shopSmallWeChatDto.setMchId(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "mchId"));
+            shopSmallWeChatDto.setPayPassword(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "payPassword"));
+        } else {
+            shopSmallWeChatDto = smallWeChatDtos.get(0);
+        }
+
+        JSONObject paramMap = new JSONObject();
+        paramMap.put("sn", smallWeChatDto.getMchId()); // 富友分配给二级商户的商户号
+        paramMap.put("outTradeId", orderNum);
+        paramMap.put("authCode", authCode);
+        paramMap.put("tradeAmount", PayUtil.moneyToIntegerStr(payAmount));
+        paramMap.put("payTypeId", "0");
+
+        String param = PlutusFactory.Encryption(paramMap.toJSONString());
+        System.out.println(param);
+
+        String str = PlutusFactory.post(PAY_UNIFIED_ORDER_URL, param);
+        System.out.println(str);
+
+        JSONObject json = JSON.parseObject(str);
+
+        String signature = json.getString("signature");
+        String content = json.getString("content");
+
+        //验签
+        Boolean verify = PlutusFactory.verify256(content, Base64.decode(signature));
+        //验签成功
+        if (!verify) {
+            throw new IllegalArgumentException("支付失败签名失败");
+        }
+        //解密
+        byte[] bb = PlutusFactory.decrypt(Base64.decode(content), PlutusFactory.SECRET_KEY);
+        //服务器返回内容
+        String paramOut = new String(bb);
+
+        JSONObject paramObj = JSONObject.parseObject(paramOut);
+        if ("1".equals(paramObj.get("status"))) {
+            return new ResultVo(ResultVo.CODE_OK, "成功");
+        } else {
+            return new ResultVo(ResultVo.CODE_ERROR, paramObj.getString("remark"));
+        }
+
+    }
+
+    public ResultVo checkPayFinish(String communityId, String orderNum) {
+        SmallWeChatDto shopSmallWeChatDto = null;
+        Map<String, String> result = null;
+
+        SmallWeChatDto smallWeChatDto = new SmallWeChatDto();
+        smallWeChatDto.setObjId(communityId);
+        List<SmallWeChatDto> smallWeChatDtos = smallWeChatInnerServiceSMOImpl.querySmallWeChats(smallWeChatDto);
+        if (smallWeChatDtos == null && smallWeChatDtos.size() < 1) {
+            shopSmallWeChatDto = new SmallWeChatDto();
+            shopSmallWeChatDto.setObjId(communityId);
+            shopSmallWeChatDto.setAppId(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appId"));
+            shopSmallWeChatDto.setAppSecret(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appSecret"));
+            shopSmallWeChatDto.setMchId(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "mchId"));
+            shopSmallWeChatDto.setPayPassword(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "payPassword"));
+        } else {
+            shopSmallWeChatDto = smallWeChatDtos.get(0);
+        }
+
+        JSONObject paramMap = new JSONObject();
+        paramMap.put("sn", smallWeChatDto.getMchId()); // 富友分配给二级商户的商户号
+        paramMap.put("outTradeId", orderNum);
+
+        String param = PlutusFactory.Encryption(paramMap.toJSONString());
+        System.out.println(param);
+
+        String str = PlutusFactory.post(PAY_UNIFIED_ORDER_URL, param);
+        System.out.println(str);
+
+        JSONObject json = JSON.parseObject(str);
+
+        String signature = json.getString("signature");
+        String content = json.getString("content");
+
+        //验签
+        Boolean verify = PlutusFactory.verify256(content, Base64.decode(signature));
+        //验签成功
+        if (!verify) {
+            throw new IllegalArgumentException("支付失败签名失败");
+        }
+        //解密
+        byte[] bb = PlutusFactory.decrypt(Base64.decode(content), PlutusFactory.SECRET_KEY);
+        //服务器返回内容
+        String paramOut = new String(bb);
+
+        JSONObject paramObj = JSONObject.parseObject(paramOut);
+
+        if ("1".equals(paramObj.get("status"))) {
+            return new ResultVo(ResultVo.CODE_OK, "成功");
+        } else if ("0".equals(paramObj.get("status"))) {
+            return new ResultVo(ResultVo.CODE_WAIT_PAY, "等待支付完成");
+        } else {
+            return new ResultVo(ResultVo.CODE_ERROR, paramObj.getString("remark"));
+        }
+    }
+}

+ 30 - 25
service-api/src/main/java/com/java110/api/smo/payment/adapt/plutuspay/PlutusOweFeeToNotifyAdapt.java

@@ -15,11 +15,13 @@
  */
 package com.java110.api.smo.payment.adapt.plutuspay;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.java110.api.properties.WechatAuthProperties;
 import com.java110.api.smo.DefaultAbstractComponentSMO;
 import com.java110.api.smo.payment.adapt.IOweFeeToNotifyAdapt;
+import com.java110.core.factory.PlutusFactory;
 import com.java110.core.factory.WechatFactory;
 import com.java110.dto.fee.FeeDto;
 import com.java110.dto.smallWeChat.SmallWeChatDto;
@@ -29,7 +31,7 @@ import com.java110.utils.util.BeanConvertUtil;
 import com.java110.utils.util.DateUtil;
 import com.java110.utils.util.PayUtil;
 import com.java110.utils.util.StringUtil;
-import org.apache.commons.codec.digest.DigestUtils;
+import org.bouncycastle.util.encoders.Base64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -80,30 +82,40 @@ public class PlutusOweFeeToNotifyAdapt extends DefaultAbstractComponentSMO imple
      * @throws Exception
      */
     public String confirmPayFee(String param, String wId) {
-        JSONObject resJson = new JSONObject();
-        resJson.put("errCode", "INTERNAL_ERROR");
-        resJson.put("errMsg", "失败");
+        JSONObject json = JSON.parseObject(param);
+
+        String signature = json.getString("signature");
+        String content = json.getString("content");
+        //验签
+        Boolean verify = PlutusFactory.verify256(param, org.bouncycastle.util.encoders.Base64.decode(signature));
+        //验签成功
+        if (!verify) {
+            throw new IllegalArgumentException("支付失败签名失败");
+        }
+        //解密
+        byte[] bb = PlutusFactory.decrypt(Base64.decode(content), PlutusFactory.SECRET_KEY);
+        //服务器返回内容
+        String paramOut = new String(bb);
         try {
-            JSONObject map = JSONObject.parseObject(param);
+            JSONObject map = JSONObject.parseObject(paramOut);
             logger.info("【银联支付回调】 回调数据: \n" + map);
             //更新数据
             int result = confirmPayFee(map, wId);
             if (result > 0) {
                 //支付成功
-                resJson.put("errCode", "SUCCESS");
-                resJson.put("errMsg", "成功");
+                return "SUCCESS";
             }
         } catch (Exception e) {
             logger.error("通知失败", e);
-            resJson.put("result_msg", "鉴权失败");
+            return "ERROR";
         }
-
-        return resJson.toJSONString();
+        return "ERROR";
     }
 
 
     public int confirmPayFee(JSONObject map, String wId) {
         wId = wId.replace(" ", "+");
+
         ResponseEntity<String> responseEntity = null;
 
         String appId = WechatFactory.getAppId(wId);
@@ -116,25 +128,18 @@ public class PlutusOweFeeToNotifyAdapt extends DefaultAbstractComponentSMO imple
             smallWeChatDto.setMchId(wechatAuthProperties.getMchId());
             smallWeChatDto.setPayPassword(wechatAuthProperties.getKey());
         }
-        SortedMap<String, String> paramMap = new TreeMap<String, String>();
+        TreeMap<String, String> paramMap = new TreeMap<String, String>();
         for (String key : map.keySet()) {
-            if ("wId".equals(key)) {
-                continue;
-            }
+//            if ("wId".equals(key)) {
+//                continue;
+//            }
             paramMap.put(key, map.get(key).toString());
         }
-        String preSign = map.getString("preSign");
-        String text = preSign + smallWeChatDto.getPayPassword();
-        System.out.println("待签名字符串:" + text);
-        String sign = DigestUtils.sha256Hex(getContentBytes(text)).toUpperCase();
+        //String sign = PayUtil.createChinaUmsSign(paramMap, smallWeChatDto.getPayPassword());
+        //JSONObject billPayment = JSONObject.parseObject(map.getString("billPayment"));
+        String outTradeNo = map.get("outTransId").toString();
 
-        if (!sign.equals(map.get("sign"))) {
-            throw new IllegalArgumentException("鉴权失败");
-        }
-//        JSONObject billPayment = JSONObject.parseObject(map.getString("billPayment"));
-//        String orderId = billPayment.get("merOrderId").toString().substring(4);
-        String outTradeNo = map.get("merOrderId").toString();
-        String orderId = outTradeNo.substring(4);
+        String orderId = outTradeNo;
         String order = CommonCache.getAndRemoveValue(FeeDto.REDIS_PAY_OWE_FEE + orderId);
 
         if (StringUtil.isEmpty(order)) {

+ 9 - 4
service-api/src/main/java/com/java110/api/smo/payment/adapt/plutuspay/PlutusPayAdapt.java

@@ -20,7 +20,9 @@ import com.alibaba.fastjson.JSONObject;
 import com.java110.api.properties.WechatAuthProperties;
 import com.java110.api.smo.payment.adapt.IPayAdapt;
 import com.java110.core.factory.ChinaUmsFactory;
+import com.java110.core.factory.PlutusFactory;
 import com.java110.core.factory.WechatFactory;
+import com.java110.dto.owner.OwnerAppUserDto;
 import com.java110.dto.smallWeChat.SmallWeChatDto;
 import com.java110.utils.cache.MappingCache;
 import com.java110.utils.constant.WechatConstant;
@@ -151,16 +153,19 @@ public class PlutusPayAdapt implements IPayAdapt {
         paramMap.put("openId", openid);
         paramMap.put("sn", smallWeChatDto.getMchId()); // 富友分配给二级商户的商户号
         paramMap.put("outTradeId", orderNum);
+        if(OwnerAppUserDto.APP_TYPE_WECHAT_MINA.equals(tradeType)){
+            paramMap.put("isMiniProgram", true);
+        }
         paramMap.put("tradeAmount", PayUtil.moneyToIntegerStr(payAmount));
         paramMap.put("payTypeId", "1003");
         paramMap.put("notifyUrl", notifyUrl + "?wId=" + WechatFactory.getWId(smallWeChatDto.getAppId()));
 
         logger.debug("调用支付统一下单接口" + paramMap.toJSONString());
 
-        String param = PlutusUtil.Encryption(paramMap.toJSONString());
+        String param = PlutusFactory.Encryption(paramMap.toJSONString());
         System.out.println(param);
 
-        String str = PlutusUtil.post(wechatAuthProperties.getWxPayUnifiedOrder(), param);
+        String str = PlutusFactory.post(wechatAuthProperties.getWxPayUnifiedOrder(), param);
         System.out.println(str);
 
         JSONObject json = JSON.parseObject(str);
@@ -169,13 +174,13 @@ public class PlutusPayAdapt implements IPayAdapt {
         String content = json.getString("content");
 
         //验签
-        Boolean verify = PlutusUtil.verify256(content, Base64.decode(signature));
+        Boolean verify = PlutusFactory.verify256(content, Base64.decode(signature));
         //验签成功
         if (!verify) {
             throw new IllegalArgumentException("支付失败签名失败");
         }
             //解密
-            byte[] bb = PlutusUtil.decrypt(Base64.decode(content), PlutusUtil.SECRET_KEY);
+            byte[] bb = PlutusFactory.decrypt(Base64.decode(content), PlutusFactory.SECRET_KEY);
             //服务器返回内容
             String paramOut =  new String(bb);
 

+ 24 - 19
service-api/src/main/java/com/java110/api/smo/payment/adapt/plutuspay/PlutusPayNotifyAdapt.java

@@ -15,11 +15,13 @@
  */
 package com.java110.api.smo.payment.adapt.plutuspay;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.java110.api.properties.WechatAuthProperties;
 import com.java110.api.smo.DefaultAbstractComponentSMO;
 import com.java110.api.smo.payment.adapt.IPayNotifyAdapt;
+import com.java110.core.factory.PlutusFactory;
 import com.java110.core.factory.WechatFactory;
 import com.java110.dto.smallWeChat.SmallWeChatDto;
 import com.java110.utils.constant.CommonConstant;
@@ -27,6 +29,7 @@ import com.java110.utils.util.BeanConvertUtil;
 import com.java110.utils.util.DateUtil;
 import com.java110.utils.util.PayUtil;
 import org.apache.commons.codec.digest.DigestUtils;
+import org.bouncycastle.util.encoders.Base64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -77,25 +80,35 @@ public class PlutusPayNotifyAdapt extends DefaultAbstractComponentSMO implements
      * @throws Exception
      */
     public String confirmPayFee(String param, String wId) {
-        JSONObject resJson = new JSONObject();
-        resJson.put("errCode", "INTERNAL_ERROR");
-        resJson.put("errMsg", "失败");
+
+        JSONObject json = JSON.parseObject(param);
+
+        String signature = json.getString("signature");
+        String content = json.getString("content");
+        //验签
+        Boolean verify = PlutusFactory.verify256(param, org.bouncycastle.util.encoders.Base64.decode(signature));
+        //验签成功
+        if (!verify) {
+            throw new IllegalArgumentException("支付失败签名失败");
+        }
+        //解密
+        byte[] bb = PlutusFactory.decrypt(Base64.decode(content), PlutusFactory.SECRET_KEY);
+        //服务器返回内容
+        String paramOut =  new String(bb);
         try {
-            JSONObject map = JSONObject.parseObject(param);
+            JSONObject map = JSONObject.parseObject(paramOut);
             logger.info("【银联支付回调】 回调数据: \n" + map);
             //更新数据
             int result = confirmPayFee(map, wId);
             if (result > 0) {
                 //支付成功
-                resJson.put("errCode", "SUCCESS");
-                resJson.put("errMsg", "成功");
+                return "SUCCESS";
             }
         } catch (Exception e) {
             logger.error("通知失败", e);
-            resJson.put("result_msg", "鉴权失败");
+            return "ERROR";
         }
-
-        return resJson.toJSONString();
+        return "ERROR";
     }
 
 
@@ -122,20 +135,12 @@ public class PlutusPayNotifyAdapt extends DefaultAbstractComponentSMO implements
             paramMap.put(key, map.get(key).toString());
         }
         //String sign = PayUtil.createChinaUmsSign(paramMap, smallWeChatDto.getPayPassword());
-        String preSign = map.getString("preSign");
-        String text = preSign + smallWeChatDto.getPayPassword();
-        System.out.println("待签名字符串:" + text);
-        String sign = DigestUtils.sha256Hex(getContentBytes(text)).toUpperCase();
-
-        if (!sign.equals(map.get("sign"))) {
-            throw new IllegalArgumentException("鉴权失败");
-        }
         //JSONObject billPayment = JSONObject.parseObject(map.getString("billPayment"));
-        String outTradeNo = map.get("merOrderId").toString();
+        String outTradeNo = map.get("outTransId").toString();
 
         //查询用户ID
         JSONObject paramIn = new JSONObject();
-        paramIn.put("oId", outTradeNo.substring(4));
+        paramIn.put("oId", outTradeNo);
         String url = "fee.payFeeConfirm";
         responseEntity = this.callCenterService(getHeaders("-1"), paramIn.toJSONString(), url, HttpMethod.POST);
 

+ 1 - 1
service-job/src/main/java/com/java110/job/adapt/fee/ReturnPayFeeMoneyAdapt.java

@@ -126,7 +126,7 @@ public class ReturnPayFeeMoneyAdapt extends DatabusAdaptImpl {
         parameters.put("appid", onlinePayDtos.get(0).getAppId());//appid
         parameters.put("mch_id", onlinePayDtos.get(0).getMchId());//商户号
         parameters.put("nonce_str", PayUtil.makeUUID(32));//随机数
-        parameters.put("out_trade_no", onlinePayDtos.get(0).getMchId());//商户订单号
+        parameters.put("out_trade_no", onlinePayDtos.get(0).getOrderId());//商户订单号
         parameters.put("out_refund_no", onlinePayDtos.get(0).getPayId());//我们自己设定的退款申请号,约束为UK
         parameters.put("total_fee", PayUtil.moneyToIntegerStr(Double.parseDouble(onlinePayDtos.get(0).getTotalFee())));//订单金额 单位为分!!!这里稍微注意一下
         parameters.put("refund_fee", PayUtil.moneyToIntegerStr(Double.parseDouble(onlinePayDtos.get(0).getRefundFee())));//退款金额 单位为分!!!

+ 174 - 0
service-job/src/main/java/com/java110/job/adapt/fee/ReturnPayFeeToPlutusAdapt.java

@@ -0,0 +1,174 @@
+package com.java110.job.adapt.fee;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.core.client.FtpUploadTemplate;
+import com.java110.core.client.OssUploadTemplate;
+import com.java110.core.factory.PlutusFactory;
+import com.java110.dto.file.FileDto;
+import com.java110.dto.onlinePay.OnlinePayDto;
+import com.java110.dto.smallWeChat.SmallWeChatDto;
+import com.java110.entity.order.Business;
+import com.java110.intf.acct.IOnlinePayV1InnerServiceSMO;
+import com.java110.intf.fee.IReturnPayFeeInnerServiceSMO;
+import com.java110.intf.order.IOrderInnerServiceSMO;
+import com.java110.intf.store.ISmallWeChatInnerServiceSMO;
+import com.java110.job.adapt.DatabusAdaptImpl;
+import com.java110.po.onlinePay.OnlinePayPo;
+import com.java110.utils.cache.MappingCache;
+import com.java110.utils.constant.WechatConstant;
+import com.java110.utils.util.BeanConvertUtil;
+import com.java110.utils.util.OSSUtil;
+import com.java110.utils.util.PayUtil;
+import com.java110.utils.util.StringUtil;
+import org.bouncycastle.util.encoders.Base64;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 退费审核通过后 通知 微信支付平台退款处理
+ * 业务功能
+ * <p>
+ * 商户针对某一笔已经成功支付的订单发起退款。
+ * <p>
+ * 交互模式
+ * <p>
+ * 请求:后台请求交互模式
+ * <p>
+ * 返回结果:后台请求交互模式
+ * <p>
+ * 说明:支持部份退款;退到银行卡是非实时的,每个银行的处理速度不同,一般发起退款后1-3个工作日内到账。 当调用退款接口返回未知状态,需要调用退款查询接口查询实际退款状态 。 建议 5 秒调一次查询,调用 10 次后状态仍然未知,请在 3 个工作日后重新查询退款状态,或者使用对账单进行确认。
+ * <p>
+ * http://open.plutuspay.com/Index.html
+ *
+ * @author wuxw
+ * @Date 2021-08-19 10:12
+ */
+@Component(value = "returnPayFeeToPlutusAdapt")
+public class ReturnPayFeeToPlutusAdapt extends DatabusAdaptImpl {
+    @Autowired
+    private IReturnPayFeeInnerServiceSMO returnPayFeeInnerServiceSMOImpl;
+
+    @Autowired
+    private IOrderInnerServiceSMO orderInnerServiceSMOImpl;
+
+    @Autowired
+    private IOnlinePayV1InnerServiceSMO onlinePayV1InnerServiceSMOImpl;
+
+
+    @Autowired
+    private ISmallWeChatInnerServiceSMO smallWeChatInnerServiceSMOImpl;
+
+
+    @Autowired
+    private RestTemplate outRestTemplate;
+
+    public static final String wechatReturnUrl = "https://api.mch.weixin.qq.com/secapi/pay/refund";
+
+    private static Logger logger = LoggerFactory.getLogger(ReturnPayFeeMoneyAdapt.class);
+
+    @Autowired
+    private FtpUploadTemplate ftpUploadTemplate;
+
+    @Autowired
+    private OssUploadTemplate ossUploadTemplate;
+
+
+    @Override
+    public void execute(Business business, List<Business> businesses) {
+        JSONObject data = business.getData();
+        OnlinePayPo oaWorkflowDataPo = BeanConvertUtil.covertBean(data, OnlinePayPo.class);
+
+        try {
+            doPayFeeMoney(oaWorkflowDataPo);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    /**
+     * 通知退款
+     *
+     * @param oaWorkflowDataPo
+     */
+    public void doPayFeeMoney(OnlinePayPo oaWorkflowDataPo) throws Exception {
+
+        //查询小区信息
+        OnlinePayDto onlinePayDto = new OnlinePayDto();
+        onlinePayDto.setPayId(oaWorkflowDataPo.getPayId());
+        onlinePayDto.setState(OnlinePayDto.STATE_WT);
+        List<OnlinePayDto> onlinePayDtos = onlinePayV1InnerServiceSMOImpl.queryOnlinePays(onlinePayDto);
+
+        if (onlinePayDtos == null || onlinePayDtos.size() < 1) {
+            return;
+        }
+
+//        String payPassword = "";
+//        String certData = "";
+
+        SmallWeChatDto smallWeChatDto = new SmallWeChatDto();
+        smallWeChatDto.setMchId(onlinePayDtos.get(0).getMchId());
+        smallWeChatDto.setAppId(onlinePayDtos.get(0).getAppId());
+//        List<SmallWeChatDto> smallWeChatDtos = smallWeChatInnerServiceSMOImpl.querySmallWeChats(smallWeChatDto);
+//        if (smallWeChatDto == null || smallWeChatDtos.size() <= 0) {
+//            payPassword = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "key");
+//            certData = MappingCache.getRemark(WechatConstant.WECHAT_DOMAIN, "cert");
+//        } else {
+//            payPassword = smallWeChatDtos.get(0).getPayPassword();
+//            certData = smallWeChatDtos.get(0).getRemarks();
+//        }
+
+        JSONObject parameters = new JSONObject();
+        parameters.put("sn", onlinePayDtos.get(0).getMchId());//商户号
+        parameters.put("outTradeId", onlinePayDtos.get(0).getOrderId());//商户号
+        parameters.put("outRefundId", onlinePayDtos.get(0).getPayId());//我们自己设定的退款申请号,约束为UK
+        parameters.put("refundAmount", PayUtil.moneyToIntegerStr(Double.parseDouble(onlinePayDtos.get(0).getTotalFee())));//订单金额 单位为分!!!这里稍微注意一下
+
+        String param = PlutusFactory.Encryption(parameters.toJSONString());
+        System.out.println(param);
+
+        String str = PlutusFactory.post(wechatReturnUrl, param);
+        System.out.println(str);
+
+        JSONObject json = JSON.parseObject(str);
+
+        String signature = json.getString("signature");
+        String content = json.getString("content");
+
+        //验签
+        Boolean verify = PlutusFactory.verify256(content, org.bouncycastle.util.encoders.Base64.decode(signature));
+        //验签成功
+        if (!verify) {
+            throw new IllegalArgumentException("支付失败签名失败");
+        }
+        //解密
+        byte[] bb = PlutusFactory.decrypt(Base64.decode(content), PlutusFactory.SECRET_KEY);
+        //服务器返回内容
+        String paramOut = new String(bb);
+
+        JSONObject paramObj = JSONObject.parseObject(paramOut);
+
+        if (paramObj.getIntValue("status") == 1) {
+            doUpdateOnlinePay(onlinePayDtos.get(0).getOrderId(), OnlinePayDto.STATE_CT, "退款完成");
+        } else {
+            doUpdateOnlinePay(onlinePayDtos.get(0).getOrderId(), OnlinePayDto.STATE_FT, paramObj.getString("remark"));
+        }
+
+    }
+
+    private void doUpdateOnlinePay(String orderId, String state, String message) {
+        OnlinePayPo onlinePayPo = new OnlinePayPo();
+        onlinePayPo.setMessage(message.length() > 1000 ? message.substring(0, 1000) : message);
+        onlinePayPo.setOrderId(orderId);
+        onlinePayPo.setState(state);
+        onlinePayV1InnerServiceSMOImpl.updateOnlinePay(onlinePayPo);
+    }
+
+}