@@ -0,0 +1,31 @@ | |||
package cn.com.taiji.core.entity.dict.pay; | |||
import lombok.AllArgsConstructor; | |||
import lombok.Getter; | |||
/** | |||
* @Author:ChenChao | |||
* @Date:2025/5/14 16:56 | |||
* @Filename:TradeState | |||
* @description: 交易状态 | |||
*/ | |||
@AllArgsConstructor | |||
@Getter | |||
public enum TradeState { | |||
SUCCESS("支付成功"), | |||
REFUND("转入退款"), | |||
NOTPAY("未支付"), | |||
CLOSED("已关闭"), | |||
REVOKED("已撤销(仅付款码支付会返回)"), | |||
USERPAYING("用户支付中(仅付款码支付会返回)"), | |||
PAYERROR("支付失败(仅付款码支付会返回)"), | |||
; | |||
private String name; | |||
} |
@@ -24,7 +24,7 @@ public class AtsCreatPayOrderV3Request extends AbstractAtsRequest<AtsCreatPayOrd | |||
super(AtsServiceCmd.CREATEPAYORDERV3); | |||
} | |||
/** | |||
* 1单独下单url | |||
* 1单独下单url-普通商户下单 | |||
* 2服务商下单 | |||
* 3合并下单url | |||
* 目前只提供单独下单和服务商下单 | |||
@@ -37,7 +37,7 @@ public class AtsCreatPayOrderV3Request extends AbstractAtsRequest<AtsCreatPayOrd | |||
private TradeType tradeType;//交易方式 | |||
protected String appid;//应用ID | |||
protected String mchid;//直连商户号 | |||
protected String spAppid;//服务商应用ID | |||
protected String spMchId;//服务商商户号 | |||
@@ -85,8 +85,13 @@ public class AtsCreatPayOrderV3Request extends AbstractAtsRequest<AtsCreatPayOrd | |||
//=================================组装到H5场景信息H5Info h5Info,然后h5Info组装到场景信息SceneInfo sceneInfo; | |||
private String type;//场景类型,示例值:iOS, Android, Wap | |||
@NotBlank | |||
protected String mchid;//直连商户号 | |||
@NotBlank | |||
private String apiV3Key; // API V3密钥 | |||
@NotBlank | |||
private String privateKey;// 你的商户私钥 | |||
@NotBlank | |||
private String serialNo;// 商户证书序列号 | |||
@@ -94,15 +99,19 @@ public class AtsCreatPayOrderV3Request extends AbstractAtsRequest<AtsCreatPayOrd | |||
if (createType == 1){ | |||
builder.validFieldNotBlank("appid", appid); | |||
builder.validFieldNotBlank("mchid", mchid); | |||
builder.validFieldNotBlank("openid", openid); | |||
// builder.validFieldNotBlank("mchid", mchid); | |||
if (TradeType.JSAPI.equals(tradeType)) { | |||
builder.validFieldNotBlank("openid", openid); | |||
} | |||
} | |||
if (createType == 2){ | |||
builder.validFieldNotBlank("spAppid", spAppid); | |||
builder.validFieldNotBlank("spMchId", spMchId); | |||
builder.validFieldNotBlank("subMchId", subMchId); | |||
builder.validField("notBlank","spOpenid/subOpenid", | |||
!hasText(spOpenid) && !hasText(subOpenid),null,"服务商用户标识和子商户应用用户标识不能都为空"); | |||
if (TradeType.JSAPI.equals(tradeType)) { | |||
builder.validField("notBlank", "spOpenid/subOpenid", | |||
!hasText(spOpenid) && !hasText(subOpenid), null, "服务商用户标识和子商户应用用户标识不能都为空"); | |||
} | |||
} | |||
if (TradeType.MWEB.equals(tradeType)){ | |||
builder.validFieldNotBlank("payerClientIp",payerClientIp); |
@@ -0,0 +1,55 @@ | |||
package cn.com.taiji.core.model.comm.protocol.ats; | |||
import cn.com.taiji.core.entity.dict.pay.TradeType; | |||
import cn.com.taiji.core.model.comm.protocol.constraint.IntegerConstant; | |||
import cn.com.taiji.core.model.comm.protocol.valid.ErrorMsgBuilder; | |||
import lombok.Getter; | |||
import lombok.Setter; | |||
import javax.validation.constraints.NotBlank; | |||
import javax.validation.constraints.NotNull; | |||
/** | |||
* @Author:ChenChao | |||
* @Date:2025/5/14 16:30 | |||
* @Filename:AtsQueryPayResultRequest | |||
* @description: 支付结果查询请求 | |||
*/ | |||
@Getter | |||
@Setter | |||
public class AtsQueryPayResultRequest extends AbstractAtsRequest<AtsQueryPayResultResponse>{ | |||
public AtsQueryPayResultRequest() { | |||
super(AtsServiceCmd.QUERYPAYRESULT); | |||
} | |||
/** | |||
* 1单独下单url-普通商户下单 | |||
* 2服务商下单 | |||
* 3合并下单url | |||
* 目前只提供单独下单和服务商下单 | |||
*/ | |||
@IntegerConstant(values = "1,2") | |||
@NotNull | |||
private Integer createType; | |||
@NotBlank | |||
private String externalOrderNo; //支付单号 | |||
@NotNull | |||
private TradeType tradeType;//交易方式 | |||
@NotBlank | |||
protected String mchid;//直连商户号 | |||
@NotBlank | |||
private String apiV3Key; // API V3密钥 | |||
@NotBlank | |||
private String privateKey;// 你的商户私钥 | |||
@NotBlank | |||
private String serialNo;// 商户证书序列号 | |||
@Override | |||
protected void validate(ErrorMsgBuilder builder) { | |||
} | |||
} |
@@ -0,0 +1,49 @@ | |||
package cn.com.taiji.core.model.comm.protocol.ats; | |||
import cn.com.taiji.core.entity.dict.pay.TradeState; | |||
import cn.com.taiji.core.entity.dict.pay.TradeType; | |||
import lombok.Getter; | |||
import lombok.Setter; | |||
/** | |||
* @Author:ChenChao | |||
* @Date:2025/5/14 16:30 | |||
* @Filename:AtsQueryPayResultRequest | |||
* @description: 支付结果查询响应 | |||
*/ | |||
@Setter | |||
@Getter | |||
public class AtsQueryPayResultResponse extends AbstractAtsResponse{ | |||
private String appid;//公众账号ID 是 | |||
private String mchid;//商户号 是 | |||
private String outTradeNo;//商户订单号 是 | |||
private String transactionId;//微信支付订单号 否 | |||
private TradeType tradeType;//交易类型 否 | |||
private TradeState tradeState;//交易状态 是 | |||
private String tradeStateDesc;//交易状态描述 是 | |||
private String bankType;//银行类型 否 | |||
private String attach ;//商户数据包 否 | |||
private String successTime;//支付完成时间 否 | |||
private String openid;//用户标识,用户在商户下单的appid下唯一标识 否 | |||
private Integer total;//订单总金额 否 | |||
private Integer payerTotal;//用户实际支付金额 否 | |||
private String currency;//货币类型 否 | |||
} |
@@ -6,7 +6,8 @@ import cn.com.taiji.core.model.comm.protocol.SignServiceType; | |||
public enum AtsServiceCmd implements SignServiceCommand { | |||
CREATEPAYORDERV2("V2统一下单","creatOrderV2", AtsCreatPayOrderV2Request.class), | |||
CREATEPAYORDERV3("V3统一下单","creatOrderV3", AtsCreatPayOrderV3Request.class), // | |||
CREATEPAYORDERV3("V3统一下单","creatOrderV3", AtsCreatPayOrderV3Request.class), | |||
QUERYPAYRESULT("查询支付结果","queryPayResult", AtsQueryPayResultRequest.class), | |||
; | |||
@@ -1,8 +1,12 @@ | |||
package cn.com.taiji.ats.manager.comm; | |||
import cn.com.taiji.common.manager.net.http.ServiceHandleException; | |||
import cn.com.taiji.core.entity.dict.pay.TradeState; | |||
import cn.com.taiji.core.entity.dict.pay.TradeType; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsCreatPayOrderV3Request; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsCreatPayOrderV3Response; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsQueryPayResultRequest; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsQueryPayResultResponse; | |||
import cn.com.taiji.core.model.comm.protocol.valid.GlyServiceError; | |||
import com.wechat.pay.java.core.RSAAutoCertificateConfig; | |||
import com.wechat.pay.java.service.partnerpayments.app.AppServiceExtension; | |||
@@ -11,6 +15,7 @@ import com.wechat.pay.java.service.partnerpayments.h5.model.H5Info; | |||
import com.wechat.pay.java.service.partnerpayments.jsapi.JsapiServiceExtension; | |||
import com.wechat.pay.java.service.partnerpayments.jsapi.model.*; | |||
import com.wechat.pay.java.service.partnerpayments.nativepay.NativePayService; | |||
import com.wechat.pay.java.service.payments.model.Transaction; | |||
import org.springframework.stereotype.Service; | |||
@@ -183,4 +188,64 @@ public class WxPartnerPayV3 { | |||
return orderV3Response; | |||
} | |||
// //NATIVE支付结果查询 | |||
// private AtsQueryPayResultResponse getNativePayResult(AtsQueryPayResultRequest req, RSAAutoCertificateConfig config) { | |||
// com.wechat.pay.java.service.partnerpayments.nativepay.NativePayService service = new com.wechat.pay.java.service.partnerpayments.nativepay.NativePayService.Builder().config(config).build(); | |||
// com.wechat.pay.java.service.partnerpayments.nativepay.model.QueryOrderByOutTradeNoRequest request = new com.wechat.pay.java.service.partnerpayments.nativepay.model.QueryOrderByOutTradeNoRequest(); | |||
// request.setOutTradeNo(req.getExternalOrderNo()); | |||
// request.setMchid(req.getMchid()); | |||
// com.wechat.pay.java.service.partnerpayments.nativepay.model.Transaction transaction = service.queryOrderByOutTradeNo(request); | |||
// return getPayResult(transaction); | |||
// } | |||
// | |||
// //APP支付结果查询 | |||
// private AtsQueryPayResultResponse getAppPayResult(AtsQueryPayResultRequest req, RSAAutoCertificateConfig config) { | |||
// com.wechat.pay.java.service.partnerpayments.app.AppServiceExtension appService = new com.wechat.pay.java.service.partnerpayments.app.AppServiceExtension.Builder().config(config).build(); | |||
// com.wechat.pay.java.service.partnerpayments.app.model.QueryOrderByOutTradeNoRequest request = | |||
// new com.wechat.pay.java.service.partnerpayments.app.model.QueryOrderByOutTradeNoRequest(); | |||
// request.setMchid(req.getMchid()); | |||
// request.setOutTradeNo(req.getExternalOrderNo()); | |||
// com.wechat.pay.java.service.partnerpayments.app.model.Transaction transaction = appService.queryOrderByOutTradeNo(request); | |||
// return getPayResult(transaction); | |||
// } | |||
// | |||
// //JSAPI支付结果查询 | |||
// private AtsQueryPayResultResponse getJsapiPayResult(AtsQueryPayResultRequest req, RSAAutoCertificateConfig config) { | |||
// com.wechat.pay.java.service.partnerpayments.jsapi.JsapiServiceExtension jsapiService = new com.wechat.pay.java.service.partnerpayments.jsapi.JsapiServiceExtension.Builder().config(config).build(); | |||
// com.wechat.pay.java.service.partnerpayments.jsapi.model.QueryOrderByOutTradeNoRequest request = | |||
// new com.wechat.pay.java.service.partnerpayments.jsapi.model.QueryOrderByOutTradeNoRequest(); | |||
// request.setMchid(req.getMchid()); | |||
// request.setOutTradeNo(req.getExternalOrderNo()); | |||
// com.wechat.pay.java.service.partnerpayments.jsapi.model.Transaction transaction = jsapiService.queryOrderByOutTradeNo(request); | |||
// return getPayResult(transaction); | |||
// } | |||
// | |||
// // H5支付订单查询 | |||
// private AtsQueryPayResultResponse getH5PayResult(AtsQueryPayResultRequest req, RSAAutoCertificateConfig config) { | |||
// com.wechat.pay.java.service.partnerpayments.h5.H5Service h5Service = new com.wechat.pay.java.service.partnerpayments.h5.H5Service.Builder().config(config).build(); | |||
// com.wechat.pay.java.service.partnerpayments.h5.model.QueryOrderByOutTradeNoRequest request = | |||
// new com.wechat.pay.java.service.partnerpayments.h5.model.QueryOrderByOutTradeNoRequest(); | |||
// request.setOutTradeNo(req.getExternalOrderNo()); | |||
// request.setMchid(req.getMchid()); | |||
// com.wechat.pay.java.service.partnerpayments.h5.model.Transaction transaction = h5Service.queryOrderByOutTradeNo(request); | |||
// return getPayResult(transaction); | |||
// } | |||
// | |||
// private AtsQueryPayResultResponse getPayResult(Transaction transaction) { | |||
// AtsQueryPayResultResponse response = copyProperties(transaction, new AtsQueryPayResultResponse()); | |||
// if (transaction.getPayer() != null) { | |||
// response.setOpenid(transaction.getPayer().getOpenid()); | |||
// } | |||
// if (transaction.getAmount() != null) { | |||
// response.setTotal(transaction.getAmount().getTotal()); | |||
// response.setPayerTotal(transaction.getAmount().getPayerTotal()); | |||
// response.setCurrency(transaction.getAmount().getCurrency()); | |||
// } | |||
// response.setTradeState(TradeState.valueOf(transaction.getTradeState().name())); | |||
// if (transaction.getTradeType() != null) { | |||
// response.setTradeType(TradeType.valueOf(transaction.getTradeType().name())); | |||
// } | |||
// return response; | |||
// } | |||
} |
@@ -1,8 +1,13 @@ | |||
package cn.com.taiji.ats.manager.comm; | |||
import cn.com.taiji.common.manager.AbstractManager; | |||
import cn.com.taiji.common.manager.net.http.ServiceHandleException; | |||
import cn.com.taiji.core.entity.dict.pay.TradeState; | |||
import cn.com.taiji.core.entity.dict.pay.TradeType; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsCreatPayOrderV3Request; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsCreatPayOrderV3Response; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsQueryPayResultRequest; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsQueryPayResultResponse; | |||
import cn.com.taiji.core.model.comm.protocol.valid.GlyServiceError; | |||
import com.wechat.pay.java.core.RSAAutoCertificateConfig; | |||
import com.wechat.pay.java.service.payments.app.AppServiceExtension; | |||
@@ -11,11 +16,9 @@ import com.wechat.pay.java.service.payments.h5.H5Service; | |||
import com.wechat.pay.java.service.payments.h5.model.H5Info; | |||
import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension; | |||
import com.wechat.pay.java.service.payments.jsapi.model.Payer; | |||
import com.wechat.pay.java.service.payments.model.Transaction; | |||
import com.wechat.pay.java.service.payments.nativepay.NativePayService; | |||
import com.wechat.pay.java.service.payments.nativepay.model.Amount; | |||
import com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest; | |||
import com.wechat.pay.java.service.payments.nativepay.model.PrepayResponse; | |||
import com.wechat.pay.java.service.payments.nativepay.model.SceneInfo; | |||
import com.wechat.pay.java.service.payments.nativepay.model.*; | |||
import org.springframework.stereotype.Service; | |||
/** | |||
@@ -25,21 +28,21 @@ import org.springframework.stereotype.Service; | |||
* @description: 普通商户微信支付工具类v3 | |||
*/ | |||
@Service | |||
public class WxPayV3 { | |||
public class WxPayV3 extends AbstractManager { | |||
//配置信息 | |||
public static RSAAutoCertificateConfig initConfig(AtsCreatPayOrderV3Request req) { | |||
public static RSAAutoCertificateConfig initConfig(String mchid,String apiV3Key,String privateKey,String serialNo) { | |||
return new RSAAutoCertificateConfig.Builder() | |||
.merchantId(req.getMchid())//商户号 | |||
.apiV3Key(req.getApiV3Key())//商户APIV3密钥 | |||
.privateKey(req.getPrivateKey())//商户API私钥 | |||
.merchantSerialNumber(req.getSerialNo())//商户证书序列号 | |||
.merchantId(mchid)//商户号 | |||
.apiV3Key(apiV3Key)//商户APIV3密钥 | |||
.privateKey(privateKey)//商户API私钥 | |||
.merchantSerialNumber(serialNo)//商户证书序列号 | |||
.build(); | |||
} | |||
// 响应 | |||
// 下单响应 | |||
public AtsCreatPayOrderV3Response getPrepayResponse(AtsCreatPayOrderV3Request req) throws ServiceHandleException { | |||
RSAAutoCertificateConfig config = initConfig(req); | |||
RSAAutoCertificateConfig config = initConfig(req.getMchid(), req.getApiV3Key(), req.getPrivateKey(), req.getSerialNo()); | |||
switch (req.getTradeType()) { | |||
case NATIVE: | |||
return getPrepayNativeResponse(req, config); | |||
@@ -54,7 +57,23 @@ public class WxPayV3 { | |||
} | |||
} | |||
//NATIVE | |||
//支付结果查询 | |||
public AtsQueryPayResultResponse queryPayResult(AtsQueryPayResultRequest req) throws ServiceHandleException { | |||
RSAAutoCertificateConfig config = initConfig(req.getMchid(), req.getApiV3Key(), req.getPrivateKey(), req.getSerialNo()); | |||
switch (req.getTradeType()){ | |||
case NATIVE: | |||
return getNativePayResult(req, config); | |||
case APP: | |||
return getAppPayResult(req, config); | |||
case JSAPI: | |||
return getJsapiPayResult(req, config); | |||
case MWEB: | |||
return getH5PayResult(req,config); | |||
default: | |||
throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("支付类型不匹配"); | |||
} | |||
} | |||
//NATIVE下单 | |||
public AtsCreatPayOrderV3Response getPrepayNativeResponse(AtsCreatPayOrderV3Request req, RSAAutoCertificateConfig config) { | |||
NativePayService service = new NativePayService.Builder().config(config).build(); | |||
PrepayRequest request = new PrepayRequest(); | |||
@@ -80,7 +99,7 @@ public class WxPayV3 { | |||
return orderV3Response; | |||
} | |||
//APP | |||
//APP下单 | |||
private AtsCreatPayOrderV3Response getPrepayAppResponse(AtsCreatPayOrderV3Request req, RSAAutoCertificateConfig config) { | |||
AppServiceExtension appService = new AppServiceExtension.Builder().config(config).build(); | |||
com.wechat.pay.java.service.payments.app.model.PrepayRequest request = new com.wechat.pay.java.service.payments.app.model.PrepayRequest(); | |||
@@ -114,7 +133,7 @@ public class WxPayV3 { | |||
return orderV3Response; | |||
} | |||
//JSAPI | |||
//JSAPI下单 | |||
private AtsCreatPayOrderV3Response getPrepayJsapiResponse(AtsCreatPayOrderV3Request req, RSAAutoCertificateConfig config) { | |||
JsapiServiceExtension jsapiService = new JsapiServiceExtension.Builder().config(config).build(); | |||
com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest request = new com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest(); | |||
@@ -149,7 +168,8 @@ public class WxPayV3 { | |||
orderV3Response.setExternalOrderNo(req.getOutTradeNo()); | |||
return orderV3Response; | |||
} | |||
//MWEB | |||
//MWEB下单 | |||
private AtsCreatPayOrderV3Response getPrepayMwebResponse(AtsCreatPayOrderV3Request req, RSAAutoCertificateConfig config) { | |||
H5Service h5Service = new H5Service.Builder().config(config).build(); | |||
com.wechat.pay.java.service.payments.h5.model.PrepayRequest request = new com.wechat.pay.java.service.payments.h5.model.PrepayRequest(); | |||
@@ -177,5 +197,65 @@ public class WxPayV3 { | |||
return orderV3Response; | |||
} | |||
//NATIVE支付结果查询 | |||
private AtsQueryPayResultResponse getNativePayResult(AtsQueryPayResultRequest req, RSAAutoCertificateConfig config) { | |||
NativePayService service = new NativePayService.Builder().config(config).build(); | |||
QueryOrderByOutTradeNoRequest request = new QueryOrderByOutTradeNoRequest(); | |||
request.setOutTradeNo(req.getExternalOrderNo()); | |||
request.setMchid(req.getMchid()); | |||
Transaction transaction = service.queryOrderByOutTradeNo(request); | |||
return getPayResult(transaction); | |||
} | |||
//APP支付结果查询 | |||
private AtsQueryPayResultResponse getAppPayResult(AtsQueryPayResultRequest req, RSAAutoCertificateConfig config) { | |||
AppServiceExtension appService = new AppServiceExtension.Builder().config(config).build(); | |||
com.wechat.pay.java.service.payments.app.model.QueryOrderByOutTradeNoRequest request = | |||
new com.wechat.pay.java.service.payments.app.model.QueryOrderByOutTradeNoRequest(); | |||
request.setMchid(req.getMchid()); | |||
request.setOutTradeNo(req.getExternalOrderNo()); | |||
Transaction transaction = appService.queryOrderByOutTradeNo(request); | |||
return getPayResult(transaction); | |||
} | |||
//JSAPI支付结果查询 | |||
private AtsQueryPayResultResponse getJsapiPayResult(AtsQueryPayResultRequest req, RSAAutoCertificateConfig config) { | |||
JsapiServiceExtension jsapiService = new JsapiServiceExtension.Builder().config(config).build(); | |||
com.wechat.pay.java.service.payments.jsapi.model.QueryOrderByOutTradeNoRequest request = | |||
new com.wechat.pay.java.service.payments.jsapi.model.QueryOrderByOutTradeNoRequest(); | |||
request.setMchid(req.getMchid()); | |||
request.setOutTradeNo(req.getExternalOrderNo()); | |||
Transaction transaction = jsapiService.queryOrderByOutTradeNo(request); | |||
return getPayResult(transaction); | |||
} | |||
// H5支付订单查询 | |||
private AtsQueryPayResultResponse getH5PayResult(AtsQueryPayResultRequest req, RSAAutoCertificateConfig config) { | |||
H5Service h5Service = new H5Service.Builder().config(config).build(); | |||
com.wechat.pay.java.service.payments.h5.model.QueryOrderByOutTradeNoRequest request = | |||
new com.wechat.pay.java.service.payments.h5.model.QueryOrderByOutTradeNoRequest(); | |||
request.setOutTradeNo(req.getExternalOrderNo()); | |||
request.setMchid(req.getMchid()); | |||
Transaction transaction = h5Service.queryOrderByOutTradeNo(request); | |||
return getPayResult(transaction); | |||
} | |||
private AtsQueryPayResultResponse getPayResult(Transaction transaction) { | |||
AtsQueryPayResultResponse response = copyProperties(transaction, new AtsQueryPayResultResponse()); | |||
if (transaction.getPayer() != null) { | |||
response.setOpenid(transaction.getPayer().getOpenid()); | |||
} | |||
if (transaction.getAmount() != null) { | |||
response.setTotal(transaction.getAmount().getTotal()); | |||
response.setPayerTotal(transaction.getAmount().getPayerTotal()); | |||
response.setCurrency(transaction.getAmount().getCurrency()); | |||
} | |||
response.setTradeState(TradeState.valueOf(transaction.getTradeState().name())); | |||
if (transaction.getTradeType() != null) { | |||
response.setTradeType(TradeType.valueOf(transaction.getTradeType().name())); | |||
} | |||
return response; | |||
} | |||
} |
@@ -2,13 +2,11 @@ package cn.com.taiji.ats.manager.handler; | |||
import cn.com.taiji.ats.manager.weixin.CreatePayOrderV2Manager; | |||
import cn.com.taiji.ats.manager.weixin.CreatePayOrderV3Manager; | |||
import cn.com.taiji.ats.manager.weixin.QueryPayResultManager; | |||
import cn.com.taiji.core.model.comm.protocol.AbstractSignTypeRequest; | |||
import cn.com.taiji.core.model.comm.protocol.AbstractSignTypeResponse; | |||
import cn.com.taiji.core.model.comm.protocol.SignJsonRequest; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsCreatPayOrderV2Request; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsCreatPayOrderV3Request; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsServiceCmd; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsServiceType; | |||
import cn.com.taiji.core.model.comm.protocol.ats.*; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
import com.zgglyun.common.model.AbstractHttpRequestInfo; | |||
@@ -35,6 +33,8 @@ public class WinXinServiceHandler extends AbstractAtsServiceHandler<AtsServiceCm | |||
private CreatePayOrderV2Manager createPayOrderV2Manager; | |||
@Autowired | |||
private CreatePayOrderV3Manager createPayOrderV3Manager; | |||
@Autowired | |||
private QueryPayResultManager queryPayResultManager; | |||
@Override | |||
protected <T extends AbstractSignTypeRequest<?>> AbstractSignTypeResponse handleInternal(T request, | |||
@@ -45,6 +45,8 @@ public class WinXinServiceHandler extends AbstractAtsServiceHandler<AtsServiceCm | |||
return createPayOrderV2Manager.serviceHandle((AtsCreatPayOrderV2Request) request); | |||
case CREATEPAYORDERV3: | |||
return createPayOrderV3Manager.serviceHandle((AtsCreatPayOrderV3Request) request); | |||
case QUERYPAYRESULT: | |||
return queryPayResultManager.serviceHandle((AtsQueryPayResultRequest) request); | |||
default: | |||
throw FileProtocolSystemError.NOT_SUPPORT.toHandleException(jsonReq.getIfCode()); | |||
} |
@@ -26,7 +26,7 @@ import java.util.Base64; | |||
* @Filename:CreatePayOrderV3Manager | |||
* @description: | |||
*/ | |||
@Service("createPayOrderV3Manager") | |||
@Service | |||
public class CreatePayOrderV3Manager extends AbstractManager { | |||
@Autowired | |||
private WxPayService wxPayService; |
@@ -0,0 +1,27 @@ | |||
package cn.com.taiji.ats.manager.weixin; | |||
import cn.com.taiji.ats.manager.comm.WxPayV3; | |||
import cn.com.taiji.common.manager.AbstractManager; | |||
import cn.com.taiji.common.manager.net.http.ServiceHandleException; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsQueryPayResultRequest; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsQueryPayResultResponse; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
/** | |||
* @Author:ChenChao | |||
* @Date:2025/5/14 17:10 | |||
* @Filename:QueryPayResultManager | |||
* @description: 支付结果查询 | |||
*/ | |||
@Service | |||
public class QueryPayResultManager extends AbstractManager { | |||
@Autowired | |||
private WxPayV3 wxPayV3; | |||
public AtsQueryPayResultResponse serviceHandle(AtsQueryPayResultRequest req) throws ServiceHandleException { | |||
//格式 | |||
req.validate(); | |||
return wxPayV3.queryPayResult(req); | |||
} | |||
} |
@@ -0,0 +1,119 @@ | |||
package cn.com.taiji.ats.web; | |||
import cn.com.taiji.ats.manager.weixin.CreatePayOrderV3Manager; | |||
import cn.com.taiji.ats.manager.weixin.CreatePayOrderV3Manager2; | |||
import cn.com.taiji.ats.manager.weixin.QueryPayResultManager; | |||
import cn.com.taiji.common.manager.net.http.ServiceHandleException; | |||
import cn.com.taiji.core.entity.dict.pay.TradeType; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsCreatPayOrderV3Request; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsCreatPayOrderV3Response; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsQueryPayResultRequest; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AtsQueryPayResultResponse; | |||
import com.google.zxing.BarcodeFormat; | |||
import com.google.zxing.EncodeHintType; | |||
import com.google.zxing.MultiFormatWriter; | |||
import com.google.zxing.WriterException; | |||
import com.google.zxing.common.BitMatrix; | |||
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Controller; | |||
import org.springframework.web.bind.annotation.*; | |||
import javax.imageio.ImageIO; | |||
import javax.servlet.http.HttpServletResponse; | |||
import java.awt.*; | |||
import java.awt.image.BufferedImage; | |||
import java.net.InetAddress; | |||
import java.util.HashMap; | |||
import java.util.Map; | |||
import static com.zgglyun.common.model.SignOperation.logger; | |||
/** | |||
* @Author:ChenChao | |||
* @Date:2025/5/12 20:50 | |||
* @Filename:TestController | |||
* @description: | |||
*/ | |||
@RestController | |||
public class TestController { | |||
@Autowired | |||
private CreatePayOrderV3Manager2 createPayOrderV3Manager2; | |||
@RequestMapping(value = "/common/test", method = {RequestMethod.GET}) | |||
public AtsCreatPayOrderV3Response test(@RequestBody AtsCreatPayOrderV3Request request) { | |||
// request.setApiV3Key("fe24336ea45045adb707dc2c2310416a"); | |||
// request.setAppid("wxa2d9acdd1054e69b"); | |||
// request.setMchid("1608930045");//1535705621 | |||
// request.setPrivateKey("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCvuFuIL0h5RfI0wNYoWhVPXdKYEYhCDsYK8prRjG8rO97x6BbcOtmESa1rsLa1vgRCgsJEBOcWEq53xikstFstNlr9UBrruoNNt0kP9Wv/X/h8lVO+WygydoynClLtBV19HB2ld/zdBy9ppD47jdQz9dPgGadwi0GxlVIRkBvWb/8SFYJGEsL8Uh3MFSjTZ6uED3H7QnCRuFIHsD5gPhu7y9fZpDTnUZQm2iBt1fOfk8ki5mIZjnb2ZCNxl6ol/6jz5nMEI+E5JXQK0aRfxtkKSYgNNi2P4kMQgHHH/YK2xsiy9SSkyIAdGPwjzK5VCMtar5bHROasCThW6sejgh8JAgMBAAECggEBAKwf5mksB83jWjGagyzbsOwhd1xGMDakyhGHO2fwLCUpbGWBdoMbkl4m3Z0TaKX2D64m76w5MTNJ8WSZ01NbB8Tt7YscoIIwHNZPp13ehX+NvpYqn/Fi0ak8vuIRFtHd44ndtJyVQDgyBZtxqxQjBa4wKu7lskJn5l3RaqaRhvMw+h5yG94584UITU51739oM2luNcVYAYaEQJUed5c3VHbuvkG6d5fQS5x9gP1id6WyhXF/tHY8fkhYQfDW1CucGErYEzu97fwt6n84+xd9UjhzkAm1SLEpd1+KkSuxduYCwW9JY6RIL/qK2+utM6cbAirHcozMhedPBaoxrdARyEECgYEA1b10f2mDYz80Rq9DxyxDk8xbT3kj5OSVaTUt0C9+LFfusedmqGugrGjjCHx/NF1mNbR6NKIwtvcqAqZI2gXqKpMjhx4jfnw/ubfbxUK7wDW84hMOwGKga6bOvWzUH6EGXJmJEeO8RC65ZqqcROnYgCnuD5vgvStrNuhjtEX8zS0CgYEA0naCHtrAFPKmOq9AogbA3YFeGPSPzaPkwF1eN+8RNR6XV1xsoZv+GFunYTX2fmaFpUfVCFstPY+jfgY2Xy50c4T8KXBPLW/KN6XQEvPrbVktFUNle5pSknO4Pdyolk5jOM7nMEHOX9/IX4Q5C0YXc+QCMExuBm0vXVJL9e2wWs0CgYEAzZmFc35KjXBh19CF0RRKGOTNvL/ZgDdFZcNqw0S8COm4yNa/kCifkNj/8szXC8cAJ47osrKFS6qrdYsArwBbhQKufS3HlMbuAbbTJ4gO1FCc1ZbhbLwydfsqCVqjHZ2mYfKqwFOhaLDNVO2ujjenM3mh7s/RugYHBvU521IrYC0CgYAP700WzPUyINUZKF+6ZMyBeOQI+6tPpJMTRX52ubER1oka4jKPYeIxMe9QWueY1mZUB0ZH5a9dM9zrE8lWF4xVmsIE2S4FgKtM308LwFAY7WGOdJXgb+TEleJjPKu/BZxZlsDGVJUtiSIAqWAwTFRGQAMyaPcDoYyugiaiLibmGQKBgAoEqrGCfpiP2H64KkZWhE0Nh4pDdz6yWu15RXEJOjlE/PB/JgonoZFcLK+bd6aR86ij7Q0yO/UKCokhH68sjEgj3px+XVHouFIr9eDnj3leTRedchVTxfqhxcXQkLxqY4/AISYjB6koOU7SP9tm/Ad4wbUAz9ocEbVl6zehN0mW"); | |||
// request.setSerialNo("4ac875f8eeab3e7e4f10ce9d33e78c2c318e51e8"); | |||
request.setTradeType(TradeType.NATIVE); | |||
// request.setCreateType(1); | |||
request.setDescription("测试"); | |||
request.setOutTradeNo("123456789"); | |||
request.setNotifyUrl("https://skx.mynatapp.cc/qtucpaymgt/wxv3/notify/"); | |||
request.setTotal(1); | |||
request.setCurrency("CNY"); | |||
request.setOpenid("oQj1Z5QX3YLzRl5Z0JJYlXQ_1HY8"); | |||
AtsCreatPayOrderV3Response orderV3Response = null; | |||
try { | |||
orderV3Response = createPayOrderV3Manager2.serviceHandle(request); | |||
logger.info(orderV3Response.toJson()); | |||
} catch (ServiceHandleException e) { | |||
logger.error(e.getMessage()); | |||
} | |||
System.out.println("234567"); | |||
return orderV3Response; | |||
} | |||
@Autowired | |||
private QueryPayResultManager queryPayResultManager; | |||
@RequestMapping(value = "/common/test2", method = {RequestMethod.GET}) | |||
public AtsQueryPayResultResponse test(@RequestBody AtsQueryPayResultRequest request) { | |||
request.setTradeType(TradeType.NATIVE); | |||
request.setExternalOrderNo("123456789"); | |||
AtsQueryPayResultResponse orderV3Response = null; | |||
try { | |||
orderV3Response = queryPayResultManager.serviceHandle(request); | |||
logger.info(orderV3Response.toJson()); | |||
} catch (ServiceHandleException e) { | |||
logger.error(e.getMessage()); | |||
} | |||
System.out.println("234567"); | |||
return orderV3Response; | |||
} | |||
@GetMapping("qrCode") | |||
public void qrcode(HttpServletResponse response) throws Exception { | |||
String data = "weixin://wxpay/bizpayurl?pr=OeLKIGGz1"; | |||
BufferedImage image = createImage(data,200,200); | |||
ImageIO.write(image, "png", response.getOutputStream()); | |||
} | |||
public static BufferedImage createImage(String data, int width, int height) { | |||
Map<EncodeHintType, Object> hints = new HashMap<>(); | |||
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符编码 | |||
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 错误纠正级别 | |||
hints.put(EncodeHintType.MARGIN, 1); // 二维码边距 | |||
MultiFormatWriter writer = new MultiFormatWriter(); | |||
BitMatrix bitMatrix = null; | |||
try { | |||
bitMatrix = writer.encode(data, BarcodeFormat.QR_CODE, width, height, hints); | |||
} catch (WriterException e) { | |||
throw new RuntimeException(e); | |||
} | |||
// 创建BufferedImage对象来表示QR码 | |||
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); | |||
for (int x = 0; x < width; x++) { | |||
for (int y = 0; y < height; y++) { | |||
image.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB()); | |||
} | |||
} | |||
return image; | |||
} | |||
} |