From 0c027252f0ddc03fe2a6fb409c3a28dbc4229bf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Sun, 27 Jul 2025 11:05:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E6=94=B9=EF=BC=9A=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ShopOrderServiceImpl.java | 147 +++++++++++++----- .../dev/wechat/10550/apiclient_cert.p12 | Bin 2798 -> 0 bytes .../dev/wechat/10550/apiclient_cert.pem | 25 --- .../dev/wechat/10550/apiclient_key.pem | 28 ---- .../dev/wechat/10550/wechatpay_cert.pem | 9 -- 5 files changed, 110 insertions(+), 99 deletions(-) delete mode 100644 src/main/resources/dev/wechat/10550/apiclient_cert.p12 delete mode 100644 src/main/resources/dev/wechat/10550/apiclient_cert.pem delete mode 100644 src/main/resources/dev/wechat/10550/apiclient_key.pem delete mode 100644 src/main/resources/dev/wechat/10550/wechatpay_cert.pem diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java index a4c435e..b424390 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java @@ -27,6 +27,7 @@ import com.gxwebsoft.common.core.service.PaymentCacheService; import com.wechat.pay.java.core.Config; import com.wechat.pay.java.core.RSAConfig; import com.wechat.pay.java.core.RSAPublicKeyConfig; + import com.gxwebsoft.common.core.utils.WechatCertAutoConfig; import com.wechat.pay.java.core.exception.ServiceException; import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension; import com.wechat.pay.java.service.payments.jsapi.model.*; @@ -70,6 +71,8 @@ import com.gxwebsoft.common.core.service.PaymentCacheService; private CertificateLoader certificateLoader; @Resource private PaymentCacheService paymentCacheService; + @Resource + private WechatCertAutoConfig wechatCertAutoConfig; @Override public PageResult pageRel(ShopOrderParam param) { @@ -107,12 +110,20 @@ import com.gxwebsoft.common.core.service.PaymentCacheService; @Override public HashMap createWxOrder(ShopOrder order) { - // 后台微信支付配置信息 - final Payment payment = getPayment(order); - // 返回的订单数据 - final HashMap orderInfo = new HashMap<>(); - // 构建service - JsapiServiceExtension service = getWxService(order); + try { + // 后台微信支付配置信息 + final Payment payment = getPayment(order); + System.out.println("=== 开始创建微信支付订单 ==="); + System.out.println("订单号: " + order.getOrderNo()); + System.out.println("租户ID: " + order.getTenantId()); + System.out.println("支付配置: " + (payment != null ? "已获取" : "未获取")); + + // 返回的订单数据 + final HashMap orderInfo = new HashMap<>(); + // 构建service + System.out.println("开始构建微信支付服务..."); + JsapiServiceExtension service = getWxService(order); + System.out.println("微信支付服务构建完成"); // 订单金额 BigDecimal decimal = order.getTotalPrice(); @@ -152,6 +163,13 @@ import com.gxwebsoft.common.core.service.PaymentCacheService; orderInfo.put("paySign", response.getPaySign()); orderInfo.put("orderNo", order.getOrderNo()); return orderInfo; + } catch (Exception e) { + System.err.println("=== 创建微信支付订单失败 ==="); + System.err.println("错误信息: " + e.getMessage()); + System.err.println("错误类型: " + e.getClass().getName()); + e.printStackTrace(); + throw new RuntimeException("创建支付订单失败:" + e.getMessage(), e); + } } @Override @@ -203,7 +221,28 @@ import com.gxwebsoft.common.core.service.PaymentCacheService; * @return */ public Payment getPayment(ShopOrder order) { - return paymentCacheService.getPaymentConfig(order.getPayType(), order.getTenantId()); + Payment payment = paymentCacheService.getPaymentConfig(order.getPayType(), order.getTenantId()); + + // 添加详细的支付配置检查 + System.out.println("=== 支付配置检查 ==="); + System.out.println("订单支付类型: " + order.getPayType()); + System.out.println("租户ID: " + order.getTenantId()); + + if (payment == null) { + throw new RuntimeException("未找到支付配置,支付类型: " + order.getPayType() + ", 租户ID: " + order.getTenantId()); + } + + System.out.println("支付配置ID: " + payment.getId()); + System.out.println("支付方式名称: " + payment.getName()); + System.out.println("支付类型: " + payment.getType()); + System.out.println("支付代码: " + payment.getCode()); + System.out.println("应用ID: " + payment.getAppId()); + System.out.println("商户号: " + payment.getMchId()); + System.out.println("API密钥: " + (payment.getApiKey() != null ? "已配置(长度:" + payment.getApiKey().length() + ")" : "未配置")); + System.out.println("商户证书序列号: " + payment.getMerchantSerialNumber()); + System.out.println("状态: " + payment.getStatus()); + + return payment; } /** @@ -212,32 +251,32 @@ import com.gxwebsoft.common.core.service.PaymentCacheService; * @return */ public JsapiServiceExtension getWxService(ShopOrder order) { - final Payment payment = getPayment(order); - String privateKey; - String apiclientCert; - String pubKey = null; + try { + final Payment payment = getPayment(order); + String privateKey; + String apiclientCert = null; + String pubKey = null; - // 开发环境配置 - 使用证书加载器 + // 开发环境配置 - 使用自动证书配置 if (active.equals("dev")) { // 构建包含租户号的证书路径: dev/wechat/{tenantId}/ String tenantCertPath = "dev/wechat/" + order.getTenantId(); String privateKeyPath = tenantCertPath + "/" + certConfig.getWechatPay().getDev().getPrivateKeyFile(); - String merchantCertPath = tenantCertPath + "/" + certConfig.getWechatPay().getDev().getApiclientCertFile(); - String wechatpayCertPath = tenantCertPath + "/" + certConfig.getWechatPay().getDev().getWechatpayCertFile(); System.out.println("开发环境证书路径 - 租户ID: " + order.getTenantId()); System.out.println("开发环境证书路径 - 私钥: " + privateKeyPath); - System.out.println("开发环境证书路径 - 商户证书: " + merchantCertPath); - System.out.println("开发环境证书路径 - 微信支付平台证书: " + wechatpayCertPath); - System.out.println("支付配置信息 - 商户号: " + payment.getMchId() + - ", 序列号: " + payment.getMerchantSerialNumber() + - ", API密钥: " + (payment.getApiKey() != null ? "已配置" : "未配置")); + System.out.println("=== 支付配置详细信息 ==="); + System.out.println("商户号: " + payment.getMchId()); + System.out.println("序列号: " + payment.getMerchantSerialNumber()); + System.out.println("API密钥: " + (payment.getApiKey() != null ? "已配置(长度:" + payment.getApiKey().length() + ")" : "未配置")); + System.out.println("应用ID: " + payment.getAppId()); + System.out.println("支付类型: " + payment.getType()); + System.out.println("支付代码: " + payment.getCode()); privateKey = certificateLoader.loadCertificatePath(privateKeyPath); - apiclientCert = certificateLoader.loadCertificatePath(wechatpayCertPath); System.out.println("证书加载完成 - 私钥文件: " + privateKey); - System.out.println("证书加载完成 - 微信支付平台证书文件: " + apiclientCert); + System.out.println("使用自动证书配置,无需手动加载微信支付平台证书"); } else { // 生产环境配置 - 从容器证书目录加载,包含租户号 final String certRootPath = certConfig.getCertRootPath(); // /www/wwwroot/file.ws @@ -256,28 +295,62 @@ import com.gxwebsoft.common.core.service.PaymentCacheService; } } - // 兼容公钥 + // 构建微信支付配置 Config config; - if (payment.getPubKey() != null && !payment.getPubKey().isEmpty()) { - config = new RSAPublicKeyConfig.Builder() - .merchantId(payment.getMchId()) - .privateKeyFromPath(privateKey) - .publicKeyFromPath(pubKey) - .publicKeyId(payment.getPubKeyId()) - .merchantSerialNumber(payment.getMerchantSerialNumber()) - .apiV3Key(payment.getApiKey()) - .build(); + if (active.equals("dev")) { + // 开发环境使用自动证书配置 + // 检查数据库配置是否完整 + if (payment.getMchId() == null || payment.getMchId().trim().isEmpty()) { + throw new RuntimeException("数据库中商户号(mchId)未配置"); + } + if (payment.getMerchantSerialNumber() == null || payment.getMerchantSerialNumber().trim().isEmpty()) { + throw new RuntimeException("数据库中商户证书序列号(merchantSerialNumber)未配置"); + } + if (payment.getApiKey() == null || payment.getApiKey().trim().isEmpty()) { + throw new RuntimeException("数据库中API密钥(apiKey)未配置"); + } + + System.out.println("=== 使用数据库支付配置 ==="); + System.out.println("商户号: " + payment.getMchId()); + System.out.println("序列号: " + payment.getMerchantSerialNumber()); + System.out.println("API密钥: 已配置(长度:" + payment.getApiKey().length() + ")"); + + config = wechatCertAutoConfig.createAutoConfig( + payment.getMchId(), + privateKey, + payment.getMerchantSerialNumber(), + payment.getApiKey() + ); } else { - config = new RSAConfig.Builder() - .merchantId(payment.getMchId()) - .privateKeyFromPath(privateKey) - .merchantSerialNumber(payment.getMerchantSerialNumber()) - .wechatPayCertificatesFromPath(apiclientCert) - .build(); + // 生产环境兼容公钥配置 + if (payment.getPubKey() != null && !payment.getPubKey().isEmpty()) { + config = new RSAPublicKeyConfig.Builder() + .merchantId(payment.getMchId()) + .privateKeyFromPath(privateKey) + .publicKeyFromPath(pubKey) + .publicKeyId(payment.getPubKeyId()) + .merchantSerialNumber(payment.getMerchantSerialNumber()) + .apiV3Key(payment.getApiKey()) + .build(); + } else { + config = new RSAConfig.Builder() + .merchantId(payment.getMchId()) + .privateKeyFromPath(privateKey) + .merchantSerialNumber(payment.getMerchantSerialNumber()) + .wechatPayCertificatesFromPath(apiclientCert) + .build(); + } } // 构建service return new JsapiServiceExtension.Builder().config(config).build(); + } catch (Exception e) { + System.err.println("=== 构建微信支付服务失败 ==="); + System.err.println("错误信息: " + e.getMessage()); + System.err.println("错误类型: " + e.getClass().getName()); + e.printStackTrace(); + throw new RuntimeException("构建微信支付服务失败:" + e.getMessage(), e); + } } } diff --git a/src/main/resources/dev/wechat/10550/apiclient_cert.p12 b/src/main/resources/dev/wechat/10550/apiclient_cert.p12 deleted file mode 100644 index bde6b5e92f736948bc59c9b3bead3b07377b691d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2798 zcmY+EX*d*$8pmfCW9*cDA37MqG(?86XYZ7y8I`e?y+W2VG?uZ9Eh0<9jAd*ovQ)|z z1`)EQLYC}g-v(tl?(^Jx&%Gc1&-=W;|NFcje{cfpPX-_(oWS}T%pxCS60^qvWCrFD zSc^ae*8EdUffJY{{;9xu1SalN#LfT&oDQac8X#O0%=+&S>_9M_69hrG1m)7A3^5E0 z5I{HqG_1S#0p!Ew2RSJRPMkNV%l zAC#8k8~&`3*Ha_{*ANFt1Tx9pYy$J5@Vbuf&{X$XM+OEH#__xJFZqX2?f8vd?OYCf zs1gM0IFg;l^vW{JEOMOp{SM*|g^b*<4}?k=3;vwVxZ*i#bBw*VZfW6&D`{hD9kA{Ip6*;3L05enaL3MmjM6ZjDkbl~95g0lX#51BX*2kXW zDGZXnruEkHXEGE}VTv~%eEdu9si=dl>{&MCpwin!#*oyXI|+Yuw10nmaOqn&oUWcc z*LIWEfSEDv-Yu(mo=~B$kjm_RD{TNS@MDB*n{I3vIcoeC8b8zmIT2!%MJI%2-jNK< zTehc3EJTYG6N%9k5Sa(Kc2knPbVx?+c31LKpFZt3V;a@wAHWCa$eNiFoKx)MSIIJg z%D1o+bKd>sD!OY=xvQ@a9t-N?;osVre;Ii=Q4k^BZ8dz@pq@#?sNN>KW{@Je?U#{X z7sVX57h9n-=jA^&Tt6O1XR32E5%*(buHuo=N2*;)489h|Z~q`|g1+0(Y|1<*3Bh^r zJ;$QOL8}!=!V9PAk(e5m*hS}s%wAiUwOuT-R$r^;(-d3zMxtz@o@@}WrWfIL$6Z+~xJOspjjjrcn+tySr6O^qH6EBMV0wJCTHIR z_H&U<*4FOnZ`$jH`wjM^UD;Gdx!Q2&p5F+q^KlADfV5M^(85PKFWUHQ7rb4*I!q%!ccOziFIyiT>x^^8Y@#;uf5BT2vW3AM?DH)?) zPz)Mcrdqr%C8;cnZ*8rHAL)Gs;fS5rjbeA1q1aADPuQd%DlLMSBsbccAFFsVkH3@n zju=_CBf#%w#m2KkH&8_C=ZZ+np?j>3C?&i$`PhN=EkJR`;$v`j%|bb!XMu{rv+Pjh z;HQu^+qcfSVsF5^KiJVbI0+#Ax|4Bz;-yx7g=~r;;M(m7qIXmWUuvwj?5PL?|3`$U zigW`Jm|RY=!)b1T+5V$NRv<$j0kj4ufPVg;EgAo1ODSIdEjPczQ`la^dqrd3=hY*)gnBDI^0@ucdr106QDV|r>kB;RMEIs85!Rc2#?P2e0Wn-%xUu3_n zk7isB2D-$(*2`7Y{3?G^sp|M)<^JOmXMcyHx8-UOYQHS%hJWVU@p*Fkbaeni`OaPy zJ#~WUiWME7V@wu5afd}fRpaz~K;nk#4V8S+;T0^VN*N}Cri=Iyk6*-1*xQ<*+G?Go?^%D62H9OptxQj z_^L)?TCe5YarSbOhwyv2n zgTod)S~r^j^u>!?WS$L8lAVcbcwqK6NrlSk8*HHd4zX~NRYz%ccYE&$=*8nOJ7=TN z+4pn>fJ)wJiXVS(^HP#+*2;TR-#<90%q9Yq6;xlE9BCe<0uJwcgK!+_TiLKl%+zN7 z9yQkdb-uvpyJR+3mES8DgK621W+jiUHLA`scCz2Y7@uM9) zFG?1cI4qs0OH0!D&GYSSq+gXfKJKA_{1e#f?fY8jpn%)zmK`2$cU{<&R{~QW1>559 zrcZ+y7US}*yL*Y!Vl|VIP#RWOM+lea+q7JlVd{7#NB`jtU(H-n7hS`LfU>L8t+l*V z;HjCuPcaA1Y=^X|W?A(?xW{O2FD~4KOaIr7EPNOELA?BYMJwf7Hq_L>hEDp;VzauV zkJE6Ke~x%B$cUc<*Z}ST?g4xNP5>N05@2w;`2qX^9st+VxSUddz#X_E913RvGbwN~ oG6*vPK)eb+JYKNL3(Gm$Y@+esuA;o`hHxNAZnyejbZ;Z;-%@rb@&Et; diff --git a/src/main/resources/dev/wechat/10550/apiclient_cert.pem b/src/main/resources/dev/wechat/10550/apiclient_cert.pem deleted file mode 100644 index e3b8be8..0000000 --- a/src/main/resources/dev/wechat/10550/apiclient_cert.pem +++ /dev/null @@ -1,25 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEQDCCAyigAwIBAgIUK5M/fDUBShw2NkJiPkpiNks0xOswDQYJKoZIhvcNAQEL -BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT -FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg -Q0EwHhcNMjUwNzI2MTI1MjMyWhcNMzAwNzI1MTI1MjMyWjCBmTETMBEGA1UEAwwK -MTcyMzMyMTMzODEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMUUwQwYDVQQL -DDzmnZzlsJTkvK/nibnokpnlj6Tml4/oh6rmsrvljr/ml7bph4zlhpzkuJrnp5Hm -ioDmnInpmZDlhazlj7gxCzAJBgNVBAYTAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANO4sq8tWbg5Zg6ioIltG8ME -8D1V3w4SXcsqBm5ilyCBVflQTHLqTUIKtU9BeR7+SQpeArDDFEVaMfn4ZuHlHPkY -Eic7YvuHMxH82IBAt9Ryz1m9ULTvae9Z3JGWEhIPiG/FmXjrak4LUlPoHDi22pVy -XLallAacP/1O8UKFg3KaGNi5/ZrTgoDr/hHkdW1CR12PlqxAV3fSShqAhwEemHav -msRptybIJND7K97XA3UPBxP84f2FuHwlj0c1sCqwI/C4R4hDZI7ShG+BEnNcUuDD -plk3qjj3igHUX6KfZZ5V6/MWUw02inV+SH72dDKdhItLFdZlT8bpvxjjb9UYr4MC -AwEAAaOBuTCBtjAJBgNVHRMEAjAAMAsGA1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQ -MIGNoIGKoIGHhoGEaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1 -c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQy -JnNnPUhBQ0M0NzFCNjU0MjJFMTJCMjdBOUQzM0E4N0FEMUNERjU5MjZFMTQwMzcx -MA0GCSqGSIb3DQEBCwUAA4IBAQAzIMqiMPT8gsJo3eEkppJPwOcA8SrPxrSJ0qV4 -/kZlu1ceClIy2aOPXDjf/LjB0I4YabU7/J8pLnXbKPKe2fSG1AycjrLEsZTOJ51M -Yahvj6sRJoC5aa+xQOj17VAVqySEg0JyK/5k6kvAulPO1dG6/YGoycAdDflJOjyd -mIHWQzlEJb5+LWQFCwskMTWy3CUF9Edw7jhgJwkl24CztocGrJ+AfJzoBTkfZmNO -TxD5gVSK00B1r7+ipS+iLXxWeHCpaRsG3PSsByWDA6pphlwr5IMghqne465gavWi -muwrpaGPdVi6+vz/QFyMelj4GT8g77VGVRCOa8DUvu0QxjTk ------END CERTIFICATE----- diff --git a/src/main/resources/dev/wechat/10550/apiclient_key.pem b/src/main/resources/dev/wechat/10550/apiclient_key.pem deleted file mode 100644 index d3c1495..0000000 --- a/src/main/resources/dev/wechat/10550/apiclient_key.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDTuLKvLVm4OWYO -oqCJbRvDBPA9Vd8OEl3LKgZuYpcggVX5UExy6k1CCrVPQXke/kkKXgKwwxRFWjH5 -+Gbh5Rz5GBInO2L7hzMR/NiAQLfUcs9ZvVC072nvWdyRlhISD4hvxZl462pOC1JT -6Bw4ttqVcly2pZQGnD/9TvFChYNymhjYuf2a04KA6/4R5HVtQkddj5asQFd30koa -gIcBHph2r5rEabcmyCTQ+yve1wN1DwcT/OH9hbh8JY9HNbAqsCPwuEeIQ2SO0oRv -gRJzXFLgw6ZZN6o494oB1F+in2WeVevzFlMNNop1fkh+9nQynYSLSxXWZU/G6b8Y -42/VGK+DAgMBAAECggEAIgBuid2RpBlrv3v0pj1kkPxRDLimut7OO1uDbuTcenbq -9MAllurz/2Ay4AiWyBh0aHrSmcqqjby/e/KdqzedYI+yEqTh75014XSm3GoIW9EY -ZcQWmwg8DhlzZ9ofCtF9yt2EGTxNdT0yOpFzPtR25DtakmajEDC1whuUeWdxxcyY -2fDnIDeyaYfWSD0MWBYCa3+8TcvM/gCYzamr/Tfj59VwsznPNr5ehkQdCCRWVMAr -gg+h6ZOta8fSPwY11T6B743f5uyUUatKH90Yvg8OgbNqoqWyuPSoXM+VF0YOQk2N -0Q0gKnQ4ReDPFPBDXLfzQ4Q7g+N+S2u12r1u6z/E6QKBgQDsAvEO4l22pV6pltX9 -DDu6qyjPrRE7wadahFDWE7Rm3ENp69Ha1DqaNMYzGzSjcVZX0eoXsBw/cfyhjlML -vxw72SRS4XdZSJ+pfrtLw8n1XcuW8xOupVD0s9oLLB2dBXcJeytCM5UITZZHbJei -Y90Rlg88Ud7evO9kaENIouYc/QKBgQDlpx1t2qmjQcaXS1Ohe09ovCzxIr3jv8LQ -TQkM3wS9RdfOqX3MynnCopBlEYgxJFORQx2pzT1TmGtg5UOGP6Reck64oI8C+Vjt -AkFlODk1JCjeSgoR1zw1+KEwOZ9x2jswC1E3oZsFU+FdbrdyBiCyHRAXfWX3QW8y -CQIu6gnmfwKBgEALLE7Vroh5p45tl/Pq9epZt+FjHWIR0tAFR8pP3oxrCQAdNf0j -yiM+XupPX6FaiAucsuFqsL+mtt9AN9jgK1EyQ2EaPcDErE7aTQjqQEuNAEod/CFQ -Sv+cLncJqZ+KdBrmiX6VcMOoCjeniB5Q6xRym//KV6gprOyaPmffjIIhAoGAc1qQ -7rgyE34bma1NkcRVq98xl+ICjd6ppWW8kQmI4OWvM/Bw7ygZJwnvC8VVqpF7pHCY -+szL7CyYazBdzZY0Ivi50AVeMHk9ELfcT1KBcc769EUub620YcvEc2vOSir7JfPZ -VN9I9dEfV4YggRbQ34a3qYTkbeEhUHmz7grC9FMCgYBOanMGgmxLyRkrJdFvSgr5 -cBFeUxyr2jqgNrNbE77d5yB1lbgtWKQuokszSaxdnxGnsANSYdeF1FVI9zhcaqJf -xB2xOMesrNksZ4C+fKkSgmeofXi+D5aWYIZVuj73KInzJsvpci7z8qLK6/RjZsyF -TomCc7Iv0ufa1OirExFaNA== ------END PRIVATE KEY----- diff --git a/src/main/resources/dev/wechat/10550/wechatpay_cert.pem b/src/main/resources/dev/wechat/10550/wechatpay_cert.pem deleted file mode 100644 index f225ce7..0000000 --- a/src/main/resources/dev/wechat/10550/wechatpay_cert.pem +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAty9bVrLUO+O4vVILMaDX -rmsVCxH2FcZE2zAKJuOSkxscjEcpEBIuXO0CqKbYRt/Pn61W12sj3/MnV6bm1h++ -ebdIMpwGRh9Dn3YXD7UzUF5DtQ1UT3LU2nJDLD27AtZmVSOy+sWHp8Qlz1IqdCyo -+7uIRNe5PIFDDG4dCjezYpZkuhCoeXAUmG838szabsbCN9hwuJx5YNAMBkGy5jqd -ou8NxNPCoMZtaKuhzjQUsow7IQ3brg78CnyB0pfFTDbPs1C9GLF5munvwK1prCLU -4KSbc4ZhjX88dLfClh3FTjdV0kQvlubf0Z71LqR9aMlU4WEFxE7KIeyolAGYdip4 -xwIDAQAB ------END PUBLIC KEY-----