提交修改

This commit is contained in:
quyixiao 2025-11-08 13:34:40 +08:00
parent bad3f51484
commit 4ad9532c6e
3 changed files with 64 additions and 10 deletions

View File

@ -79,8 +79,7 @@ public class JsapiPrepay {
public DirectAPIv3JsapiPrepayResponse prePay(Long tradeOrderId,
Long amount,
String openid
) {
String openid) {
DirectAPIv3JsapiPrepayRequest request = new DirectAPIv3JsapiPrepayRequest();
request.setAppid(appid);
request.setMchid(mchid);
@ -103,7 +102,11 @@ public class JsapiPrepay {
}
public DirectAPIv3QueryResponse queryOrder(QueryByWxTradeNoRequest request) {
public DirectAPIv3QueryResponse queryOrder(String transactionId) {
QueryByWxTradeNoRequest request = new QueryByWxTradeNoRequest();
request.transactionId = transactionId;
request.mchid = mchid;
String HOST = "https://api.mch.weixin.qq.com";
String METHOD = "GET";
String uri = "/v3/pay/transactions/id/{transaction_id}";
@ -114,7 +117,6 @@ public class JsapiPrepay {
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);
@ -141,11 +143,50 @@ public class JsapiPrepay {
}
}
public void close(String tradeOrderId) {
String HOST = "https://api.mch.weixin.qq.com";
String METHOD = "POST";
String PATH = "/v3/pay/transactions/out-trade-no/{out_trade_no}/close";
CloseOrderRequest request = new CloseOrderRequest();
request.setOutTradeNo(tradeOrderId);
request.setMchid(mchid);
String uri = PATH;
uri = uri.replace("{out_trade_no}", WXPayUtility.urlEncode(request.outTradeNo));
String reqBody = WXPayUtility.toJson(request);
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, reqBody));
reqBuilder.addHeader("Content-Type", "application/json");
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), reqBody);
reqBuilder.method(METHOD, requestBody);
Request httpRequest = reqBuilder.build();
// 发送HTTP请求
OkHttpClient client = new OkHttpClient.Builder().build();
try (Response httpResponse = client.newCall(httpRequest).execute()) {
String respBody = WXPayUtility.extractBody(httpResponse);
if (httpResponse.code() >= 200 && httpResponse.code() < 300) {
// 2XX 成功验证应答签名
WXPayUtility.validateResponse(this.wechatPayPublicKeyId, this.wechatPayPublicKey,
httpResponse.headers(), respBody);
return;
} 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);
Request.Builder reqBuilder = new Request.Builder().url(HOST + uri);
reqBuilder.addHeader("Accept", "application/json");
reqBuilder.addHeader("Wechatpay-Serial", wechatPayPublicKeyId);

View File

@ -0,0 +1,15 @@
package com.heyu.api.jsapi.dto;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
@Data
public class CloseOrderRequest {
@SerializedName("mchid")
public String mchid;
@SerializedName("out_trade_no")
@Expose(serialize = false)
public String outTradeNo;
}

View File

@ -91,7 +91,7 @@ public class AppWeiXinPayNotifyController {
// AES-GCM解密方法
private String decrypt(String ciphertext, String associatedData, String nonce) throws Exception {
// 将APIv3密钥转为字节数组
byte[] key = apiv3key.getBytes(StandardCharsets.UTF_8);
byte[] key = apiv3key.getBytes(StandardCharsets.UTF_8)
Key secretKey = new SecretKeySpec(key, "AES");
// 使用AES-GCM解密
@ -107,10 +107,8 @@ public class AppWeiXinPayNotifyController {
private void updateOrderStatus(String outTradeNo, String transactionId) {
try {
QueryByWxTradeNoRequest request = new QueryByWxTradeNoRequest();
request.transactionId = transactionId;
request.mchid = mchid;
DirectAPIv3QueryResponse response = jsapiPrepay.queryOrder(request);
DirectAPIv3QueryResponse response = jsapiPrepay.queryOrder(transactionId);
VvTradeOrderEntity tradeOrderEntity = tradeOrderDao.selectVvTradeOrderById(NumberUtil.objToLong(outTradeNo));
tradeOrderEntity.setTradeInfo(JSON.toJSONString(response));