| | |
| | | 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; |
| | | |
| | | /** |
| | | * 桔禾付支付工具类 |
| | |
| | | |
| | | 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"; |
| | | // 创建支付订单 |
| | |
| | | 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"; |
| | | // 微信支付渠道 |
| | |
| | | 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"); |
| | | } |
| | | /** |
| | | * 创建支付订单 |
| | | * |
| | |
| | | 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 { |
| | |
| | | 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"); |
| | | } |
| | | |
| | | /** |
| | |
| | | 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")) { |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * RSA私钥签名:签名方式SHA256WithRSA |
| | | * |
| | |
| | | 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); |
| | |
| | | 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; |
| | | // } |
| | | // } |
| | | |
| | | } |