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 85a9857..2a60334 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 @@ -2,10 +2,7 @@ package com.heyu.api.jsapi; // 引用微信支付工具库,参考:https://pay.weixin.qq.com/doc/v3/merchant/4014931831 -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; +import com.heyu.api.jsapi.dto.*; import com.heyu.api.jsapi.utils.PemUtil; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -21,6 +18,8 @@ import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; +import java.util.HashMap; +import java.util.Map; /** * JSAPI下单 @@ -103,6 +102,46 @@ public class JsapiPrepay { return doPay(request); } + + public DirectAPIv3QueryResponse queryOrder(QueryByWxTradeNoRequest request) { + String HOST = "https://api.mch.weixin.qq.com"; + String METHOD = "GET"; + String uri = "/v3/pay/transactions/id/{transaction_id}"; + uri = uri.replace("{transaction_id}", WXPayUtility.urlEncode(request.transactionId)); + Map args = new HashMap<>(); + args.put("mchid", request.mchid); + String queryString = WXPayUtility.urlEncode(args); + if (!queryString.isEmpty()) { + uri = uri + "?" + queryString; + } + + Request.Builder reqBuilder = new Request.Builder().url(HOST + uri); + reqBuilder.addHeader("Accept", "application/json"); + reqBuilder.addHeader("Wechatpay-Serial", wechatPayPublicKeyId); + reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(mchid, certificateSerialNo, privateKey, METHOD, uri, null)); + reqBuilder.method(METHOD, null); + Request httpRequest = reqBuilder.build(); + // 发送HTTP请求 + OkHttpClient client = new OkHttpClient.Builder().build(); + try (Response httpResponse = client.newCall(httpRequest).execute()) { + String respBody = WXPayUtility.extractBody(httpResponse); + log.info("JsapiPrepay queryOrder respBody = " + respBody); + if (httpResponse.code() >= 200 && httpResponse.code() < 300) { + // 2XX 成功,验证应答签名 + WXPayUtility.validateResponse(this.wechatPayPublicKeyId, this.wechatPayPublicKey, + httpResponse.headers(), respBody); + + // 从HTTP应答报文构建返回数据 + return WXPayUtility.fromJson(respBody, DirectAPIv3QueryResponse.class); + } else { + throw new WXPayUtility.ApiException(httpResponse.code(), respBody, httpResponse.headers()); + } + } catch (IOException e) { + throw new UncheckedIOException("Sending request to " + uri + " failed.", e); + } + } + + public DirectAPIv3JsapiPrepayResponse doPay(DirectAPIv3JsapiPrepayRequest request) { String uri = PATH; String reqBody = WXPayUtility.toJson(request); @@ -120,7 +159,7 @@ public class JsapiPrepay { try (Response httpResponse = client.newCall(httpRequest).execute()) { String respBody = WXPayUtility.extractBody(httpResponse); - log.info("JsapiPrepay respBody:{}", respBody); + log.info("JsapiPrepay doPay respBody:{}", respBody); if (respBody != null) { } if (httpResponse.code() >= 200 && httpResponse.code() < 300) { diff --git a/api-third/src/main/java/com/heyu/api/jsapi/QueryByWxTradeNo.java b/api-third/src/main/java/com/heyu/api/jsapi/QueryByWxTradeNo.java deleted file mode 100644 index 436512a..0000000 --- a/api-third/src/main/java/com/heyu/api/jsapi/QueryByWxTradeNo.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.heyu.api.jsapi; -// 引用微信支付工具库,参考:https://pay.weixin.qq.com/doc/v3/merchant/4014931831 - -import com.heyu.api.jsapi.dto.DirectAPIv3QueryResponse; -import com.heyu.api.jsapi.dto.QueryByWxTradeNoRequest; -import lombok.extern.slf4j.Slf4j; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.io.UncheckedIOException; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.util.HashMap; -import java.util.Map; - -/** - * 微信支付订单号查询订单 - */ -@Slf4j -@Component -public class QueryByWxTradeNo { - private static String HOST = "https://api.mch.weixin.qq.com"; - private static String METHOD = "GET"; - private static String PATH = "/v3/pay/transactions/id/{transaction_id}"; - - - private String mchid; - - private String certificateSerialNo; - - private PrivateKey privateKey; - - private String wechatPayPublicKeyId; - - private PublicKey wechatPayPublicKey; - - - public QueryByWxTradeNo() { - - } - - public QueryByWxTradeNo(String mchid, String certificateSerialNo, String privateKeyFilePath, String wechatPayPublicKeyId, String wechatPayPublicKeyFilePath) { - this.mchid = mchid; - this.certificateSerialNo = certificateSerialNo; - this.privateKey = WXPayUtility.loadPrivateKeyFromPath(privateKeyFilePath); - this.wechatPayPublicKeyId = wechatPayPublicKeyId; - this.wechatPayPublicKey = WXPayUtility.loadPublicKeyFromPath(wechatPayPublicKeyFilePath); - } - - - public DirectAPIv3QueryResponse run(QueryByWxTradeNoRequest request) { - String uri = PATH; - uri = uri.replace("{transaction_id}", WXPayUtility.urlEncode(request.transactionId)); - Map args = new HashMap<>(); - args.put("mchid", request.mchid); - String queryString = WXPayUtility.urlEncode(args); - if (!queryString.isEmpty()) { - uri = uri + "?" + queryString; - } - - Request.Builder reqBuilder = new Request.Builder().url(HOST + uri); - reqBuilder.addHeader("Accept", "application/json"); - reqBuilder.addHeader("Wechatpay-Serial", wechatPayPublicKeyId); - reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(mchid, certificateSerialNo, privateKey, METHOD, uri, null)); - reqBuilder.method(METHOD, null); - Request httpRequest = reqBuilder.build(); - - // 发送HTTP请求 - OkHttpClient client = new OkHttpClient.Builder().build(); - try (Response httpResponse = client.newCall(httpRequest).execute()) { - String respBody = WXPayUtility.extractBody(httpResponse); - log.info("QueryByWxTradeNo respBody = " + respBody); - if (httpResponse.code() >= 200 && httpResponse.code() < 300) { - // 2XX 成功,验证应答签名 - WXPayUtility.validateResponse(this.wechatPayPublicKeyId, this.wechatPayPublicKey, - httpResponse.headers(), respBody); - - // 从HTTP应答报文构建返回数据 - return WXPayUtility.fromJson(respBody, DirectAPIv3QueryResponse.class); - } else { - throw new WXPayUtility.ApiException(httpResponse.code(), respBody, httpResponse.headers()); - } - } catch (IOException e) { - throw new UncheckedIOException("Sending request to " + uri + " failed.", e); - } - } - - -} \ No newline at end of file diff --git a/api-web/api-interface/src/main/java/com/heyu/api/config/JSAPIConfig.java b/api-web/api-interface/src/main/java/com/heyu/api/config/JSAPIConfig.java index 000266d..e897b9a 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/config/JSAPIConfig.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/config/JSAPIConfig.java @@ -1,7 +1,6 @@ package com.heyu.api.config; import com.heyu.api.jsapi.JsapiPrepay; -import com.heyu.api.jsapi.QueryByWxTradeNo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -29,23 +28,5 @@ public class JSAPIConfig { - @Bean - public QueryByWxTradeNo queryByWxTradeNo(@Value("${eb.config.weixin.pay.mchid}") String mchid, - @Value("${eb.config.weixin.pay.certificateSerialNo}") String certificateSerialNo, - @Value("${eb.config.weixin.pay.privateKeyFilePath}") String privateKeyFilePath, - @Value("${eb.config.weixin.pay.wechatPayPublicKeyId}") String wechatPayPublicKeyId, - @Value("${eb.config.weixin.pay.wechatPayPublicKeyFilePath}") String wechatPayPublicKeyFilePath) { - - log.info("JSAPIConfig QueryByWxTradeNo init mchid:{}," + - "certificateSerialNo:{}," + - "privateKeyFilePath:{}," + - "wechatPayPublicKeyId:{}," + - "wechatPayPublicKeyFilePath:{}", - mchid, certificateSerialNo, privateKeyFilePath, wechatPayPublicKeyId, wechatPayPublicKeyFilePath); - return new QueryByWxTradeNo(mchid, certificateSerialNo, privateKeyFilePath, wechatPayPublicKeyId, wechatPayPublicKeyFilePath); - } - - - } diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppWeiXinPayNotifyController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppWeiXinPayNotifyController.java index 57d3d0d..47e1666 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppWeiXinPayNotifyController.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppWeiXinPayNotifyController.java @@ -11,7 +11,7 @@ import com.heyu.api.data.dao.vv.VvTradeOrderLineDao; import com.heyu.api.data.entity.vv.VvTradeOrderEntity; import com.heyu.api.data.entity.vv.VvTradeOrderLineEntity; import com.heyu.api.data.utils.NumberUtil; -import com.heyu.api.jsapi.QueryByWxTradeNo; +import com.heyu.api.jsapi.JsapiPrepay; import com.heyu.api.jsapi.dto.DirectAPIv3QueryResponse; import com.heyu.api.jsapi.dto.QueryByWxTradeNoRequest; import lombok.extern.slf4j.Slf4j; @@ -45,15 +45,16 @@ public class AppWeiXinPayNotifyController { @Value("${eb.config.weixin.pay.apiv3key}") private String apiv3key; - @Autowired - private QueryByWxTradeNo queryByWxTradeNo; - @Autowired private VvTradeOrderDao tradeOrderDao; @Value("${eb.config.weixin.pay.mchid}") private String mchid; + + @Autowired + private JsapiPrepay jsapiPrepay; + @Describe("微信支付回调") @PostMapping("/payNotify") public String handleWeChatPayCallback(@RequestBody String requestBody) { @@ -109,7 +110,7 @@ public class AppWeiXinPayNotifyController { QueryByWxTradeNoRequest request = new QueryByWxTradeNoRequest(); request.transactionId = transactionId; request.mchid = mchid; - DirectAPIv3QueryResponse response = queryByWxTradeNo.run(request); + DirectAPIv3QueryResponse response = jsapiPrepay.queryOrder(request); VvTradeOrderEntity tradeOrderEntity = tradeOrderDao.selectVvTradeOrderById(NumberUtil.objToLong(outTradeNo)); tradeOrderEntity.setTradeInfo(JSON.toJSONString(response)); diff --git a/api-web/api-interface/src/test/java/com/api/test/JSAPIQueryTest.java b/api-web/api-interface/src/test/java/com/api/test/JSAPIQueryTest.java index c2aa046..b170316 100644 --- a/api-web/api-interface/src/test/java/com/api/test/JSAPIQueryTest.java +++ b/api-web/api-interface/src/test/java/com/api/test/JSAPIQueryTest.java @@ -1,6 +1,5 @@ package com.api.test; -import com.heyu.api.jsapi.QueryByWxTradeNo; import com.heyu.api.jsapi.WXPayUtility; import com.heyu.api.jsapi.dto.DirectAPIv3QueryResponse; import com.heyu.api.jsapi.dto.QueryByWxTradeNoRequest;