package cn.com.taiji.core.model.comm.protocol.ats.weiXin; | 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.ats.AbstractAtsRequest; | ||||
import cn.com.taiji.core.model.comm.protocol.constraint.IntegerConstant; | |||||
import cn.com.taiji.core.model.comm.protocol.valid.ErrorMsgBuilder; | import cn.com.taiji.core.model.comm.protocol.valid.ErrorMsgBuilder; | ||||
import lombok.Getter; | import lombok.Getter; | ||||
import lombok.Setter; | import lombok.Setter; | ||||
import javax.validation.constraints.NotBlank; | |||||
import javax.validation.constraints.NotNull; | |||||
/** | /** | ||||
* @Author:ChenChao | * @Author:ChenChao | ||||
* @Date:2025/5/17 11:30 | * @Date:2025/5/17 11:30 | ||||
public AtsQueryPayResultV2Request() { | public AtsQueryPayResultV2Request() { | ||||
super(WeiXinServiceCmd.QUERYPAYRESULTV2); | 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 | @Override | ||||
protected void validate(ErrorMsgBuilder builder) { | protected void validate(ErrorMsgBuilder builder) { | ||||
if (createType == 2){ | |||||
builder.validFieldNotBlank("subMchId", subMchId); | |||||
} | |||||
} | } | ||||
} | } |
package cn.com.taiji.core.model.comm.protocol.ats.weiXin; | 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 cn.com.taiji.core.model.comm.protocol.ats.AbstractAtsResponse; | ||||
import lombok.Getter; | import lombok.Getter; | ||||
import lombok.Setter; | import lombok.Setter; | ||||
@Getter | @Getter | ||||
@Setter | @Setter | ||||
public class AtsQueryPayResultV2Response extends AbstractAtsResponse { | 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;// 交易状态描述 是 | |||||
} | } |
} | } | ||||
//配置V2信息 | //配置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 wxPayConfig = new WxPayConfig(); | ||||
wxPayConfig.setAppId(appId); | wxPayConfig.setAppId(appId); | ||||
wxPayConfig.setMchId(mchId); | wxPayConfig.setMchId(mchId); | ||||
wxPayConfig.setSubAppId(subAppId); | wxPayConfig.setSubAppId(subAppId); | ||||
wxPayConfig.setSubMchId(subMchId); | wxPayConfig.setSubMchId(subMchId); | ||||
wxPayConfig.setSignType(HMAC_SHA256); | wxPayConfig.setSignType(HMAC_SHA256); | ||||
wxPayConfig.setNotifyUrl(notifyUrl); | |||||
// wxPayConfig.setNotifyUrl(notifyUrl); | |||||
return wxPayConfig; | return wxPayConfig; | ||||
} | } | ||||
package cn.com.taiji.ats.manager.handler; | package cn.com.taiji.ats.manager.handler; | ||||
import cn.com.taiji.ats.manager.handler.wx.WxMessageManager; | 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.manager.net.http.ServiceHandleException; | ||||
import cn.com.taiji.common.model.file.FileProtocolSystemError; | 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.AbstractSignTypeRequest; | ||||
import cn.com.taiji.core.model.comm.protocol.AbstractSignTypeResponse; | 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.SignJsonRequest; | ||||
@Autowired | @Autowired | ||||
private CreatePayOrderV2Manager createPayOrderV2Manager; | private CreatePayOrderV2Manager createPayOrderV2Manager; | ||||
@Autowired | @Autowired | ||||
private QueryPayResultV2Manager queryPayResultV2Manager; | |||||
@Autowired | |||||
private CreatePayOrderV3Manager createPayOrderV3Manager; | private CreatePayOrderV3Manager createPayOrderV3Manager; | ||||
@Autowired | @Autowired | ||||
private QueryPayResultV3Manager queryPayResultV3Manager; | private QueryPayResultV3Manager queryPayResultV3Manager; | ||||
switch (cmd) { | switch (cmd) { | ||||
case CREATEPAYORDERV2: | case CREATEPAYORDERV2: | ||||
return createPayOrderV2Manager.serviceHandle((AtsCreatPayOrderV2Request) request); | return createPayOrderV2Manager.serviceHandle((AtsCreatPayOrderV2Request) request); | ||||
case QUERYPAYRESULTV2: | |||||
return queryPayResultV2Manager.serviceHandle((AtsQueryPayResultV2Request) request); | |||||
case CREATEPAYORDERV3: | case CREATEPAYORDERV3: | ||||
return createPayOrderV3Manager.serviceHandle((AtsCreatPayOrderV3Request) request); | return createPayOrderV3Manager.serviceHandle((AtsCreatPayOrderV3Request) request); | ||||
case QUERYPAYRESULTV3: | case QUERYPAYRESULTV3: |
private WechatConfig wechatConfig; | private WechatConfig wechatConfig; | ||||
public AtsCreatPayOrderV2Response serviceHandle(AtsCreatPayOrderV2Request req) throws ServiceHandleException{ | public AtsCreatPayOrderV2Response serviceHandle(AtsCreatPayOrderV2Request req) throws ServiceHandleException{ | ||||
logger.info("微信支付V2下单请求参数{}",req.toJson()); | |||||
//格式校验 | //格式校验 | ||||
req.validate(); | req.validate(); | ||||
logger.info("微信支付下单请求参数:{}", req.toJson()); | |||||
//初始化配置信息 | //初始化配置信息 | ||||
WxPayConfig wxPayConfig = wechatConfig.initV2Config(req.getAppId(), req.getMchId(), req.getMchKey(), | WxPayConfig wxPayConfig = wechatConfig.initV2Config(req.getAppId(), req.getMchId(), req.getMchKey(), | ||||
req.getSubAppId(), req.getSubMchId(), req.getNotifyUrl()); | |||||
req.getSubAppId(), req.getSubMchId()); | |||||
//配置信息 | //配置信息 | ||||
wxPayService.setConfig(wxPayConfig); | wxPayService.setConfig(wxPayConfig); | ||||
WxPayUnifiedOrderRequest wxRequest = copyProperties(req, new WxPayUnifiedOrderRequest()); | WxPayUnifiedOrderRequest wxRequest = copyProperties(req, new WxPayUnifiedOrderRequest()); |
@Autowired | @Autowired | ||||
private WechatConfig wechatConfig; | private WechatConfig wechatConfig; | ||||
public AtsCreatPayOrderV3Response serviceHandle(AtsCreatPayOrderV3Request req) throws ServiceHandleException { | public AtsCreatPayOrderV3Response serviceHandle(AtsCreatPayOrderV3Request req) throws ServiceHandleException { | ||||
logger.info("微信支付下单{}",req.toJson()); | |||||
logger.info("微信支付V3下单请求参数{}",req.toJson()); | |||||
//格式校验 | //格式校验 | ||||
req.validate(); | req.validate(); | ||||
//初始化配置信息 | //初始化配置信息 |
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; | |||||
} | |||||
} |
@Autowired | @Autowired | ||||
private WechatConfig wechatConfig; | private WechatConfig wechatConfig; | ||||
public AtsQueryPayResultV3Response serviceHandle(AtsQueryPayResultV3Request req) throws ServiceHandleException { | public AtsQueryPayResultV3Response serviceHandle(AtsQueryPayResultV3Request req) throws ServiceHandleException { | ||||
logger.info("微信支付V3查询支付结果请求参数{}",req.toJson()); | |||||
//格式 | //格式 | ||||
req.validate(); | req.validate(); | ||||
//配置支付信息 | //配置支付信息 |
private static final String baseUrl = "https://api.mch.weixin.qq.com/vehicle/partnerpay/querystate"; | private static final String baseUrl = "https://api.mch.weixin.qq.com/vehicle/partnerpay/querystate"; | ||||
public AtsVehicleUserStateResponse serviceHandle(AtsVehicleUserStateRequest request) throws ServiceHandleException { | public AtsVehicleUserStateResponse serviceHandle(AtsVehicleUserStateRequest request) throws ServiceHandleException { | ||||
logger.info("微信支付车主签约状态查询请求参数{}",request.toJson()); | |||||
//生成xml字符串 | //生成xml字符串 | ||||
String reqXml = getXmlString(request); | String reqXml = getXmlString(request); | ||||
String resXml = postData(baseUrl, reqXml, "text/xml"); | String resXml = postData(baseUrl, reqXml, "text/xml"); |
} | } | ||||
//服务商 codeUrl = weixin://wxpay/bizpayurl?pr=14g4kOez1 | //服务商 codeUrl = weixin://wxpay/bizpayurl?pr=14g4kOez1 | ||||
//v2 普通商户 codeUrl = weixin://wxpay/bizpayurl?pr=SNBYt2Kz3 | //v2 普通商户 codeUrl = weixin://wxpay/bizpayurl?pr=SNBYt2Kz3 | ||||
//V2 普通商户weixin://wxpay/bizpayurl?pr=Ne0lOJSz3 | |||||
@GetMapping("qrCode") | @GetMapping("qrCode") | ||||
public void qrcode(HttpServletResponse response,@RequestBody TestModel model) throws Exception { | public void qrcode(HttpServletResponse response,@RequestBody TestModel model) throws Exception { | ||||
String data = "weixin://wxpay/bizpayurl?pr=OeLKIGGz1"; | String data = "weixin://wxpay/bizpayurl?pr=OeLKIGGz1"; |