diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/imp/MerchantServiceImp.java b/payment-base-app/src/main/java/com/base/springcloud/service/imp/MerchantServiceImp.java index 35a7473..a0edac2 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/service/imp/MerchantServiceImp.java +++ b/payment-base-app/src/main/java/com/base/springcloud/service/imp/MerchantServiceImp.java @@ -10,7 +10,12 @@ import com.base.springcloud.service.MerchantService; import com.base.springcloud.util.FtpUtil; import com.base.springcloud.util.WxpayUtils; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; import org.apache.commons.lang.StringUtils; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.util.EntityUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -203,5 +208,6 @@ public class MerchantServiceImp implements MerchantService { "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"); + System.out.println(objectNode); }*/ } \ No newline at end of file diff --git a/payment-base-app/src/main/java/com/base/springcloud/util/WxpayUtils.java b/payment-base-app/src/main/java/com/base/springcloud/util/WxpayUtils.java index 2b5ba04..8d476af 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/util/WxpayUtils.java +++ b/payment-base-app/src/main/java/com/base/springcloud/util/WxpayUtils.java @@ -17,7 +17,9 @@ import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.util.EntityUtils; +import org.springframework.stereotype.Component; import org.springframework.util.Base64Utils; +import sun.misc.BASE64Decoder; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; @@ -30,6 +32,8 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.security.*; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.time.LocalDateTime; import java.time.ZoneOffset; @@ -41,6 +45,7 @@ import java.util.stream.Collectors; * * @author shuaifengjie.com */ +@Component @Slf4j public class WxpayUtils { @@ -115,31 +120,25 @@ public class WxpayUtils { public static String response(String data, String url, String mchid, String privateKey, String certificate, String serialNo) { log.info("====>>> wxpay response, mchid: {}, serialNo: {}, url: {}, privateKey: {}, certificate: {}, data: {}", mchid, serialNo, url, privateKey, certificate, data); - // ... HttpPost httpPost = new HttpPost(url); StringEntity reqEntity = new StringEntity(data, ContentType.create("application/json", "utf-8")); - // ... httpPost.setEntity(reqEntity); httpPost.addHeader("Accept", "application/json"); - // ... CloseableHttpResponse response = null; // 返回 String body = null; try { // 商户私钥 PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8"))); - // ... response = getClient(mchid, serialNo, merchantPrivateKey, certificate).execute(httpPost); log.info("====>>> wxpay response, result: {}", JSON.toJSONString(response)); - // response = httpClient.execute(httpPost); - // assertTrue(response.getStatusLine().getStatusCode() != 401); int statusCode = response.getStatusLine().getStatusCode(); HttpEntity entity = response.getEntity(); body = EntityUtils.toString(entity); log.info("====>>> wxpay response, success: {}, body: {}", statusCode, body); if (statusCode != 200) { - @SuppressWarnings("unchecked") Map errorMsg = StringHelper.json2map(body); + log.info("====>>> wxpay response, fail errorMsg: {}", errorMsg); } // 执行释放 EntityUtils.consume(entity); @@ -167,18 +166,20 @@ public class WxpayUtils { * @return * @throws UnsupportedEncodingException */ - public static CloseableHttpClient getClient(String mchid, String serialNo, PrivateKey privateKey, String certificate) throws UnsupportedEncodingException { - - // 使用自动更新的签名验证器,不需要传入证书 -// AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier( -// new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)), apiV3Key.getBytes("utf-8")); - - // builder - WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create().withMerchant(mchid, serialNo, privateKey); -// .withValidator(new WechatPay2Validator(verifier)); - + public static CloseableHttpClient getClient(String mchid, String serialNo, PrivateKey privateKey, String certificate) throws CertificateException, IOException { + //byte[] bytes = certificate.getBytes(StandardCharsets.UTF_8); + ByteArrayInputStream base = new ByteArrayInputStream(new BASE64Decoder().decodeBuffer(certificate)); List certs = new ArrayList<>(); - certs.add(PemUtil.loadCertificate(new ByteArrayInputStream(certificate.getBytes("utf-8")))); + CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); + X509Certificate cert = null; + try { + cert = (X509Certificate) certificateFactory.generateCertificate(base); + }catch (CertificateException e){ + throw e; + } + assert cert != null; + certs.add(cert); + WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create().withMerchant(mchid, serialNo, privateKey); builder.withWechatpay(certs); return builder.build(); } diff --git a/payment-base-app/target/classes/application.yml b/payment-base-app/target/classes/application.yml index 4e8ece0..bc856a2 100644 --- a/payment-base-app/target/classes/application.yml +++ b/payment-base-app/target/classes/application.yml @@ -1,20 +1,7 @@ server: - port: 8001 #服务端口 -#eureka配置 -eureka: - client: - #表示是否将自己注册进eureka 默认为true - register-with-eureka: true - #是否从EurekaServer中抓取已有的注册信息,默认为true,单点无所谓,集群必须设置true才能和ribbon使用负载均衡 - fetch-registry: true - service-url: - #集群配置 - defaultZone: http://eureka7002.com:7002/eureka - instance: - #服务名称修改 - instance-id: PAYMENT-BASE - #访问路径可以显示ip地址 - prefer-ip-address: true + port: 5080 #服务端口 + servlet: + context-path: /rbs-pay #spring相关配置 spring: application: @@ -22,23 +9,24 @@ spring: datasource: type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型 driver-class-name: org.gjt.mm.mysql.Driver #数据库驱动包 - url: jdbc:mysql://106.14.81.251:3306/rbs_erp_test?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false - username: root - password: hnrr%%360 - #rabbitmq 配置 - rabbitmq: - host: localhost - port: 5672 - username: rbs-payment - password: pay123123 + url: jdbc:mysql://rm-uf672osw4deemr4yt.mysql.rds.aliyuncs.com:3306/rbs_erp?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false + username: hnrr + password: hnrr@0b6759c29a8e + #rabbitmq 配置 + #rabbitmq: + #host: localhost + #port: 5672 + #username: rbs-payment + #password: pay123123 # redis 配置 redis: + database: 10 # 地址 - host: 127.0.0.1 + host: r-uf643kmbsoz7ledq2j.redis.rds.aliyuncs.com # 端口,默认为6379 port: 6379 # 密码 - password: 123456 + password: rds@53798a0fa6ce # 连接超时时间 timeout: 10s lettuce: