提交修改
This commit is contained in:
parent
cf65855bf0
commit
bad3f51484
@ -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) {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user