From 439ac950f3ddfd14e5e46211e9819fbbdabf3ee7 Mon Sep 17 00:00:00 2001 From: wuchunlei Date: Tue, 21 Oct 2025 17:33:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98=E5=AE=9D?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=81=B5=E6=9E=A2=E5=95=86=E6=88=B7=EF=BC=8C?= =?UTF-8?q?=E5=9F=B9=E8=AE=AD=E7=8F=AD=E6=8A=A5=E5=90=8D=E7=94=A8=E7=81=B5?= =?UTF-8?q?=E6=9E=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/peanut/config/ShiroConfig.java | 2 + .../modules/common/entity/BuyOrder.java | 2 +- .../pay/alipay/config/AliPayConfig.java | 50 +++---- .../modules/pay/alipay/config/AliPayUtil.java | 10 +- .../modules/pay/alipay/dto/AlipayDTO.java | 2 + .../modules/pay/alipay/dto/ReFundDTO.java | 2 + .../service/impl/AliPayServiceImpl.java | 27 +++- .../pay/weChatPay/config/WechatPayConfig.java | 141 +++++++----------- .../controller/WeChatPayController.java | 18 ++- .../pay/weChatPay/service/WxpayService.java | 4 + .../service/impl/WxpayServiceImpl.java | 102 +++++++++++-- .../modules/pay/weChatPay/util/WxPayUtil.java | 44 +++--- src/main/resources/application-dev.yml | 22 ++- src/main/resources/application-dev1.yml | 21 ++- src/main/resources/application-prod.yml | 23 ++- src/main/resources/application-test.yml | 22 ++- .../resources/cent/lscent/apiclient_cert.p12 | Bin 0 -> 2798 bytes .../resources/cent/lscent/apiclient_cert.pem | 25 ++++ .../resources/cent/lscent/apiclient_key.pem | 28 ++++ ...CFE19A12EDB4D9E0C7DF01DBF457C657566D04.pem | 24 +++ .../cent/lscent/证书使用说明.txt | 18 +++ 21 files changed, 416 insertions(+), 171 deletions(-) create mode 100644 src/main/resources/cent/lscent/apiclient_cert.p12 create mode 100644 src/main/resources/cent/lscent/apiclient_cert.pem create mode 100644 src/main/resources/cent/lscent/apiclient_key.pem create mode 100644 src/main/resources/cent/lscent/wechatpay_30CFE19A12EDB4D9E0C7DF01DBF457C657566D04.pem create mode 100644 src/main/resources/cent/lscent/证书使用说明.txt diff --git a/src/main/java/com/peanut/config/ShiroConfig.java b/src/main/java/com/peanut/config/ShiroConfig.java index 3f3d7206..3a062811 100644 --- a/src/main/java/com/peanut/config/ShiroConfig.java +++ b/src/main/java/com/peanut/config/ShiroConfig.java @@ -67,7 +67,9 @@ public class ShiroConfig { filterMap.put("book/task/list","anon"); // 网站接口 filterMap.put("/pay/aliPay/notify","anon"); // 支付宝回调接口 filterMap.put("/pay/payNotify","anon"); // 微信回调接口 + filterMap.put("/pay/lsPayNotify","anon"); // 微信回调接口 filterMap.put("/pay/refundNotify","anon"); // 微信退款回调接口 + filterMap.put("/pay/lsRefundNotify","anon"); // 微信退款回调接口 filterMap.put("/pay/paypal/receivePaypalStatus","anon"); // paypal回调接口 filterMap.put("/weChat/**","anon"); filterMap.put("/book/baseArea/getAllBaseArea","anon");//登录前获取全部区域 diff --git a/src/main/java/com/peanut/modules/common/entity/BuyOrder.java b/src/main/java/com/peanut/modules/common/entity/BuyOrder.java index 8ea48799..ddbe51ee 100644 --- a/src/main/java/com/peanut/modules/common/entity/BuyOrder.java +++ b/src/main/java/com/peanut/modules/common/entity/BuyOrder.java @@ -153,7 +153,7 @@ public class BuyOrder implements Serializable { private String buyType; /** - * vip order point aiVip upgradeAiVip + * vip order point relearn trainingClass aiVip upgradeAiVip */ private String orderType; diff --git a/src/main/java/com/peanut/modules/pay/alipay/config/AliPayConfig.java b/src/main/java/com/peanut/modules/pay/alipay/config/AliPayConfig.java index 4c5f04c1..aa6d7829 100644 --- a/src/main/java/com/peanut/modules/pay/alipay/config/AliPayConfig.java +++ b/src/main/java/com/peanut/modules/pay/alipay/config/AliPayConfig.java @@ -14,29 +14,30 @@ public class AliPayConfig { * 花生appId 沙箱id 2021002161620176 */ public static final String HS_APP_ID ="2021003191621137"; - - /** - * 花生应用私钥 - */ + //花生应用私钥 public static final String HS_MERCHANT_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCa+oIVGBAKp+VjHIeE/IFUFWifnUWQYBPwffWEC5+EKJbqEC/wcVSfZPKXpPAB3T0c6V6yxCOMxguUZEdeRM5W93Wf0jktrtius34Xo79vgnLXsj2TtAN1ku9Qp5ebVVw+WPdpIl1nOFNwCoiaSPmwXOsVIT5MccxUvmGUDNUg8dYVoD9WHYu13O30c4vm+jYGCu7lviRqcjnEFooJ/ORocLqJbHFaTzWMGiiAYnUUSTL1BI5vhDNJDhm3B5wUZ7/j49EWQYZbV0fXlCrZRerfPLrAgXYR95P+62K9Xh8edzThTrPXmLXP9/jTqz2118ijXSoF8EgfhVD2NLCSDid3AgMBAAECggEAR3cPN0TyWMeVer+0Knn59Vkt9rSiWHJFn5el+K8Xbuz8spCmWp0YJax6Rb10Q5fOz5854PubXRYSTupzEqBt+iKApiNd5JgFKYJxudrzsysXZCm4RX00PypzmuC9g464S7Pg2yVSpv+NUlQ5K9RM96vRZ9v9i2jKjaWA/7FvMpI3auOJgrJVoSbPYNx6/QIN1b9imukCMSga9OzF66LhfzACWxJx+DzgAX+7GcfhTF8PbhytPPg9LhlfcGq2gA/TcG6zUorFz5Qy+k//g4rxIvjcPnGfcRgoT+Xgi7I8wnm3O5icIZ6k6+B+wwN3zRTBSmXwbwsgdncGA1RUhe2tAQKBgQDweYu2ij8Io/g7KCvCtVpGHqhzKxgaOZXy0nvPFXY5KFcrrapACriztCaxjvRTXm7t25KJQazICs50OvyTZL5+U3GHp/8GK7KwzZKz5NkHHMtKoKwQADBNau/nHdro4E+PnvL9ucaFX69JF4DZqiw2aDkQkDB/BablHyvuTagJgQKBgQCk++uzero6bXOxFMadLLyWTvlOJP71U1fVSf4Nou+L4ce7k2bMpSDyEDNDOUW3WOO7zz9i8mFGCTUaoX3mhC+B9UQqKZXK2rjFgZtkNDumoCTzvjuPIWTMNN6ABetiLxbq/UD0O1xwThVQNmYwTOzwMHUMkT21ynD23KXE0JL89wKBgGg1Q8YmwooMBFYeYlhOHoCkaHsAAcHbko9Xhy+GLWU3hg73gv+dpcy6FMp9GIPIOGn67NVuEGHfzPexWCLHVYWIw3n14x3ZceYML7alRSc/4xjD58xHSKdD4BJXbbXc/p1OVB5/kvfZLyyNctjgVah+Ibx7v4hL+rbveyoZnOgBAoGAG34je+giqmPc2JB2vHBdCMsmPkBqACWgSFmpLUqOkofQSdC5W7bUs6HBeR1NIc19Pam+jVWIoiwcnlB083nplMVzU3dUj9Y83iTH6T3PBug+4CM+N47ABkt1HG5gGB9yuTv0m/5cXBaW9KPsCXZ4MVpR1wNI/kc65dhFA3QiWmcCgYEA6CfUjOWe201IC332e142WfPGp7hy8p6RHrPtlXS5YnuxVsJVusyuncVdG10kPkvPHakFokqNNUW76Trf++IPnNooMP9ucYj060hYTM7JK9F0mAdx0Mo/+nDC7voXw8rBSsLZHAWfxMh/KjQ5D7L6E2S71wP6ep25hoOuuuLTnrI="; - - /** - * 应用公钥 - */ - + //应用公钥 public static final String HS_ALI_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmvqCFRgQCqflYxyHhPyBVBVon51FkGAT8H31hAufhCiW6hAv8HFUn2Tyl6TwAd09HOlessQjjMYLlGRHXkTOVvd1n9I5La7YrrN+F6O/b4Jy17I9k7QDdZLvUKeXm1VcPlj3aSJdZzhTcAqImkj5sFzrFSE+THHMVL5hlAzVIPHWFaA/Vh2Ltdzt9HOL5vo2Bgru5b4kanI5xBaKCfzkaHC6iWxxWk81jBoogGJ1FEky9QSOb4QzSQ4ZtwecFGe/4+PRFkGGW1dH15Qq2UXq3zy6wIF2EfeT/utivV4fHnc04U6z15i1z/f406s9tdfIo10qBfBIH4VQ9jSwkg4ndwIDAQAB"; + //支付宝公钥 + public static final String HS_ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiVLUVTnNuq+2C1FRtcIRcG3rCgtVVulkz2QljKbPr7NNWTJJIIfGwyhNuH76s5D1lvNmn2NkuoqM0cMJCSd+W+JW9KpdQ0dgumFHCoRA/OWUoqpLvEOmm2hRMaWpvd+OQq2aPz+p+z6pqZ9SAlgUIolzrUn4idCvgIycqRaGsf1sEJFR5W+rneqtMhNYHdwemqaqnysInwshHR3cHs1AC6y/eL6pcQhaYJ5qVMIRg54/6Lr4CU114Rmph7UM9C28ulmHkFMN/DKPUDbM1+glxjzmqHQChY293Db0dlwZeiDWF3Tli2BVd6pz5KEkQlUsGeLW1O0rT9T9sxzsavxArwIDAQAB"; /** - * 支付宝公钥 + * 灵枢appId 沙箱id 2021002161620176 */ + public static final String LS_APP_ID ="2021003191621137"; + //灵枢应用私钥 + public static final String LS_MERCHANT_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCa+oIVGBAKp+VjHIeE/IFUFWifnUWQYBPwffWEC5+EKJbqEC/wcVSfZPKXpPAB3T0c6V6yxCOMxguUZEdeRM5W93Wf0jktrtius34Xo79vgnLXsj2TtAN1ku9Qp5ebVVw+WPdpIl1nOFNwCoiaSPmwXOsVIT5MccxUvmGUDNUg8dYVoD9WHYu13O30c4vm+jYGCu7lviRqcjnEFooJ/ORocLqJbHFaTzWMGiiAYnUUSTL1BI5vhDNJDhm3B5wUZ7/j49EWQYZbV0fXlCrZRerfPLrAgXYR95P+62K9Xh8edzThTrPXmLXP9/jTqz2118ijXSoF8EgfhVD2NLCSDid3AgMBAAECggEAR3cPN0TyWMeVer+0Knn59Vkt9rSiWHJFn5el+K8Xbuz8spCmWp0YJax6Rb10Q5fOz5854PubXRYSTupzEqBt+iKApiNd5JgFKYJxudrzsysXZCm4RX00PypzmuC9g464S7Pg2yVSpv+NUlQ5K9RM96vRZ9v9i2jKjaWA/7FvMpI3auOJgrJVoSbPYNx6/QIN1b9imukCMSga9OzF66LhfzACWxJx+DzgAX+7GcfhTF8PbhytPPg9LhlfcGq2gA/TcG6zUorFz5Qy+k//g4rxIvjcPnGfcRgoT+Xgi7I8wnm3O5icIZ6k6+B+wwN3zRTBSmXwbwsgdncGA1RUhe2tAQKBgQDweYu2ij8Io/g7KCvCtVpGHqhzKxgaOZXy0nvPFXY5KFcrrapACriztCaxjvRTXm7t25KJQazICs50OvyTZL5+U3GHp/8GK7KwzZKz5NkHHMtKoKwQADBNau/nHdro4E+PnvL9ucaFX69JF4DZqiw2aDkQkDB/BablHyvuTagJgQKBgQCk++uzero6bXOxFMadLLyWTvlOJP71U1fVSf4Nou+L4ce7k2bMpSDyEDNDOUW3WOO7zz9i8mFGCTUaoX3mhC+B9UQqKZXK2rjFgZtkNDumoCTzvjuPIWTMNN6ABetiLxbq/UD0O1xwThVQNmYwTOzwMHUMkT21ynD23KXE0JL89wKBgGg1Q8YmwooMBFYeYlhOHoCkaHsAAcHbko9Xhy+GLWU3hg73gv+dpcy6FMp9GIPIOGn67NVuEGHfzPexWCLHVYWIw3n14x3ZceYML7alRSc/4xjD58xHSKdD4BJXbbXc/p1OVB5/kvfZLyyNctjgVah+Ibx7v4hL+rbveyoZnOgBAoGAG34je+giqmPc2JB2vHBdCMsmPkBqACWgSFmpLUqOkofQSdC5W7bUs6HBeR1NIc19Pam+jVWIoiwcnlB083nplMVzU3dUj9Y83iTH6T3PBug+4CM+N47ABkt1HG5gGB9yuTv0m/5cXBaW9KPsCXZ4MVpR1wNI/kc65dhFA3QiWmcCgYEA6CfUjOWe201IC332e142WfPGp7hy8p6RHrPtlXS5YnuxVsJVusyuncVdG10kPkvPHakFokqNNUW76Trf++IPnNooMP9ucYj060hYTM7JK9F0mAdx0Mo/+nDC7voXw8rBSsLZHAWfxMh/KjQ5D7L6E2S71wP6ep25hoOuuuLTnrI="; + //应用公钥 + public static final String LS_ALI_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmvqCFRgQCqflYxyHhPyBVBVon51FkGAT8H31hAufhCiW6hAv8HFUn2Tyl6TwAd09HOlessQjjMYLlGRHXkTOVvd1n9I5La7YrrN+F6O/b4Jy17I9k7QDdZLvUKeXm1VcPlj3aSJdZzhTcAqImkj5sFzrFSE+THHMVL5hlAzVIPHWFaA/Vh2Ltdzt9HOL5vo2Bgru5b4kanI5xBaKCfzkaHC6iWxxWk81jBoogGJ1FEky9QSOb4QzSQ4ZtwecFGe/4+PRFkGGW1dH15Qq2UXq3zy6wIF2EfeT/utivV4fHnc04U6z15i1z/f406s9tdfIo10qBfBIH4VQ9jSwkg4ndwIDAQAB"; + //支付宝公钥 + public static final String LS_ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiVLUVTnNuq+2C1FRtcIRcG3rCgtVVulkz2QljKbPr7NNWTJJIIfGwyhNuH76s5D1lvNmn2NkuoqM0cMJCSd+W+JW9KpdQ0dgumFHCoRA/OWUoqpLvEOmm2hRMaWpvd+OQq2aPz+p+z6pqZ9SAlgUIolzrUn4idCvgIycqRaGsf1sEJFR5W+rneqtMhNYHdwemqaqnysInwshHR3cHs1AC6y/eL6pcQhaYJ5qVMIRg54/6Lr4CU114Rmph7UM9C28ulmHkFMN/DKPUDbM1+glxjzmqHQChY293Db0dlwZeiDWF3Tli2BVd6pz5KEkQlUsGeLW1O0rT9T9sxzsavxArwIDAQAB"; - public static final String HS_ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiVLUVTnNuq+2C1FRtcIRcG3rCgtVVulkz2QljKbPr7NNWTJJIIfGwyhNuH76s5D1lvNmn2NkuoqM0cMJCSd+W+JW9KpdQ0dgumFHCoRA/OWUoqpLvEOmm2hRMaWpvd+OQq2aPz+p+z6pqZ9SAlgUIolzrUn4idCvgIycqRaGsf1sEJFR5W+rneqtMhNYHdwemqaqnysInwshHR3cHs1AC6y/eL6pcQhaYJ5qVMIRg54/6Lr4CU114Rmph7UM9C28ulmHkFMN/DKPUDbM1+glxjzmqHQChY293Db0dlwZeiDWF3Tli2BVd6pz5KEkQlUsGeLW1O0rT9T9sxzsavxArwIDAQAB"; /** * 回调地址 因为是内网开发 目前为内网穿透地址 */ -// public static final String NOTIFY_URL = "http://59.110.212.44:9100/pb/pay/aliPay/notify"; - public static final String NOTIFY_URL = "https://api.nuttyreading.com/pay/aliPay/notify"; + public static final String NOTIFY_URL = "http://z6f8f828.natappfree.cc/pb/pay/aliPay/notify"; +// public static final String NOTIFY_URL = "https://api.nuttyreading.com/pay/aliPay/notify"; /** @@ -64,19 +65,18 @@ public class AliPayConfig { */ public static final String GATEWAYURL = "https://openapi.alipay.com/gateway.do"; - private static AlipayClient alipayClient = null; - - public static AlipayClient getAliPayClient() throws AlipayApiException { - //实例化客户端 - if (alipayClient == null) { - synchronized (AliPayUtil.class) { - if (null == alipayClient) { - alipayClient = new DefaultAlipayClient(GATEWAYURL, HS_APP_ID, HS_MERCHANT_PRIVATE_KEY, - FORMAT, CHARSET, HS_ALIPAY_PUBLIC_KEY, SIGN_TYPE); - } - } + public static AlipayClient getAliPayClient(String mchName) throws AlipayApiException { + if ("LS".equals(mchName)) { + return new DefaultAlipayClient(GATEWAYURL, LS_APP_ID, LS_MERCHANT_PRIVATE_KEY, + FORMAT, CHARSET, LS_ALIPAY_PUBLIC_KEY, SIGN_TYPE); + }else { + return new DefaultAlipayClient(GATEWAYURL, HS_APP_ID, HS_MERCHANT_PRIVATE_KEY, + FORMAT, CHARSET, HS_ALIPAY_PUBLIC_KEY, SIGN_TYPE); } - return alipayClient; } + + + + } diff --git a/src/main/java/com/peanut/modules/pay/alipay/config/AliPayUtil.java b/src/main/java/com/peanut/modules/pay/alipay/config/AliPayUtil.java index 1f216c4f..6b972045 100644 --- a/src/main/java/com/peanut/modules/pay/alipay/config/AliPayUtil.java +++ b/src/main/java/com/peanut/modules/pay/alipay/config/AliPayUtil.java @@ -51,7 +51,7 @@ public class AliPayUtil { request.setNotifyUrl(AliPayConfig.NOTIFY_URL); try { //这里和普通的接口调用不同,使用的是sdkExecute - AlipayTradeAppPayResponse responseStr = AliPayConfig.getAliPayClient().sdkExecute(request); + AlipayTradeAppPayResponse responseStr = AliPayConfig.getAliPayClient(aliPayDto.getMchName()).sdkExecute(request); //可以直接给客户端请求,无需再做处理。 map.put("msg", responseStr.getBody()); } catch (AlipayApiException e) { @@ -69,7 +69,7 @@ public class AliPayUtil { */ public AlipayTradeWapPayResponse aliPayH5(AlipayDTO h5PayDto) { try { - AlipayClient alipayClient = AliPayConfig.getAliPayClient(); + AlipayClient alipayClient = AliPayConfig.getAliPayClient(h5PayDto.getMchName()); AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest(); request.setNotifyUrl(AliPayConfig.NOTIFY_URL); request.setBizContent(getAliPayRequest(h5PayDto).toString()); @@ -108,7 +108,7 @@ public class AliPayUtil { AlipayTradeRefundResponse response = null; try { - response = AliPayConfig.getAliPayClient().execute(request); + response = AliPayConfig.getAliPayClient(reFundDTO.getMchName()).execute(request); map.put("msg", response.getBody()); } catch (Exception e) { log.info(">>>>>>>>>>退款出现异常 exception = {}", e); @@ -121,7 +121,7 @@ public class AliPayUtil { * 功能描述 查询订单 * @param outTradeNo */ - public AlipayTradeQueryResponse getAliPayOrder(String outTradeNo) { + public AlipayTradeQueryResponse getAliPayOrder(String outTradeNo,String mchName) { log.info(">>>>>>>>>查询支付宝订单 订单号 = {}", outTradeNo); Map map = new HashMap(); AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); @@ -130,7 +130,7 @@ public class AliPayUtil { request.setBizModel(model); AlipayTradeQueryResponse response = null; try { - response = AliPayConfig.getAliPayClient().execute(request); + response = AliPayConfig.getAliPayClient(mchName).execute(request); return response; } catch (Exception e) { log.info(">>>>>>>>>>查询订单出现异常 exception = {}", e); diff --git a/src/main/java/com/peanut/modules/pay/alipay/dto/AlipayDTO.java b/src/main/java/com/peanut/modules/pay/alipay/dto/AlipayDTO.java index ede6c74d..6ed8d55d 100644 --- a/src/main/java/com/peanut/modules/pay/alipay/dto/AlipayDTO.java +++ b/src/main/java/com/peanut/modules/pay/alipay/dto/AlipayDTO.java @@ -54,4 +54,6 @@ public class AlipayDTO { private String customerId; private String relevanceoid; + + private String mchName;//商户名 ""为默认商户号,"ls"为灵枢商户 } \ No newline at end of file diff --git a/src/main/java/com/peanut/modules/pay/alipay/dto/ReFundDTO.java b/src/main/java/com/peanut/modules/pay/alipay/dto/ReFundDTO.java index 40c716ed..8e1d7833 100644 --- a/src/main/java/com/peanut/modules/pay/alipay/dto/ReFundDTO.java +++ b/src/main/java/com/peanut/modules/pay/alipay/dto/ReFundDTO.java @@ -40,4 +40,6 @@ public class ReFundDTO { */ private String outRequestNo; + private String mchName;//商户名 ""为默认商户号,"ls"为灵枢商户 + } diff --git a/src/main/java/com/peanut/modules/pay/alipay/service/impl/AliPayServiceImpl.java b/src/main/java/com/peanut/modules/pay/alipay/service/impl/AliPayServiceImpl.java index 1db37d0e..52b3f3f7 100644 --- a/src/main/java/com/peanut/modules/pay/alipay/service/impl/AliPayServiceImpl.java +++ b/src/main/java/com/peanut/modules/pay/alipay/service/impl/AliPayServiceImpl.java @@ -87,6 +87,15 @@ public class AliPayServiceImpl implements AliPayService { @Override public String pay(AlipayDTO payDto) { Integer type = payDto.getType(); + //培训班订单用灵枢商户收款 + BuyOrder buyOrder = buyOrderService.getOne(new LambdaQueryWrapper() + .eq(BuyOrder::getOrderSn,payDto.getRelevanceoid())); + String mchName = ""; + if (buyOrder != null && "trainingClass".equals(buyOrder.getOrderType())) { + mchName = "LS"; + } + payDto.setMchName(mchName); + String orderInfo = ""; if (type == 1) { // 走H5请求支付宝支付接口 @@ -98,7 +107,8 @@ public class AliPayServiceImpl implements AliPayService { if (type == 2) { // 走APP请求支付宝支付接口 log.info(">>>>>>>>>>App请求支付宝支付接口"); - payDto.setOutTradeNo(OrderUtils.getOrderCode(Integer.valueOf(payDto.getCustomerId()))); +// payDto.setOutTradeNo(OrderUtils.getOrderCode(Integer.valueOf(payDto.getCustomerId()))); + payDto.setOutTradeNo(payDto.getRelevanceoid()); Map map = aliPayUtil.aliPayOrder(payDto); Object obj = map.get("msg"); String resJson = obj.toString(); @@ -136,7 +146,13 @@ public class AliPayServiceImpl implements AliPayService { log.info(">>>>>>>>>>支付宝回调 sign = {}, trade_status = {}, out_trade_no = {}, 参数 = {}", params.get("sign"), params.get("trade_status"), params.get("out_trade_no"), params.toString()); //调用SDK验证签名,验证是阿里回调,而不是其他恶意回调 - boolean flag = AlipaySignature.rsaCheckV1(params, AliPayConfig.HS_ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE); + BuyOrder buyOrder = buyOrderService.getOne(new LambdaQueryWrapper() + .eq(BuyOrder::getOrderSn,params.get("out_trade_no"))); + String alipayPublicKey = AliPayConfig.HS_ALIPAY_PUBLIC_KEY; + if (buyOrder != null && "trainingClass".equals(buyOrder.getOrderType())) { + alipayPublicKey = AliPayConfig.LS_ALIPAY_PUBLIC_KEY; + } + boolean flag = AlipaySignature.rsaCheckV1(params, alipayPublicKey, AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE); // log.error(">>>>>>>>>>验签结果 flag = {}", flag); if (flag) { log.info(">>>>>>>>>>验签通过"); @@ -380,6 +396,13 @@ public class AliPayServiceImpl implements AliPayService { reFundDTO.setRefundAmount(new BigDecimal(params.get("refundFee").toString())); // reFundDTO.setOutRequestNo(params.get("outRequestNo").toString()); reFundDTO.setOutRequestNo(UUID.randomUUID().toString()); + BuyOrder buyOrder = buyOrderService.getOne(new LambdaQueryWrapper() + .eq(BuyOrder::getOrderSn,params.get("orderSn"))); + String mchName = ""; + if (buyOrder != null && "trainingClass".equals(buyOrder.getOrderType())) { + mchName = "LS"; + } + reFundDTO.setMchName(mchName); Map map = aliPayUtil.aliPayRefund(reFundDTO); Object obj = map.get("msg"); String resJson = obj.toString(); diff --git a/src/main/java/com/peanut/modules/pay/weChatPay/config/WechatPayConfig.java b/src/main/java/com/peanut/modules/pay/weChatPay/config/WechatPayConfig.java index deeb3405..ff4eb2af 100644 --- a/src/main/java/com/peanut/modules/pay/weChatPay/config/WechatPayConfig.java +++ b/src/main/java/com/peanut/modules/pay/weChatPay/config/WechatPayConfig.java @@ -51,76 +51,60 @@ public class WechatPayConfig implements Serializable { private String xlkjappId; @Value("${wxpay.thyyappId}") private String thyyappId; - /** - * 商户号 - */ + @Value("${wxpay.mchId}") - private String mchId; + private String mchId;//商户号 + @Value("${wxpay.serialNo}") + private String serialNo;//api证书序列号 + @Value("${wxpay.apiV3Key}") + private String apiV3Key;//与灵枢相同 + @Value("${wxpay.keyPemPath}") + private String keyPemPath; + @Value("${wxpay.privateKeyUrl}") + private String privateKeyUrl; + @Value("${wxpay.wechatPayCertificateUrl}") + private String wechatPayCertificateUrl;//平台证书,写命令获取 + @Value("${wxpay.notifyUrl}") + private String notifyUrl;//付款回调 + @Value("${wxpay.refundNotifyUrl}") + private String refundNotifyUrl;//退款回调 + + //灵枢 @Value("${wxpay.lsMchId}") private String lsMchId; + @Value("${wxpay.lsSerialNo}") + private String lsSerialNo; + @Value("${wxpay.lsApiV3Key}") + private String lsApiV3Key;//与众妙相同 + @Value("${wxpay.lsKeyPemPath}") + private String lsKeyPemPath; + @Value("${wxpay.lsPrivateKeyUrl}") + private String lsPrivateKeyUrl; + @Value("${wxpay.lsWechatPayCertificateUrl}") + private String lsWechatPayCertificateUrl; + @Value("${wxpay.lsNotifyUrl}") + private String lsNotifyUrl; + @Value("${wxpay.lsRefundNotifyUrl}") + private String lsRefundNotifyUrl; + /** * pay url */ @Value("${wxpay.payUrl}") private String payUrl; /** - * pay url + * 退款 url */ @Value("${wxpay.refundUrl}") private String refundUrl; - /** - * 回调地址 - */ - @Value("${wxpay.notifyUrl}") - private String notifyUrl; - /** - * key - */ - @Value("${wxpay.apiV3Key}") - private String apiV3Key; - /** - * 退款回调地址 - */ - @Value("${wxpay.refundNotifyUrl}") - private String refundNotifyUrl; - /** - * API 证书中的 key.pem 商户私钥 - */ - @Value("${wxpay.keyPemPath}") - private String keyPemPath; - /** - * 商户序列号 - */ - @Value("${wxpay.serialNo}") - private String serialNo; - @Value("${wxpay.wechatPayCertificateUrl}") - private String wechatPayCertificateUrl; - @Value("${wxpay.privateKeyUrl}") - private String privateKeyUrl; @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } - /** - * 获取私钥 - * - * @param keyPemPath - * @return - */ - public PrivateKey getPrivateKey(String keyPemPath) { - try { - return PemUtil.loadPrivateKey(ResourceUtils.getURL(keyPemPath).openStream()); - } catch (FileNotFoundException e) { - throw new RuntimeException("私钥文件不存在", e); - } catch (IOException e) { - throw new RuntimeException("私钥文件流失败", e); - } - } - /** * 获取证书管理器实例 签名验证器 @@ -141,47 +125,38 @@ public class WechatPayConfig implements Serializable { certificatesManager.putMerchant(mchId, wechatPay2Credentials, apiV3Key.getBytes(StandardCharsets.UTF_8)); return certificatesManager.getVerifier(mchId); } - + @Bean + public Verifier getLSVerifier() throws GeneralSecurityException, IOException, HttpCodeException, NotFoundException { + log.info("获取证书管理器实例"); + //获取商户私钥 + PrivateKey privateKey = getPrivateKey(lsKeyPemPath); + //私钥签名对象 + PrivateKeySigner privateKeySigner = new PrivateKeySigner(lsSerialNo, privateKey); + //身份认证对象 + WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(lsMchId, privateKeySigner); + // 使用定时更新的签名验证器,不需要传入证书 + CertificatesManager certificatesManager = CertificatesManager.getInstance(); + certificatesManager.putMerchant(lsMchId, wechatPay2Credentials, lsApiV3Key.getBytes(StandardCharsets.UTF_8)); + return certificatesManager.getVerifier(lsMchId); + } /** - * 获取支付http请求对象 + * 获取私钥 * - * @param verifier + * @param keyPemPath * @return */ - @Bean(name = "wxPayClient") - public CloseableHttpClient getWxPayClient(Verifier verifier) { - log.info("获取HttpClient"); - - //获取商户私钥 - PrivateKey privateKey = getPrivateKey(keyPemPath); - WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create() - .withMerchant(mchId, serialNo, privateKey) - .withValidator(new WechatPay2Validator(verifier)); - CloseableHttpClient httpClient = builder.build(); - // 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新 - return httpClient; + public PrivateKey getPrivateKey(String keyPemPath) { + try { + return PemUtil.loadPrivateKey(ResourceUtils.getURL(keyPemPath).openStream()); + } catch (FileNotFoundException e) { + throw new RuntimeException("私钥文件不存在", e); + } catch (IOException e) { + throw new RuntimeException("私钥文件流失败", e); + } } - /** - * 获取HttpClient,无需进行应答签名验证,跳过验签的流程 - */ - public CloseableHttpClient getWxPayNoSignClient() { - - PrivateKey privateKey = getPrivateKey(keyPemPath); - - - //用于构造HttpClient - WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create() - //设置商户信息 - .withMerchant(mchId, serialNo, privateKey) - //无需进行签名验证、通过withValidator((response) -> true)实现 - .withValidator((response) -> true); - - // 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新 - return builder.build(); - } } diff --git a/src/main/java/com/peanut/modules/pay/weChatPay/controller/WeChatPayController.java b/src/main/java/com/peanut/modules/pay/weChatPay/controller/WeChatPayController.java index 67795dcd..fbc35564 100644 --- a/src/main/java/com/peanut/modules/pay/weChatPay/controller/WeChatPayController.java +++ b/src/main/java/com/peanut/modules/pay/weChatPay/controller/WeChatPayController.java @@ -80,7 +80,7 @@ public class WeChatPayController { map.put("noncestr", nonceStr); map.put("package", "Sign=WXPay"); paramMap.put("mchid", wechatPayConfig.getMchId()); - if ("trainingClass".equals(paymentInfo.getOrderType())){ + if ("trainingClass".equals(order.getOrderType())){ paramMap.put("mchid", wechatPayConfig.getLsMchId()); } QueryWrapper wechatOrderQueryWrapper = new QueryWrapper<>(); @@ -90,7 +90,12 @@ public class WeChatPayController { map.put("prepayid", prepayId); long timestamp = System.currentTimeMillis() / 1000; map.put("timestamp", timestamp); - String sign = wxPayUtil.getSign(appid, timestamp, nonceStr, prepayId); + String sign = ""; + if ("trainingClass".equals(order.getOrderType())){ + sign = wxPayUtil.getSign(appid, timestamp, nonceStr, prepayId, "LS"); + }else { + sign = wxPayUtil.getSign(appid, timestamp, nonceStr, prepayId, ""); + } map.put("sign", sign); Map result = new HashMap<>(); result.put("paramMap", paramMap); @@ -110,6 +115,11 @@ public class WeChatPayController { public void payNotify(HttpServletRequest request, HttpServletResponse response) throws Exception { wxpayService.payNotify(request); } + @PostMapping("/lsPayNotify") + @Transactional + public void lsPayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception { + wxpayService.lsPayNotify(request); + } /** * 微信退款申请 @@ -127,6 +137,10 @@ public class WeChatPayController { public void refundNotify(HttpServletRequest request){ wxpayService.refundNotify(request); } + @PostMapping("/lsRefundNotify") + public void lsRefundNotify(HttpServletRequest request){ + wxpayService.lsRefundNotify(request); + } diff --git a/src/main/java/com/peanut/modules/pay/weChatPay/service/WxpayService.java b/src/main/java/com/peanut/modules/pay/weChatPay/service/WxpayService.java index 662d2305..6abdc4c1 100644 --- a/src/main/java/com/peanut/modules/pay/weChatPay/service/WxpayService.java +++ b/src/main/java/com/peanut/modules/pay/weChatPay/service/WxpayService.java @@ -15,8 +15,12 @@ public interface WxpayService extends IService { void payNotify(HttpServletRequest request) throws Exception; + void lsPayNotify(HttpServletRequest request) throws Exception; + String refund(Map map); void refundNotify(HttpServletRequest request); + void lsRefundNotify(HttpServletRequest request); + } diff --git a/src/main/java/com/peanut/modules/pay/weChatPay/service/impl/WxpayServiceImpl.java b/src/main/java/com/peanut/modules/pay/weChatPay/service/impl/WxpayServiceImpl.java index 09344f66..c023d251 100644 --- a/src/main/java/com/peanut/modules/pay/weChatPay/service/impl/WxpayServiceImpl.java +++ b/src/main/java/com/peanut/modules/pay/weChatPay/service/impl/WxpayServiceImpl.java @@ -109,15 +109,16 @@ public class WxpayServiceImpl extends ServiceImpl bodyMap = getNotifyBody(request); + Map bodyMap = getNotifyBody(request,""); // 解密resource中的通知数据 String resource = bodyMap.get("resource").toString(); Map resourceMap = WechatPayValidator.decryptFromResource(resource, wechatPayConfig.getApiV3Key(), 1); @@ -342,6 +348,45 @@ public class WxpayServiceImpl extends ServiceImpl bodyMap = getNotifyBody(request,"LS"); + // 解密resource中的通知数据 + String resource = bodyMap.get("resource").toString(); + Map resourceMap = WechatPayValidator.decryptFromResource(resource, wechatPayConfig.getApiV3Key(), 1); + String orderNo = resourceMap.get("out_trade_no").toString(); + //修改微信订单表 + MPJLambdaWrapper wrapper = new MPJLambdaWrapper(); + wrapper.eq(PayWechatOrderEntity::getOrderSn,orderNo); + PayWechatOrderEntity payWechatOrderEntity = payWechatOrderService.getOne(wrapper); + payWechatOrderEntity.setOrderId(resourceMap.get("transaction_id").toString()); + payWechatOrderService.updateById(payWechatOrderEntity); + // 根据订单号,做幂等处理,并且在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱 + BuyOrder order = this.buyOrderService.getOne(new QueryWrapper().eq("order_sn", orderNo)); + if ("3".equals(order.getOrderStatus())){ + return; + } + //使用优惠券 + if (order.getCouponId()!=null&&order.getCouponId()!=0){ + CouponHistory couponHistory = couponHistoryService.getById(order.getCouponId()); + couponHistory.setOrderId(order.getOrderId()); + couponService.useCouponAmount(couponHistory); + } + //处理抵扣积分 + if(order.getJfDeduction().compareTo(BigDecimal.ZERO)>0){ + userCoinJf(order); + } + if("trainingClass".equals(order.getOrderType())){ + //更新 订单 记录 + buyOrderService.updateOrderStatus(order.getUserId(),orderNo,"2"); + //插入培训班 + trainingClassService.addTrainingClassForUser(order); + } + } + @Override public String refund(Map map){ LambdaQueryWrapper wrapper = new LambdaQueryWrapper(); @@ -372,7 +417,14 @@ public class WxpayServiceImpl extends ServiceImpl>>>>>>>>>App请求微信退款申请接口"); - JSONObject responseJson = wxPayUtil.doPostWexinV3(wechatPayConfig.getRefundUrl(), json.toJSONString()); + //培训班订单用灵枢商户收款 + BuyOrder buyOrder = buyOrderService.getOne(new LambdaQueryWrapper() + .eq(BuyOrder::getOrderSn,map.get("orderSn").toString())); + String mchName = ""; + if (buyOrder != null && "trainingClass".equals(buyOrder.getOrderType())) { + mchName = "LS"; + } + JSONObject responseJson = wxPayUtil.doPostWexinV3(wechatPayConfig.getRefundUrl(), json.toJSONString(),mchName); log.info(">>>>>>>>>>>微信退款返回的信息是 resJson = {}", responseJson.toJSONString()); if ("SUCCESS".equals(responseJson.get("status"))){ //退款申请成功,等待到账 @@ -399,7 +451,34 @@ public class WxpayServiceImpl extends ServiceImpl bodyMap = getNotifyBody(request); + Map bodyMap = getNotifyBody(request,""); + // 解密resource中的通知数据 + String resource = bodyMap.get("resource").toString(); + Map resourceMap = WechatPayValidator.decryptFromResource(resource, wechatPayConfig.getApiV3Key(), 2); + log.info("微信退款回调结果 msg={}",resourceMap); + if ("SUCCESS".equals(resourceMap.get("refund_status").toString())){ + log.info(">>>>>>>>>>>微信退款成功!<<<<<<<<<<<<<"); + MPJLambdaWrapper w = new MPJLambdaWrapper(); + w.selectAll(BuyOrder.class); + w.leftJoin(PayWechatOrderEntity.class,PayWechatOrderEntity::getOrderSn, BuyOrder::getOrderSn); + w.eq("t1.order_id",resourceMap.get("transaction_id").toString()); + BuyOrder order = buyOrderService.getOne(w); + PayRefundOrder refund = new PayRefundOrder(); + refund.setPayType("1"); + refund.setOrderId(order.getOrderId()); + refund.setTradeNo(resourceMap.get("transaction_id").toString()); + refund.setOutTradeNo(resourceMap.get("out_trade_no").toString()); + refund.setRefundFee(((Map)resourceMap.get("amount")).get("refund").toString()); + refundOrderService.save(refund); + refundOrderService.businessOpt(order); + } + } + @Override + @Transactional + public void lsRefundNotify(HttpServletRequest request){ + log.info("微信退款回调"); + // 处理通知参数 + Map bodyMap = getNotifyBody(request,"LS"); // 解密resource中的通知数据 String resource = bodyMap.get("resource").toString(); Map resourceMap = WechatPayValidator.decryptFromResource(resource, wechatPayConfig.getApiV3Key(), 2); @@ -423,7 +502,7 @@ public class WxpayServiceImpl extends ServiceImpl getNotifyBody(HttpServletRequest request) { + private Map getNotifyBody(HttpServletRequest request,String mchName) { // 处理通知参数 String body = HttpUtils.readData(request); log.info("支付回调参数:{}", body); @@ -434,7 +513,12 @@ public class WxpayServiceImpl extends ServiceImpl_1rJ>V0U1>A&;}+JdBR_WJ$4{7un-R| z1LL7ZrDRfL(K|Ng)RWK!V(LoheqWJ>A&WCnpC zfEYY@f*^S~bhqezRq;$fP0;7yjC4pQfi@^U2Y+0uzfO0tXDXkWidEww4q5H>UMqe* z4rd>0DYcRDwX49eV4cNARJnC%TDN&sb5RKKR4;h&h^7-U6KY}*98{gJx*a=j%1t*d zT9=mue)Rc9Ap{XfeXx(Sc)dYu8|pBczzsc6uLx9+^ow>q%ny~YEf4dv`L(&5%Zig+ zdgg-5tsuFnYm=?_I9Gq*9hT{ zz@b)usu}HeKu|W{)7)sA) zcKMi)-y^#lfcUlL4+!~124cVNKB-C$^&o8S4aj%hKk_X(wjf-tx%6Jc#bCNw)98(a z^5m!PI|~P+L^nS-1oho!f@Z;XGixogHvTb4+VnvH;zD+N zre`li@COE+GY!Y)Z2&=*A57kv3%zXDRG=_CcTp%Y9g2Gxe3Rn=ML$Mp$M1PfD8ozB zCZVpm+z%*E{f+INnzXIQwjnjg22yw1eV5O7@@yqg3cTG$l!uNOA1xxi7x*nY1|q4_ zmUk~Bz&6fn{bJG?&R_;Pc=hPlmJvkJSuQ=RL@1cUsv(POj-) zxXG-RWr$G!PqvhI$%UO`ijevEDnty7=*QumG>f|6C_;N4~3 zkOxld35JA)+YT&PtV&`uQu$d8>GBWlU07D{_ZzXr5+E?h3f_wN*l@tXK5L;~_e``k z+@y1C%9x7|sFMu|Vqb^LU$ntinvWN0G;xoUYLycss}u9MtcqsBTcsy?*RtIPce(Pr zRtrIV60M5nE8-h;UhB)U7fe;YSi19bJMsUrB^VFxtB%oq zZk@LDDpnk2TxfQ56R$UwL7j`9Ut3^0?`mq;e`4bV^w~(Y$V`DFF}z@!Q;v2EOU0@) zv4g0A#Ni%oeB{6=r78`cv*gLP&1CC8f)itK%l$%EmjP&*5qkocf zgcPQRFnq(sQEHv11w z##YfvBs*GDY``pv%$pN$Su$(H5CvV>Nmf_5a=Fe~%Z|Oik8fJxEvZ=Q61TE@$stiNqp1`{HV5OHo9WFf?bw5T^+Ywp2>&{0&blmey!=^mAqQtWeAu1+ z#`+gj$eQf*fRqzjt}+~Ywm`JL3=?-&FQ@{*Jm_vSJwKxrkT@8UIl>uo(hge~TGcBv zxU^KYdDFfMB=Zo}s6FFWBjH;hwchknJapEVwlY59OQ21hb6I+X+SXCL;uX@WgGY^K zEH=y*OM@3H)y(56mIRn!OUZgd6Spu8VWUjK1snzo`2H*lN=j$-&v6M1T4ee+ly3*1X7OGTX1_a_K(BBSBtU58C)fa7mv z=CF}^e4NS1ZueOntojaD3pqyW6}V4k>>=T!{EscyAiu)H3X~#ma?Xc$2>SuaQYu=0~;6U!+zCw z=9yXZ*;-_l^NWv#CyW;#P2WI&TN8fqi@ytqZY~Q!tncto zeN4(zf+yV0LCAR$bw6FPHFdU>`Zg9P}!P^x+pQP8Fb_~mCBY^ctL$F6jklL@2jukjf zau1hxlT@96PmYB?*Dg{Ssr$7F+j9KNNhUKyN8fSF-dR!6BpIL*sDI z!faG!By;G=`hK#`T7;4xNLd7}X{o#~w$Gig!u4zCRYB8r4H0d(*2mRL6;Y|KgO(=9 zt;wLKi^6X=RY-xMMiy8M`HC*Fj?5|qs`Y|+6p_Ud9g2>65?aZBn!jhwnvy-iBv{)Y zx#s~w{v=^?1B}yqX>nA^7oPR|axN0eAK+<91%{y_e|?Crc^g$rALES7`qQYF{!sV7bGF~`|UC1CZ0)Dxmi{pT8wQM7AE4zgdh08uj; z)A>YA*`thi*Jrz#zr1l}6Ps{Uy`ducUpum#QRN5oxh$v*oSya0g!8~_7|0EhvuoNl)Op#VRC_h~#%X(+%;MNvgug@uXn0tW*~ nkP!gp+pM}GNk=w+!+zEqEzbL6cVyVZ28LLl#9=})Y`y;k2^Jx= literal 0 HcmV?d00001 diff --git a/src/main/resources/cent/lscent/apiclient_cert.pem b/src/main/resources/cent/lscent/apiclient_cert.pem new file mode 100644 index 00000000..e0697500 --- /dev/null +++ b/src/main/resources/cent/lscent/apiclient_cert.pem @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIERjCCAy6gAwIBAgIUMTLSPDEwt0uHiQ3G58gCVsdRE7kwDQYJKoZIhvcNAQEL +BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT +FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg +Q0EwHhcNMjUxMDIwMDUxNzQ5WhcNMzAxMDE5MDUxNzQ5WjCBnzETMBEGA1UEAwwK +MTcwMDM3MTE1ODEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMUswSQYDVQQL +DELlpKnmtKXluILljZflvIDljLrngbXmnqLmlZnogrLnp5HmioDlt6XkvZzlrqTv +vIjkuKrkvZPlt6XllYbmiLfvvIkxCzAJBgNVBAYTAkNOMREwDwYDVQQHDAhTaGVu +WmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKcXnuZX5EIL0kPD +Uw+nUqLEJh4bjYtKcYs1XbSV4+Ej3fSb0qzo+Zo4GK7NGhx13Vkqzvx0xITMS8T1 +RhLOIrwib3v7+U+2LwQDAyFwMkmyfGSOGDJRPia4Buv/i+oKwk7+61wFdulrOz7F +Co5KkPIK3H/Iqe5zgrnlcv8TW1ytJBNLJPTsIrPdbtz8bM9ovzemn8VXf9tOkII6 +tx4tqpmm+MoSMO9xhK8UdhAPf/xuqR2K8NKdd7JL6XtT6FXfUGznct8VA/9sxUql +fC/v0zDaAzuU2O8R28PSw2Kznc84M59CfGkLF2D8PNaFf5sX0k9dWTJfcdgephaA +XspbNLUCAwEAAaOBuTCBtjAJBgNVHRMEAjAAMAsGA1UdDwQEAwID+DCBmwYDVR0f +BIGTMIGQMIGNoIGKoIGHhoGEaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1Ymxp +Yy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMwMUMz +RThFQkQyJnNnPUhBQ0M0NzFCNjU0MjJFMTJCMjdBOUQzM0E4N0FEMUNERjU5MjZF +MTQwMzcxMA0GCSqGSIb3DQEBCwUAA4IBAQAvSYQqMWSbk183gT+uDYhYs+VdzzVn +JOR8hUahHeZAgzvexdScQiUJcUVivRWeEKetN7bPNZ8NX91mmAw0XTR9qLMCphVv +9/6gdi8+tZZF7khJUL9I3wqhOhbOgn/h1wIhQAA/0Pl1RJyhrpNRQbmalDdX82T9 +G5JlAKbNNAs/HdMpXY/LvngoF10hjfAvc/WdEYW5OAJgA5Y7LsymKuB01yBe/ptw +8y+hLcV1gk/7IcPpEKGJAkm5tZHSiNwt0NQDu+ik/0E524I1LYuKbJJ/0xj8EH6J +ZLqqS0TztH5B+xZA3rEJTjhLe9Sy9Bp3ILAeApHRh34B4j5bfvYsu2+7 +-----END CERTIFICATE----- diff --git a/src/main/resources/cent/lscent/apiclient_key.pem b/src/main/resources/cent/lscent/apiclient_key.pem new file mode 100644 index 00000000..cb7b9f2a --- /dev/null +++ b/src/main/resources/cent/lscent/apiclient_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCnF57mV+RCC9JD +w1MPp1KixCYeG42LSnGLNV20lePhI930m9Ks6PmaOBiuzRocdd1ZKs78dMSEzEvE +9UYSziK8Im97+/lPti8EAwMhcDJJsnxkjhgyUT4muAbr/4vqCsJO/utcBXbpazs+ +xQqOSpDyCtx/yKnuc4K55XL/E1tcrSQTSyT07CKz3W7c/GzPaL83pp/FV3/bTpCC +OrceLaqZpvjKEjDvcYSvFHYQD3/8bqkdivDSnXeyS+l7U+hV31Bs53LfFQP/bMVK +pXwv79Mw2gM7lNjvEdvD0sNis53PODOfQnxpCxdg/DzWhX+bF9JPXVkyX3HYHqYW +gF7KWzS1AgMBAAECggEAIN3hkJd7O46NtmyGOw8DjyacBNIQnnRvLx25J9tP7qoa +b5Hy97X/2tjr6f5IA48fkfl8q2XgfeqdgMlqFirb5Du1yCKBIK/KQbTB+eLS0XI9 +S54znjoiyoTqP6ONhuTE4br82qXshO9lwOwLLn/2UNXYF36GBnRMI3rBivDoyKqo +jl8jLF43UuuducjIs38WnAQKR39XnX9fnOu2NQ7Bt/p46BTNNbClRYtlQ0hKcCVC +uCLA1WKAt6NAzjby53h2VDXTDDSB4uvMA9MtksfTdnQuaXPhWqMmPHvDJTchFbYj +y6DiJcM/4EPfkEASs8wO/iWN7mN9uRLvpALx6o5vQQKBgQDRGz3uAdTbDk8oWUOq +IbahVqgtZyThInZrR+PAFR2QEzONI1LhqCeSeT1BA2cNAWLPd9amQHPrsgpJPEnP +L8EM8GQmyOFK2Ro6er8BvthAE12Od9hQal4VSB6/IB3c6OAna02P96gInhGmttz2 +AJDG0I6Y77PKpXgKPIOAFBnEhQKBgQDMkFrfJMoxrh25AzSH5A20FsI6nRQJAnYP +fxq19m+hA61AbXXdsjYq4jOxjP6aLFyZS/4bbGJXUBHMELvK5ZbzGrmbH818/SQ7 +lTvIqp16U2jwBAN+Hza0/rEk/OUad1k6qEa056NoS2k1qryitS7L50EOi4YtZHu9 +QU0zR9p+cQKBgCc7fTsSjOUsoh1n4hIhkSpkH9mk6H51ANLQAiMf0xQdBicM4ZgE +/Ke2p49zG/qMsAVM7rDyls058kQbU53Tz9ylnaTJO7vXT9x4+y1QqTIccAky4xrz +WgOULHCfjfrMloHO2BaS2KwFPDqTRJHDOWaT6q03C/yRXxxMjj+RheQhAoGBAIrc +01L23mqrD3IwQtCcdtDxQhgX2SnkidArMC6lg1GB9XHu3DwKZcrmksDMPWjbBGDr +vStQf9FVgT9NfK1W/Qk58xTimdNm49mujE7DwvLu/CUyFEzhU3m6CvZY1g0JR4ES +Ci1zsPFzf4/2vuaUp5ey++6ruAHIXFc0pPtSo3eBAoGBAMCVpHmJ1Yl6Jd5Wijq/ +sFHMy0V12LZL5FtiMrxU2Ha9qJf20peyA+u02uLvi7BuVBFYceLfNg14CFVMekmm +UsljhtDYTegakEINI2qfxWKcZnC933sJxAZE21qQ4MXPIj9+mwQ60xaY7m+9qbZ1 +LX6+929u0+9Uok5kFtQv646i +-----END PRIVATE KEY----- diff --git a/src/main/resources/cent/lscent/wechatpay_30CFE19A12EDB4D9E0C7DF01DBF457C657566D04.pem b/src/main/resources/cent/lscent/wechatpay_30CFE19A12EDB4D9E0C7DF01DBF457C657566D04.pem new file mode 100644 index 00000000..44cca22c --- /dev/null +++ b/src/main/resources/cent/lscent/wechatpay_30CFE19A12EDB4D9E0C7DF01DBF457C657566D04.pem @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIIEFDCCAvygAwIBAgIUMM/hmhLttNngx98B2/RXxldWbQQwDQYJKoZIhvcNAQEL +BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT +FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg +Q0EwHhcNMjUxMDIwMDUxNzQ4WhcNMzAxMDE5MDUxNzQ4WjBuMRgwFgYDVQQDDA9U +ZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRl +bnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGEwJDTjERMA8GA1UEBwwIU2hlblpo +ZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD2k129wosXUWJcweqi +FhqWPVmdE9sJxyRfAai9at5oLL+4+0UEaTSCCSlBwd9ILJ5IXEGiClKc9eZgMdi2 +O0aqISye7KkCu2FlSgZVML3OVP82QLf/eRirxoYjrVQ0W33kpHyjeKV25M4VmHCi +7AmMyGVMX/Pf2HTw4TnGeoLUCR/3nAXUO3SsLtqPGC8M5mOC5p73Qot0Zp1SRuKF +d0zSF9G4iPMDqUvAkgtRRp6DivW9e/v/Or8H9oVg+x6oG/SSo4mK9428m45tcDSd +1FzzTvdpS9ApBLKzYlF9cg1dsIXdt9AypBHj0tQRa3CkBIgxP0chU8luT7VBBpv9 +8JB5AgMBAAGjgbkwgbYwCQYDVR0TBAIwADALBgNVHQ8EBAMCA/gwgZsGA1UdHwSB +kzCBkDCBjaCBiqCBh4aBhGh0dHA6Ly9ldmNhLml0cnVzLmNvbS5jbi9wdWJsaWMv +aXRydXNjcmw/Q0E9MUJENDIyMEU1MERCQzA0QjA2QUQzOTc1NDk4NDZDMDFDM0U4 +RUJEMiZzZz1IQUNDNDcxQjY1NDIyRTEyQjI3QTlEMzNBODdBRDFDREY1OTI2RTE0 +MDM3MTANBgkqhkiG9w0BAQsFAAOCAQEARZTIJ36KOviKGttOhZe+w7k0KknQ67PD +DCseZ64L99lE/V6mOOUFAqI7o2lYlXaPedf1eQOf3UI62fom6CqjvSCeC8QNKVeB +5MLZHwKyMesgLiOEFb8JusgWma8yK0Bo7o0z+7bXxpFPSXoh8ayU6Bkk4CYNRD4u +nWZFeE5IiDshPSHDGG08jlJmKcsuTZVOKGwoVKn9zhpBiesKa0Sfwi5TffBJUUBM +XTJfX0P0E36QXjM3UWqrEFd5trBZwQTuhuc8j3eStmamsQVr6X4HIOstIp5cLGVZ +UrpW1faphcDhgUG5dlTRS27JiJjvNyG2DPOJhAtabU5+dDyJ++pujA== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/src/main/resources/cent/lscent/证书使用说明.txt b/src/main/resources/cent/lscent/证书使用说明.txt new file mode 100644 index 00000000..9a0aab11 --- /dev/null +++ b/src/main/resources/cent/lscent/证书使用说明.txt @@ -0,0 +1,18 @@ +欢迎使用微信支付! +附件中的三份文件(证书pkcs12格式、证书pem格式、证书密钥pem格式),为接口中强制要求时需携带的证书文件。 +证书属于敏感信息,请妥善保管不要泄露和被他人复制。 +不同开发语言下的证书格式不同,以下为说明指引: + 证书pkcs12格式(apiclient_cert.p12) + 包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份 + 部分安全性要求较高的API需要使用该证书来确认您的调用身份 + windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户号(如:1900006031) + 证书pem格式(apiclient_cert.pem) + 从apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制 + 部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供 + 您也可以使用openssl命令来自己导出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem + 证书密钥pem格式(apiclient_key.pem) + 从apiclient_cert.p12中导出密钥部分的文件,为pem格式 + 部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供 + 您也可以使用openssl命令来自己导出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem +备注说明: + 由于绝大部分操作系统已内置了微信支付服务器证书的根CA证书, 2018年3月6日后, 不再提供CA证书文件(rootca.pem)下载 \ No newline at end of file