From 95940263fd3bfc1404e5687010f7f489842023be Mon Sep 17 00:00:00 2001 From: quyixiao <2621048238@qq.com> Date: Thu, 6 Nov 2025 19:24:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/heyu/api/jsapi/JsapiPrepay.java | 2 + .../java/com/heyu/api/jsapi/WXPayUtility.java | 40 ++++--------- .../src/main/resources/bootstrap-dev.yml | 15 ----- .../src/main/resources/bootstrap-online.yml | 17 ------ .../src/main/resources/bootstrap.yml | 13 +++++ .../src/test/java/com/api/test/TestJSAPI.java | 57 ++++++++++++++++++- 6 files changed, 79 insertions(+), 65 deletions(-) diff --git a/api-third/src/main/java/com/heyu/api/jsapi/JsapiPrepay.java b/api-third/src/main/java/com/heyu/api/jsapi/JsapiPrepay.java index 2f76ec2..d46b4ab 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/JsapiPrepay.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/JsapiPrepay.java @@ -42,6 +42,8 @@ public class JsapiPrepay { private PublicKey wechatPayPublicKey; + + @Value("${eb.config.weixin.pay.notifyUrl}") private String notifyUrl; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/WXPayUtility.java b/api-third/src/main/java/com/heyu/api/jsapi/WXPayUtility.java index a963024..633cc3f 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/WXPayUtility.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/WXPayUtility.java @@ -1,22 +1,13 @@ package com.heyu.api.jsapi; -import com.google.gson.ExclusionStrategy; -import com.google.gson.FieldAttributes; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonSyntaxException; +import com.google.gson.*; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; - -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.Map.Entry; - import okhttp3.Headers; import okhttp3.Response; import okio.BufferedSource; +import org.bouncycastle.crypto.digests.SM3Digest; +import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; @@ -25,34 +16,23 @@ import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.GCMParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.io.IOException; +import java.io.InputStream; import java.io.UncheckedIOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; -import java.security.InvalidAlgorithmParameterException; -import java.security.InvalidKeyException; -import java.security.KeyFactory; -import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.SecureRandom; -import java.security.Signature; -import java.security.SignatureException; +import java.security.*; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; +import java.text.SimpleDateFormat; import java.time.DateTimeException; import java.time.Duration; import java.time.Instant; -import java.security.MessageDigest; -import java.io.InputStream; - -import org.bouncycastle.crypto.digests.SM3Digest; -import org.bouncycastle.jce.provider.BouncyCastleProvider; - -import java.security.Security; +import java.util.*; +import java.util.Map.Entry; public class WXPayUtility { private static final Gson gson = new GsonBuilder() @@ -141,7 +121,7 @@ public class WXPayUtility { * @return PrivateKey 对象 */ public static PrivateKey loadPrivateKeyFromPath(String keyPath) { - return loadPrivateKeyFromString(readKeyStringFromPath(keyPath)); + return loadPrivateKeyFromString(keyPath); } /** @@ -171,7 +151,7 @@ public class WXPayUtility { * @return PublicKey 对象 */ public static PublicKey loadPublicKeyFromPath(String keyPath) { - return loadPublicKeyFromString(readKeyStringFromPath(keyPath)); + return loadPublicKeyFromString(keyPath); } /** diff --git a/api-web/api-interface/src/main/resources/bootstrap-dev.yml b/api-web/api-interface/src/main/resources/bootstrap-dev.yml index 71531aa..e9300f8 100644 --- a/api-web/api-interface/src/main/resources/bootstrap-dev.yml +++ b/api-web/api-interface/src/main/resources/bootstrap-dev.yml @@ -60,20 +60,5 @@ spring: username: admin password: XiIg37HKfQg2 -eb: - config: - weixin: - pay: - mchid: 1731491745 - certificateSerialNo: 793D48CCEB62C6B227E0A4F46AD90279B149A7BE - privateKeyFilePath: /Users/quyixiao/Desktop/weixincert/apiclient_key.pem - wechatPayPublicKeyId: PUB_KEY_ID_0117314917452025110400382304001401 - wechatPayPublicKeyFilePath: /Users/quyixiao/Desktop/weixincert/wxp_pub.pem - appid: wx75fa59c097bd3dfd - notifyUrl: https://api.1024api.com/api-interface/app/weixin/payNotify - apiv3key: E938F17ABF6843743F49688269F73B7D - - - diff --git a/api-web/api-interface/src/main/resources/bootstrap-online.yml b/api-web/api-interface/src/main/resources/bootstrap-online.yml index 5bb287c..87e4ae4 100644 --- a/api-web/api-interface/src/main/resources/bootstrap-online.yml +++ b/api-web/api-interface/src/main/resources/bootstrap-online.yml @@ -55,23 +55,6 @@ spring: password: XiIg37HKfQg2 -eb: - config: - weixin: - pay: - mchid: 1731491745 - certificateSerialNo: 793D48CCEB62C6B227E0A4F46AD90279B149A7BE - privateKeyFilePath: /root/weixincert/apiclient_key.pem - wechatPayPublicKeyId: PUB_KEY_ID_0117314917452025110400382304001401 - wechatPayPublicKeyFilePath: /root/weixincert/wxp_pub.pem - appid: wx75fa59c097bd3dfd - notifyUrl: https://api.1024api.com/api-interface/app/weixin/payNotify - apiv3key: E938F17ABF6843743F49688269F73B7D - - - - - diff --git a/api-web/api-interface/src/main/resources/bootstrap.yml b/api-web/api-interface/src/main/resources/bootstrap.yml index 68c7f79..9c0a940 100644 --- a/api-web/api-interface/src/main/resources/bootstrap.yml +++ b/api-web/api-interface/src/main/resources/bootstrap.yml @@ -64,6 +64,19 @@ eb: delayExchangeName: DELAY_EXCHANGE_NAME_TEST + weixin: + pay: + mchid: 1731491745 + certificateSerialNo: 793D48CCEB62C6B227E0A4F46AD90279B149A7BE + privateKeyFilePath: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCzn74aYlkoD1lOrcbpqW9aIE/IiH/lAea+nFmmmao5ggxrXhnvkGDQ3e+59Cf59jTikKxmMc+aj36maxrd/OYDM27j0q5b7t8fWPD4qqyMR2uqiImc622BpQIxaPUeLeDHwsHq4C6g0UzZ6DXJppHpb6xn0gEFHS87Na0hhElCbEpjEnbyhRmOC1yDPDmnDTGMX2LP0Cxx6U1pX4JmYToQ0/iOFeD8F9sLrQElGelJnDS6QY+L+qKe7SecNv0axvbwyGXuSUef2+GWgBCnBeWTZhhHNPNAFo6fQR9+zaQmZEksg9HxmAKLxG1w6YSMXQWk8psSiCSoiQfu39m3pN13AgMBAAECggEAbhvoPug22xW9mztvieDxf3/7KGR0cf+eYQ4a7sOX07TixBZlM7N/hcnmoEkJEHNaq+Afrm2uY4K/EmjpiVbz8NZgjYuiknx1jhPJc8W8DCnj2B/mq6it8iEinQNH7v4Uop/Cm6ZdLvvebl2oSzquiziHqQTU1zuyrksTHE6pUetj6ci2AgyKOpyZ3nJ8ivgUSFuvQjlEQ1aJFrFg6nm52MTdJqB9JaQEcBYxw21JCfl1zNZ7EO4eFBqzNO0ttu3EJckYDKClhcesNrJJGUHvPFGo2hfOd2ZzfA4UnaL7yaraAJxQbqwnXOoaV14ka9HYNfakmz59348AxrIbPtHj0QKBgQDskdn7Cut/1DV2EhW26rNj9zaXt55COujHf5+0htj9JrZ6u9s4sCHuzPo8rLiAw7/Pvksfa7Oq+BHE65rMds88KluLyW84b1Wd4annyI+anjtDyz3Chmx7NGQyaHg7lfOqJ09S/0T6WwSViZJz3Fp6p39+1ROyhWZaFRQIwrA6UwKBgQDCYIrAYFnqBaXMk5wFoDg2kc7H6/SL9wgxTo5EwV/ccqFirbScjuM9IkylcIx02gKUH9y+3aDccNPr7PqIreLip9sX+DdFqDa5yEtY4XNR9zAf0aSgo+qSCAtgMqrWwyV+fKUjbzEbEjD7STPXLy+r1YC0g0Z7WeszLG0f4MYTzQKBgQCkCFW+7klwrzIKlmucE40jqYyfEmCXx8UUX3fbcw0OK0OoQo209tvwewyf+ZtNHW3onCf2t3Uy/SNFCaCiWVdEfpJPkPKfjQMuoARxhO2d5k1tqoU+VnrtytwW371Og6EawHsOL5Yiie3ZyjRURdwu4+lRhmlMBZd8qtTjZitPpQKBgQCVrMOLKWZzRxAJvOxahKpkkthYp//yOzHqzePNW95WIUrWco3uNDUVITFF/6mYXTu5FePkcULqHFODi0LMNqHMCJc0GOVu1P33Bx3F/izPw/kht0v+itoYwusHk1xr7W8UvCRpabi1cMeY6CBsJaCev9PQrHl8iJwNFruc3XeJTQKBgFt31iujP7W2FHaT6uyO1gKSlqCcZILD2F15Q52OYQoV6I5Tq152ITyMyE4EiYPOqnqVWUc+ej1m+AuvYljRqlvVCmp91QtYwLGguuHFYNVcE2V3WftKKbIIPT2qEFaS5eUb6hB+kl02E1EmjCtApwssCVJj81yu/DsBP0580zBL + wechatPayPublicKeyId: PUB_KEY_ID_0117314917452025110400382304001401 + wechatPayPublicKeyFilePath: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx/QqdSnkS8wd7xFH0LHVpZTFVI+eWL383eAP7RaxHfRwXNDfZYrdi/Bt8Enko+1Wkr2FGY2kS4Hol5NCvuZ7UY28/L4r95dBEgXtflkrxeVbiNbWHtiIdNXZSgkrpUkZEFoh7ks5Ou3pAlpG+94/Nnc//D/yckM7AuD85G1foZMSO5niyVeFAed6z7CeBMAhRVdnOIDUqsI/NaHruT4fvWNzPnn5SQKoKum00vRHckxftUqMkZ1D/YxHiAycEc9H0hCgLW7ZM6UV88Loa6SPvhM0fmXIuk6p277ldlxFl6Bcxd5jOcCTjdpWaB3CeSXnSIBl6KsZNcV3vPC3xey1WwIDAQAB + appid: wx75fa59c097bd3dfd + notifyUrl: https://api.1024api.com/api-interface/app/weixin/payNotify + apiv3key: E938F17ABF6843743F49688269F73B7D + + + diff --git a/api-web/api-interface/src/test/java/com/api/test/TestJSAPI.java b/api-web/api-interface/src/test/java/com/api/test/TestJSAPI.java index c7bedde..8465253 100644 --- a/api-web/api-interface/src/test/java/com/api/test/TestJSAPI.java +++ b/api-web/api-interface/src/test/java/com/api/test/TestJSAPI.java @@ -3,28 +3,79 @@ package com.api.test; import com.alibaba.fastjson.JSON; import com.heyu.api.jsapi.JsapiPrepay; import com.heyu.api.jsapi.WXPayUtility; -import com.heyu.api.jsapi.dto.*; +import com.heyu.api.jsapi.dto.CommonAmountInfo; +import com.heyu.api.jsapi.dto.DirectAPIv3JsapiPrepayRequest; +import com.heyu.api.jsapi.dto.DirectAPIv3JsapiPrepayResponse; +import com.heyu.api.jsapi.dto.JsapiReqPayerInfo; public class TestJSAPI { public static void main(String[] args) { + + String wechatPayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx/QqdSnkS8wd7xFH0LHV" + + "pZTFVI+eWL383eAP7RaxHfRwXNDfZYrdi/Bt8Enko+1Wkr2FGY2kS4Hol5NCvuZ7" + + "UY28/L4r95dBEgXtflkrxeVbiNbWHtiIdNXZSgkrpUkZEFoh7ks5Ou3pAlpG+94/" + + "Nnc//D/yckM7AuD85G1foZMSO5niyVeFAed6z7CeBMAhRVdnOIDUqsI/NaHruT4f" + + "vWNzPnn5SQKoKum00vRHckxftUqMkZ1D/YxHiAycEc9H0hCgLW7ZM6UV88Loa6SP" + + "vhM0fmXIuk6p277ldlxFl6Bcxd5jOcCTjdpWaB3CeSXnSIBl6KsZNcV3vPC3xey1" + + "WwIDAQAB"; + + + + String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCzn74aYlkoD1lO" + + "rcbpqW9aIE/IiH/lAea+nFmmmao5ggxrXhnvkGDQ3e+59Cf59jTikKxmMc+aj36m" + + "axrd/OYDM27j0q5b7t8fWPD4qqyMR2uqiImc622BpQIxaPUeLeDHwsHq4C6g0UzZ" + + "6DXJppHpb6xn0gEFHS87Na0hhElCbEpjEnbyhRmOC1yDPDmnDTGMX2LP0Cxx6U1p" + + "X4JmYToQ0/iOFeD8F9sLrQElGelJnDS6QY+L+qKe7SecNv0axvbwyGXuSUef2+GW" + + "gBCnBeWTZhhHNPNAFo6fQR9+zaQmZEksg9HxmAKLxG1w6YSMXQWk8psSiCSoiQfu" + + "39m3pN13AgMBAAECggEAbhvoPug22xW9mztvieDxf3/7KGR0cf+eYQ4a7sOX07Ti" + + "xBZlM7N/hcnmoEkJEHNaq+Afrm2uY4K/EmjpiVbz8NZgjYuiknx1jhPJc8W8DCnj" + + "2B/mq6it8iEinQNH7v4Uop/Cm6ZdLvvebl2oSzquiziHqQTU1zuyrksTHE6pUetj" + + "6ci2AgyKOpyZ3nJ8ivgUSFuvQjlEQ1aJFrFg6nm52MTdJqB9JaQEcBYxw21JCfl1" + + "zNZ7EO4eFBqzNO0ttu3EJckYDKClhcesNrJJGUHvPFGo2hfOd2ZzfA4UnaL7yara" + + "AJxQbqwnXOoaV14ka9HYNfakmz59348AxrIbPtHj0QKBgQDskdn7Cut/1DV2EhW2" + + "6rNj9zaXt55COujHf5+0htj9JrZ6u9s4sCHuzPo8rLiAw7/Pvksfa7Oq+BHE65rM" + + "ds88KluLyW84b1Wd4annyI+anjtDyz3Chmx7NGQyaHg7lfOqJ09S/0T6WwSViZJz" + + "3Fp6p39+1ROyhWZaFRQIwrA6UwKBgQDCYIrAYFnqBaXMk5wFoDg2kc7H6/SL9wgx" + + "To5EwV/ccqFirbScjuM9IkylcIx02gKUH9y+3aDccNPr7PqIreLip9sX+DdFqDa5" + + "yEtY4XNR9zAf0aSgo+qSCAtgMqrWwyV+fKUjbzEbEjD7STPXLy+r1YC0g0Z7Wesz" + + "LG0f4MYTzQKBgQCkCFW+7klwrzIKlmucE40jqYyfEmCXx8UUX3fbcw0OK0OoQo20" + + "9tvwewyf+ZtNHW3onCf2t3Uy/SNFCaCiWVdEfpJPkPKfjQMuoARxhO2d5k1tqoU+" + + "VnrtytwW371Og6EawHsOL5Yiie3ZyjRURdwu4+lRhmlMBZd8qtTjZitPpQKBgQCV" + + "rMOLKWZzRxAJvOxahKpkkthYp//yOzHqzePNW95WIUrWco3uNDUVITFF/6mYXTu5" + + "FePkcULqHFODi0LMNqHMCJc0GOVu1P33Bx3F/izPw/kht0v+itoYwusHk1xr7W8U" + + "vCRpabi1cMeY6CBsJaCev9PQrHl8iJwNFruc3XeJTQKBgFt31iujP7W2FHaT6uyO" + + "1gKSlqCcZILD2F15Q52OYQoV6I5Tq152ITyMyE4EiYPOqnqVWUc+ej1m+AuvYljR" + + "qlvVCmp91QtYwLGguuHFYNVcE2V3WftKKbIIPT2qEFaS5eUb6hB+kl02E1EmjCtA" + + "pwssCVJj81yu/DsBP0580zBL"; + // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/merchant/4013070756 JsapiPrepay client = new JsapiPrepay( "1731491745", // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/merchant/4013070756 "793D48CCEB62C6B227E0A4F46AD90279B149A7BE", // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013053053 - "/Users/quyixiao/Desktop/weixincert/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径 + privateKey, // 商户API证书私钥文件路径,本地文件路径 "PUB_KEY_ID_0117314917452025110400382304001401", // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013038816 - "/Users/quyixiao/Desktop/weixincert/wxp_pub.pem" // 微信支付公钥文件路径,本地文件路径 + wechatPayPublicKey // 微信支付公钥文件路径,本地文件路径 ); + + System.out.println("privateKey:"+privateKey); + System.out.println("wechatPayPublicKey:" +wechatPayPublicKey); + + + DirectAPIv3JsapiPrepayRequest request = new DirectAPIv3JsapiPrepayRequest(); request.setAppid("wx75fa59c097bd3dfd"); request.setMchid("1731491745"); request.setNotifyUrl("https://api.1024api.com/api-interface/app/weixin/payNotify"); request.setDescription("Image形象店-深圳腾大-QQ公仔"); + + + + request.setOutTradeNo("12177525011"); request.setTimeExpire(WXPayUtility.generateExpireTime()); // 2025-11-05T21:02:16+08:00 request.setAttach("自定义数据说明");