提交修改

This commit is contained in:
quyixiao 2025-11-08 13:30:30 +08:00
parent cf65855bf0
commit bad3f51484
5 changed files with 50 additions and 122 deletions

View File

@ -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<String, Object> 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) {

View File

@ -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<String, Object> 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);
}
}
}

View File

@ -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);
}
}

View File

@ -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));

View File

@ -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;