无关风月
2024-10-14 b60e601d62c0e2d5c4fd1df9f12fa09f2bf99987
xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/JuHeFuUtil.java
@@ -10,14 +10,19 @@
import com.xinquan.common.core.utils.StringUtils;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
/**
 * 桔禾付支付工具类
@@ -29,15 +34,15 @@
    private static Logger logger = LoggerFactory.getLogger(JuHeFuUtil.class);
    // 商户RSA私钥 TODO
    private static final String MERCHANT_PRIVATE_KEY = "";
    private static final String MERCHANT_PRIVATE_KEY = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMQPsMj4OYgjHFWS8wDIQOoMeAx9Ad1wKfIks7Oz5Kw8EVnmZ9o1ZY14goMMr1vJo/XxLLYXDvwj+EhV4MqT6ji2QDVqlhA4f6WFFmKOsvxgNnu0zAysfDpVpYihWC5uOf4ece9fWVci8DYFeXcawYGNB6GrJuo186sqMYwkE90/AgMBAAECgYAnMvfmhnKCPHraxSGeo2sPIGUUIh4wVs+cIShoomvy36OcdMuIvipKqbB2YR/iWyNT9d85nMybLtniJIFoH0CxshmLH/yg31vYhyLfVyih1RVFBRYuDMnIjvmNTBgXM/9vaAwkzonIQnoFoLVjxK2+JIFY+86Iak1Cv/vEi1vaSQJBAPRwebK51NBfrnO+2HY9nuDvbZbSx9I8uR+Yw/ebDUmbow/Dacibl0Hha+fw6cy5I3Rlm2kk5fKXIDIkwyLVq80CQQDNVXuQ8kXrDR0WjPcYPnwKNPEd0EHOKFiT7OqwoMFUUROyajO2nWs80eiZYZ+6M6+LEvYT6KcSiyiIwREnh1k7AkBV3BwjNzsVZkZ0yZhnEAX6pJ8t1yPxKPstqg9Lrd7g+BYyt0U0/dIHhhLNCcZV7sIRZI9OQ3Ox3nukoV0Zo0wRAkBT1eEbry+I5tPHj0qb5Xczm6YOrCcSCzsPOp4f+6Kz0F6ga+gtWVyden7jkQ5sMgosWFOMkWMVmSe1nk5ou0RdAkEAzfJJavQgu+BGQwqS1EojlXKe0GmpbQu+HwuDKcHmju0P2qGQ2yPfvURg1dMp7tmBM8AlVJhgzkNuyUAN1J841w==";
    // 平台RSA公钥 TODO
    private static final String PLAT_PUBLIC_KEY = "";
    private static final String PLAT_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOKBBFXirWIJth+SNJCY4mhbATbL60sKV66bRixHMVz8vpBqONio9X6A+Pm9LNutBe+hLpI1BMmFJk3Mb1/QEcklWptRGgHqIrBxR4b19qc/2/pSxyqlpaifYJFZhOg2+OcQ/fqpAmhNXN5uc1pcYvbvWTam0j+6+nBNQeAAku5QIDAQAB";
    // 应用的app_id TODO
    private static final String APP_ID = "";
    private static final String APP_ID = "app_10024101201";
    // 商户id TODO
    private static final String MER_ID = "";
    private static final String MER_ID = "1120241012072667";
    // AES密钥 TODO
    private static final String AES_KEY = "";
    private static final String AES_KEY = "cb0a181ac97395c6942be19315fc0727";
    // 创建用户接口
    private static final String CREATE_USER_INTERFACE = "/api/member/create_user_a";
    // 创建支付订单
@@ -46,7 +51,7 @@
    private static final String PAYMENT_REFUND_INTERFACE = "/api/payment/payment_refund";
    private static final String MERCHANT_PAY_INTERFACE = "/api/account/merchant_pay";
    // 接口地址 TODO
    private static final String BASE_URL = "";
    private static final String BASE_URL = "http://paytest.juhefu.com/";
    // 支付宝支付渠道
    private static final String PAY_CHANNEL_ALIPAY = "alipay_qr";
    // 微信支付渠道
@@ -92,6 +97,11 @@
        return false;
    }
    public static void main(String[] args) throws Exception {
        createPayment("MX123aaa9999911",1, "0.01",
                "测试商品", "测试商品描述",
                "221.182.45.100", "oG50n6Vf0JNid5DOg0brcAnZ0T4s", "https://v7ro848ar5jx.ngrok.xiaomiqiu123.top/order/client/order/order/testCallback");
    }
    /**
     * 创建支付订单
     *
@@ -113,7 +123,6 @@
        JSONObject expand = new JSONObject();
        data.put("order_no", orderNo);
        data.put("app_id", APP_ID);
        data.put("mer_id", MER_ID);
        if (payChannel == 1) {
            data.put("pay_channel", PAY_CHANNEL_ALIPAY);
        } else {
@@ -134,16 +143,22 @@
        body.put("sign", sign(JSONObject.toJSONString(data)));
        body.put("reqCipher",
                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmssfff"));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmsssss"));
        String result = sendPost(BASE_URL + CREATE_PAYMENT_INTERFACE, body);
        JSONObject resJsonObject = JSONObject.parseObject(result);
        if (resJsonObject.getString("status").equals("failed")) {
            throw new ServiceException(resJsonObject.getString("error_msg"));
        }
        if (resJsonObject.getString("status").equals("succeeded")) {
            return resJsonObject.getJSONObject("expand");
        }
        return null;
        System.err.println(resJsonObject);
        String string = resJsonObject.getString("resCipher");
        String decrypt = decrypt(string);
        System.err.println(decrypt);
        JSONObject jsonObject = JSONObject.parseObject(decrypt);
//        if (resJsonObject.getString("status").equals("failed")) {
//            throw new ServiceException(resJsonObject.getString("error_msg"));
//        }
//        if (resJsonObject.getString("status").equals("succeeded")) {
//            return resJsonObject.getJSONObject("expand");
//        }
        return jsonObject.getJSONObject("expand");
    }
    /**
@@ -198,7 +213,7 @@
        body.put("sign", sign(JSONObject.toJSONString(data)));
        body.put("reqCipher",
                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmssfff"));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmss"));
        String result = sendPost(BASE_URL + MERCHANT_PAY_INTERFACE, body);
        JSONObject resJsonObject = JSONObject.parseObject(result);
        if (resJsonObject.getString("status").equals("succeeded")) {
@@ -233,6 +248,7 @@
    }
    /**
     * RSA私钥签名:签名方式SHA256WithRSA
     *
@@ -243,7 +259,6 @@
    public static String sign(String data) {
        // 先对该json对象数据按照参数字典顺序(参数名ASCII码从小到大排序,参数名区分大小写)排序生成字符串,再进行加签和验签。
        data = JSON.toJSONString(JSONObject.parseObject(data, TreeMap.class));
        // Base64 --> Key
        try {
            byte[] bytes = Base64.getDecoder().decode(MERCHANT_PRIVATE_KEY);
@@ -261,5 +276,33 @@
            return null;
        }
    }
    public static String decrypt(String strToDecrypt) {
        try {
        SecretKeySpec secretKey = new SecretKeySpec(AES_KEY.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
    } catch (Exception e) {
            System.out.println("Error while decrypting: " + e.toString());
    }
        return null;}
//    public static boolean verify(String data, String publicKeyStr) {
//        try {
//            // 解码公钥
//            byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr);
//            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
//            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
//            PublicKey publicKey = keyFactory.generatePublic(keySpec);
//            // 验证签名
//            Signature signature = Signature.getInstance("SHA256WithRSA");
//            signature.initVerify(publicKey);
//            signature.update(data.getBytes("UTF-8"));
//
//            return true;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }
}