@@ -1,10 +1,14 @@ | |||
package cn.com.taiji.core.model.comm.protocol.ats.weiXin; | |||
import cn.com.taiji.core.model.comm.protocol.ats.AbstractAtsRequest; | |||
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/17 11:30 | |||
@@ -18,8 +22,32 @@ public class AtsQueryPayResultV2Request extends AbstractAtsRequest<AtsQueryPayRe | |||
public AtsQueryPayResultV2Request() { | |||
super(WeiXinServiceCmd.QUERYPAYRESULTV2); | |||
} | |||
/** | |||
* 1单独下单url-普通商户下单 | |||
* 2服务商下单 | |||
* 3合并下单url | |||
* 目前只提供单独下单和服务商下单 | |||
*/ | |||
@IntegerConstant(values = "1,2") | |||
@NotNull | |||
private Integer createType; | |||
@NotBlank | |||
private String outTradeNo; //商户订单号 | |||
@NotBlank | |||
private String appId;//服务商的APPID | |||
@NotBlank | |||
private String mchId; | |||
private String subAppId; | |||
private String subMchId; | |||
@NotBlank | |||
private String mchKey; | |||
@Override | |||
protected void validate(ErrorMsgBuilder builder) { | |||
if (createType == 2){ | |||
builder.validFieldNotBlank("subMchId", subMchId); | |||
} | |||
} | |||
} |
@@ -1,5 +1,7 @@ | |||
package cn.com.taiji.core.model.comm.protocol.ats.weiXin; | |||
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.AbstractAtsResponse; | |||
import lombok.Getter; | |||
import lombok.Setter; | |||
@@ -13,4 +15,34 @@ import lombok.Setter; | |||
@Getter | |||
@Setter | |||
public class AtsQueryPayResultV2Response extends AbstractAtsResponse { | |||
private String openid; //是 | |||
private String subOpenid; //否 | |||
private TradeType tradetype;//交易类型 否 | |||
private TradeState tradeState;//交易状态 是 | |||
private String bankType; //付款银行 是 | |||
private String detail;//商品详情 否 | |||
private Integer totalFee;//标价金额 单位分 是 | |||
private String feeType;//标价币种,默认CNY //否 | |||
private Integer settlementTotalFee;//应结订单金额 否 | |||
private Integer cashFee;//现金支付金额 是 | |||
private String cashFeeType;//现金支付货币类型 否 | |||
private String transactionId;//微信支付订单号 是 | |||
private String outTradeNo; //商户订单号 是 | |||
private String timeEnd;//支付完成时间 是 | |||
private String tradeStateDesc;// 交易状态描述 是 | |||
} |
@@ -17,7 +17,7 @@ public class WechatConfig { | |||
} | |||
//配置V2信息 | |||
public WxPayConfig initV2Config(String appId,String mchId,String mchKey,String subAppId,String subMchId,String notifyUrl) { | |||
public WxPayConfig initV2Config(String appId,String mchId,String mchKey,String subAppId,String subMchId) { | |||
WxPayConfig wxPayConfig = new WxPayConfig(); | |||
wxPayConfig.setAppId(appId); | |||
wxPayConfig.setMchId(mchId); | |||
@@ -25,7 +25,7 @@ public class WechatConfig { | |||
wxPayConfig.setSubAppId(subAppId); | |||
wxPayConfig.setSubMchId(subMchId); | |||
wxPayConfig.setSignType(HMAC_SHA256); | |||
wxPayConfig.setNotifyUrl(notifyUrl); | |||
// wxPayConfig.setNotifyUrl(notifyUrl); | |||
return wxPayConfig; | |||
} | |||
@@ -1,12 +1,9 @@ | |||
package cn.com.taiji.ats.manager.handler; | |||
import cn.com.taiji.ats.manager.handler.wx.WxMessageManager; | |||
import cn.com.taiji.ats.manager.weixin.CreatePayOrderV2Manager; | |||
import cn.com.taiji.ats.manager.weixin.CreatePayOrderV3Manager; | |||
import cn.com.taiji.ats.manager.weixin.QueryPayResultV3Manager; | |||
import cn.com.taiji.ats.manager.weixin.*; | |||
import cn.com.taiji.common.manager.net.http.ServiceHandleException; | |||
import cn.com.taiji.common.model.file.FileProtocolSystemError; | |||
import cn.com.taiji.ats.manager.weixin.VehicleUserStateManager; | |||
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; | |||
@@ -35,6 +32,8 @@ public class WinXinServiceHandler extends AbstractAtsServiceHandler<WeiXinServic | |||
@Autowired | |||
private CreatePayOrderV2Manager createPayOrderV2Manager; | |||
@Autowired | |||
private QueryPayResultV2Manager queryPayResultV2Manager; | |||
@Autowired | |||
private CreatePayOrderV3Manager createPayOrderV3Manager; | |||
@Autowired | |||
private QueryPayResultV3Manager queryPayResultV3Manager; | |||
@@ -50,6 +49,8 @@ public class WinXinServiceHandler extends AbstractAtsServiceHandler<WeiXinServic | |||
switch (cmd) { | |||
case CREATEPAYORDERV2: | |||
return createPayOrderV2Manager.serviceHandle((AtsCreatPayOrderV2Request) request); | |||
case QUERYPAYRESULTV2: | |||
return queryPayResultV2Manager.serviceHandle((AtsQueryPayResultV2Request) request); | |||
case CREATEPAYORDERV3: | |||
return createPayOrderV3Manager.serviceHandle((AtsCreatPayOrderV3Request) request); | |||
case QUERYPAYRESULTV3: |
@@ -31,12 +31,12 @@ public class CreatePayOrderV2Manager extends AbstractManager { | |||
private WechatConfig wechatConfig; | |||
public AtsCreatPayOrderV2Response serviceHandle(AtsCreatPayOrderV2Request req) throws ServiceHandleException{ | |||
logger.info("微信支付V2下单请求参数{}",req.toJson()); | |||
//格式校验 | |||
req.validate(); | |||
logger.info("微信支付下单请求参数:{}", req.toJson()); | |||
//初始化配置信息 | |||
WxPayConfig wxPayConfig = wechatConfig.initV2Config(req.getAppId(), req.getMchId(), req.getMchKey(), | |||
req.getSubAppId(), req.getSubMchId(), req.getNotifyUrl()); | |||
req.getSubAppId(), req.getSubMchId()); | |||
//配置信息 | |||
wxPayService.setConfig(wxPayConfig); | |||
WxPayUnifiedOrderRequest wxRequest = copyProperties(req, new WxPayUnifiedOrderRequest()); |
@@ -28,7 +28,7 @@ public class CreatePayOrderV3Manager extends AbstractManager { | |||
@Autowired | |||
private WechatConfig wechatConfig; | |||
public AtsCreatPayOrderV3Response serviceHandle(AtsCreatPayOrderV3Request req) throws ServiceHandleException { | |||
logger.info("微信支付下单{}",req.toJson()); | |||
logger.info("微信支付V3下单请求参数{}",req.toJson()); | |||
//格式校验 | |||
req.validate(); | |||
//初始化配置信息 |
@@ -0,0 +1,53 @@ | |||
package cn.com.taiji.ats.manager.weixin; | |||
import cn.com.taiji.ats.config.WechatConfig; | |||
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.weiXin.AtsQueryPayResultV2Request; | |||
import cn.com.taiji.core.model.comm.protocol.ats.weiXin.AtsQueryPayResultV2Response; | |||
import cn.com.taiji.core.model.comm.protocol.valid.GlyServiceError; | |||
import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryRequest; | |||
import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult; | |||
import com.github.binarywang.wxpay.config.WxPayConfig; | |||
import com.github.binarywang.wxpay.exception.WxPayException; | |||
import com.github.binarywang.wxpay.service.WxPayService; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
/** | |||
* @Author:ChenChao | |||
* @Date:2025/5/17 11:48 | |||
* @Filename:QueryPayResultV2Manager | |||
* @description: | |||
*/ | |||
@Service | |||
public class QueryPayResultV2Manager extends AbstractManager { | |||
@Autowired | |||
private WxPayService wxPayService; | |||
@Autowired | |||
private WechatConfig wechatConfig; | |||
public AtsQueryPayResultV2Response serviceHandle(AtsQueryPayResultV2Request req) throws ServiceHandleException { | |||
logger.info("微信支付V2查询支付结果请求参数{}",req.toJson()); | |||
WxPayConfig wxPayConfig = wechatConfig.initV2Config(req.getAppId(), req.getMchId(), req.getMchKey(), req.getSubAppId(), req.getSubMchId()); | |||
wxPayService.setConfig(wxPayConfig); | |||
WxPayOrderQueryRequest request = copyProperties(req, new WxPayOrderQueryRequest()); | |||
WxPayOrderQueryResult wxPayOrderQueryResult = null; | |||
try { | |||
wxPayOrderQueryResult = wxPayService.queryOrder(request); | |||
} catch (WxPayException e) { | |||
logger.error("微信支付结果V2查询失败:{}", e.getMessage()); | |||
throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException(e.getMessage()); | |||
} | |||
AtsQueryPayResultV2Response response = copyProperties(wxPayOrderQueryResult, new AtsQueryPayResultV2Response()); | |||
response.setTradeState(TradeState.valueOf(wxPayOrderQueryResult.getTradeState())); | |||
if (hasText(wxPayOrderQueryResult.getTradeType())) { | |||
response.setTradetype(TradeType.valueOf(wxPayOrderQueryResult.getTradeType())); | |||
} | |||
return response; | |||
} | |||
} |
@@ -26,6 +26,7 @@ public class QueryPayResultV3Manager extends AbstractManager { | |||
@Autowired | |||
private WechatConfig wechatConfig; | |||
public AtsQueryPayResultV3Response serviceHandle(AtsQueryPayResultV3Request req) throws ServiceHandleException { | |||
logger.info("微信支付V3查询支付结果请求参数{}",req.toJson()); | |||
//格式 | |||
req.validate(); | |||
//配置支付信息 |
@@ -27,6 +27,7 @@ public class VehicleUserStateManager extends AbstractManager { | |||
private static final String baseUrl = "https://api.mch.weixin.qq.com/vehicle/partnerpay/querystate"; | |||
public AtsVehicleUserStateResponse serviceHandle(AtsVehicleUserStateRequest request) throws ServiceHandleException { | |||
logger.info("微信支付车主签约状态查询请求参数{}",request.toJson()); | |||
//生成xml字符串 | |||
String reqXml = getXmlString(request); | |||
String resXml = postData(baseUrl, reqXml, "text/xml"); |
@@ -99,6 +99,7 @@ public class TestController { | |||
} | |||
//服务商 codeUrl = weixin://wxpay/bizpayurl?pr=14g4kOez1 | |||
//v2 普通商户 codeUrl = weixin://wxpay/bizpayurl?pr=SNBYt2Kz3 | |||
//V2 普通商户weixin://wxpay/bizpayurl?pr=Ne0lOJSz3 | |||
@GetMapping("qrCode") | |||
public void qrcode(HttpServletResponse response,@RequestBody TestModel model) throws Exception { | |||
String data = "weixin://wxpay/bizpayurl?pr=OeLKIGGz1"; |