From f72ece7ee6db3ae264c27edb591ab02e2e520e4b Mon Sep 17 00:00:00 2001 From: zhengfangyuan Date: Sat, 20 Aug 2022 20:50:23 +0800 Subject: [PATCH] fix pay v3 --- .../controller/callback/WxPayController.java | 18 +- .../com/iformall/domain/po/WxPayAccount.java | 6 +- .../main/java/com/iformall/pay/WxPayV3.java | 13 + .../service/pay/PayServiceFactory.java | 4 +- .../wx/v3/WxRefundV3AdapterService.java | 290 ++---------------- .../wx/v3/entity/V3PayRefundAmountReq.java | 11 + .../wx/v3/entity/V3PayRefundGoodsReq.java | 14 + .../refund/wx/v3/entity/V3PayRefundReq.java | 17 + .../share/wx/v3/WxPayShareV3Service.java | 13 +- 9 files changed, 95 insertions(+), 291 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundAmountReq.java create mode 100644 mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundGoodsReq.java create mode 100644 mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundReq.java diff --git a/mallinkCallback/src/main/java/com/iformall/controller/callback/WxPayController.java b/mallinkCallback/src/main/java/com/iformall/controller/callback/WxPayController.java index e4f11512c..2e1ff6e87 100644 --- a/mallinkCallback/src/main/java/com/iformall/controller/callback/WxPayController.java +++ b/mallinkCallback/src/main/java/com/iformall/controller/callback/WxPayController.java @@ -293,21 +293,21 @@ public class WxPayController extends BaseController { } catch (BizMessageException e) { logger.error("share wxpay, notify error, req: " + xml + ", e:" + e.getLocalizedMessage()); SortedMap resultMap = new TreeMap(); - resultMap.put("return_code", "FAIL"); - resultMap.put("return_msg", e.getMessage()); - return XmlUtil.getRequestXml(resultMap); + resultMap.put("code", "FAIL"); + resultMap.put("message", e.getMessage()); + return JSON.toJSONString(resultMap); } catch (MallinkException e) { logger.error("refund wxpay, notify error, req: " + xml + ", e:" +e.getLocalizedMessage()); SortedMap resultMap = new TreeMap(); - resultMap.put("return_code", "FAIL"); - resultMap.put("return_msg", e.getMessage()); - return XmlUtil.getRequestXml(resultMap); + resultMap.put("code", "FAIL"); + resultMap.put("message", e.getMessage()); + return JSON.toJSONString(resultMap); } catch (Exception e) { logger.error("refund wxpay, order create error, req: " + xml + ", e: " + e.getMessage()); SortedMap resultMap = new TreeMap(); - resultMap.put("return_code", "FAIL"); - resultMap.put("return_msg", e.getMessage()); - return XmlUtil.getRequestXml(resultMap); + resultMap.put("code", "FAIL"); + resultMap.put("message", e.getMessage()); + return JSON.toJSONString(resultMap); } } diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxPayAccount.java b/mallinkService/src/main/java/com/iformall/domain/po/WxPayAccount.java index 84688841a..8f7b1e1ea 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxPayAccount.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxPayAccount.java @@ -59,19 +59,19 @@ public class WxPayAccount extends TenantEntity { public String getPayNotifyV3Url() { - return notifyUrl + "/pay/v3"; + return notifyUrl + "/pay/v3/"+this.getTenantId(); } public String getPayNotifyUrl() { return notifyUrl + "/pay"; } public String getRefundNotifyV3Url() { - return notifyUrl + "/refund/v3"; + return notifyUrl + "/refund/v3/"+this.getTenantId(); } public String getRefundNotifyUrl() { return notifyUrl + "/refund"; } public String getSubsidyNotifyV3Url() { - return notifyUrl + "/subsidyPay/v3"; + return notifyUrl + "/subsidyPay/v3/"+this.getTenantId(); } public String getSubsidyNotifyUrl() { return notifyUrl + "/subsidyPay"; diff --git a/mallinkService/src/main/java/com/iformall/pay/WxPayV3.java b/mallinkService/src/main/java/com/iformall/pay/WxPayV3.java index 0e601eadb..f542dafe7 100644 --- a/mallinkService/src/main/java/com/iformall/pay/WxPayV3.java +++ b/mallinkService/src/main/java/com/iformall/pay/WxPayV3.java @@ -21,6 +21,7 @@ import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayQueryReq; import com.iformall.service.pay.service.pay.wx.v3.entity.V3CombinePayCommonMiniAppReq; import com.iformall.service.pay.service.pay.wx.v3.entity.V3PayCommonMiniAppReq; import com.iformall.service.pay.service.pay.wx.v3.entity.V3PayQueryReq; +import com.iformall.service.pay.service.refund.wx.v3.entity.V3PayRefundReq; import com.iformall.service.pay.service.share.wx.v3.entity.V3PayShareQueryReq; import com.iformall.service.pay.service.share.wx.v3.entity.V3PayShareReq; import com.iformall.service.pay.service.share.wx.v3.entity.V3PayShareUnfreezeReq; @@ -54,6 +55,8 @@ public class WxPayV3 { private static final String SHARE_URL = "https://api.mch.weixin.qq.com/v3/profitsharing/orders"; //小程序下单-分账-查询 private static final String SHARE_QUERY_URL = "https://api.mch.weixin.qq.com/v3/profitsharing/orders/%s"; + //小程序下单-普通支付-退款 + private static final String PAY_COMMON_REFUND = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds"; private WxPayV3() { @@ -188,4 +191,14 @@ public class WxPayV3 { public static String shareQuery(WxPayService payService,V3PayShareQueryReq req) throws WxPayException { return payService.postV3WithWechatpaySerial(String.format(SHARE_QUERY_URL, req.getOut_order_no()), JSON.toJSONString(req)); } + + /** + * 普通支付-退款 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_9.shtml + * @throws WxPayException + */ + public static String payCommonRefund(WxPayService payService,V3PayRefundReq req) throws WxPayException { + return payService.postV3WithWechatpaySerial(PAY_COMMON_REFUND, JSON.toJSONString(req)); + } + + } diff --git a/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java b/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java index 6888692d7..2ca526dd5 100644 --- a/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java +++ b/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java @@ -174,8 +174,8 @@ public class PayServiceFactory { refundMap = new ConcurrentHashMap(); refundMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxRefundService); refundMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxRefundService); - refundMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxRefundV3AdapterService); - refundMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxRefundV3AdapterService); + refundMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxRefundV3AdapterService); + refundMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxRefundV3AdapterService); refundMap.put(EnumPayWay.PAY_WAY_TT.getCode()+"_"+EnumPayVersion.DY_PAY_V2.getCode(), ttRefundService); } return refundMap; diff --git a/mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/WxRefundV3AdapterService.java b/mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/WxRefundV3AdapterService.java index fdcf82252..f980482b6 100644 --- a/mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/WxRefundV3AdapterService.java +++ b/mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/WxRefundV3AdapterService.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.github.binarywang.wxpay.service.WxPayService; import com.iformall.common.ErrorCode; import com.iformall.common.Result; import com.iformall.common.ResultData; @@ -18,6 +19,7 @@ import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxPayAccount; import com.iformall.domain.po.WxPayOrder; import com.iformall.domain.po.WxRefundOrder; +import com.iformall.enums.EnumPayMchType; import com.iformall.enums.EnumPayMode; import com.iformall.enums.EnumPayType; import com.iformall.enums.EnumPayWay; @@ -28,14 +30,17 @@ import com.iformall.mapper.WxPayAccountMapper; import com.iformall.mapper.WxPayOrderMapper; import com.iformall.mapper.WxRefundOrderMapper; import com.iformall.pay.WxPay; +import com.iformall.pay.WxPayV3; import com.iformall.pay.WxPayment; import com.iformall.pay.WxRefundOrderP; import com.iformall.pay.WxRefundOrderSP; import com.iformall.service.pay.service.refund.RefundPayAdapterService; import com.iformall.service.pay.service.refund.entity.RefundAdapterResult; import com.iformall.service.pay.service.refund.entity.RefundNotifyAdapterResult; +import com.iformall.service.pay.service.refund.wx.v3.entity.V3PayRefundReq; import com.iformall.utils.BeanUtils; import com.iformall.utils.CipherUtil; +import com.iformall.utils.MaUtil; import com.iformall.utils.Utility; import com.iformall.utils.XmlUtil; @@ -45,192 +50,10 @@ import lombok.extern.slf4j.Slf4j; @Service public class WxRefundV3AdapterService implements RefundPayAdapterService{ - JSONObject errorRefundReqMap = JSON.parseObject("{\n" + - " \"SYSTEMERROR\": {\n" + - " \"detail\": \"接口返回错误\",\n" + - " \"reason\": \"系统超时等\",\n" + - " \"resolution\": \"请不要更换商户退款单号,请使用相同参数再次调用API。\"\n" + - " },\n" + - " \"BIZERR_NEED_RETRY\": {\n" + - " \"detail\": \"退款业务流程错误,需要商户触发重试来解决\",\n" + - " \"reason\": \"并发情况下,业务被拒绝,商户重试即可解决\",\n" + - " \"resolution\": \"请不要更换商户退款单号,请使用相同参数再次调用API。\"\n" + - " },\n" + - " \"TRADE_OVERDUE\": {\n" + - " \"detail\": \"订单已经超过退款期限\",\n" + - " \"reason\": \"订单已经超过可退款的最大期限(支付后一年内可退款)\\t\",\n" + - " \"resolution\": \"请选择其他方式自行退款\"\n" + - " },\n" + - " \"ERROR\": {\n" + - " \"detail\": \"业务错误\",\n" + - " \"reason\": \"申请退款业务发生错误\",\n" + - " \"resolution\": \"该错误都会返回具体的错误原因,请根据实际返回做相应处理。\"\n" + - " },\n" + - " \"USER_ACCOUNT_ABNORMAL\": {\n" + - " \"detail\": \"退款请求失败\",\n" + - " \"reason\": \"用户帐号注销\",\n" + - " \"resolution\": \"此状态代表退款申请失败,商户可自行处理退款。\"\n" + - " },\n" + - " \"INVALID_REQ_TOO_MUCH\": {\n" + - " \"detail\": \"无效请求过多\",\n" + - " \"reason\": \"连续错误请求数过多被系统短暂屏蔽\\t\",\n" + - " \"resolution\": \"请检查业务是否正常,确认业务正常后请在1分钟后再来重试\"\n" + - " },\n" + - " \"NOTENOUGH\": {\n" + - " \"detail\": \"余额不足\",\n" + - " \"reason\": \"商户可用退款余额不足\",\n" + - " \"resolution\": \"此状态代表退款申请失败,商户可根据具体的错误提示做相应的处理。\"\n" + - " },\n" + - " \"INVALID_TRANSACTIONID\": {\n" + - " \"detail\": \"无效transaction_id\",\n" + - " \"reason\": \"请求参数未按指引进行填写\",\n" + - " \"resolution\": \"请求参数错误,检查原交易号是否存在或发起支付交易接口返回失败\"\n" + - " },\n" + - " \"PARAM_ERROR\": {\n" + - " \"detail\": \"参数错误\",\n" + - " \"reason\": \"请求参数未按指引进行填写\",\n" + - " \"resolution\": \"请求参数错误,请重新检查再调用退款申请\"\n" + - " },\n" + - " \"APPID_NOT_EXIST\": {\n" + - " \"detail\": \"APPID不存在\",\n" + - " \"reason\": \"参数中缺少APPID\",\n" + - " \"resolution\": \"请检查APPID是否正确\"\n" + - " },\n" + - " \"MCHID_NOT_EXIST\": {\n" + - " \"detail\": \"MCHID不存在\",\n" + - " \"reason\": \"参数中缺少MCHID\",\n" + - " \"resolution\": \"请检查MCHID是否正确\"\n" + - " },\n" + - " \"REQUIRE_POST_METHOD\": {\n" + - " \"detail\": \"请使用post方法\",\n" + - " \"reason\": \"未使用post传递参数\",\n" + - " \"resolution\": \"请检查请求参数是否通过post方法提交\"\n" + - " },\n" + - " \"SIGNERROR\": {\n" + - " \"detail\": \"签名错误\",\n" + - " \"reason\": \"参数签名结果不正确\",\n" + - " \"resolution\": \"请检查签名参数和方法是否都符合签名算法要求\"\n" + - " },\n" + - " \"XML_FORMAT_ERROR\": {\n" + - " \"detail\": \"XML格式错误\",\n" + - " \"reason\": \"XML格式错误\",\n" + - " \"resolution\": \"请检查XML参数格式是否正确\"\n" + - " },\n" + - " \"FREQUENCY_LIMITED\": {\n" + - " \"detail\": \"频率限制\",\n" + - " \"reason\": \"2个月之前的订单申请退款有频率限制\",\n" + - " \"resolution\": \"该笔退款未受理,请降低频率后重试\"\n" + - " }\n" + - "}"); - - JSONObject errorRefundQueryMap = JSON.parseObject("{\n" + - " \"SYSTEMERROR\": {\n" + - " \"detail\": \"接口返回错误\",\n" + - " \"reason\": \"系统超时等\",\n" + - " \"resolution\": \"请不要更换商户退款单号,请使用相同参数再次调用API。\"\n" + - " },\n" + - " \"BIZERR_NEED_RETRY\": {\n" + - " \"detail\": \"退款业务流程错误,需要商户触发重试来解决\",\n" + - " \"reason\": \"并发情况下,业务被拒绝,商户重试即可解决\",\n" + - " \"resolution\": \"请不要更换商户退款单号,请使用相同参数再次调用API。\"\n" + - " },\n" + - " \"TRADE_OVERDUE\": {\n" + - " \"detail\": \"订单已经超过退款期限\",\n" + - " \"reason\": \"订单已经超过可退款的最大期限(支付后一年内可退款)\\t\",\n" + - " \"resolution\": \"请选择其他方式自行退款\"\n" + - " },\n" + - " \"ERROR\": {\n" + - " \"detail\": \"业务错误\",\n" + - " \"reason\": \"申请退款业务发生错误\",\n" + - " \"resolution\": \"该错误都会返回具体的错误原因,请根据实际返回做相应处理。\"\n" + - " },\n" + - " \"USER_ACCOUNT_ABNORMAL\": {\n" + - " \"detail\": \"退款请求失败\",\n" + - " \"reason\": \"用户帐号注销\",\n" + - " \"resolution\": \"此状态代表退款申请失败,商户可自行处理退款。\"\n" + - " },\n" + - " \"INVALID_REQ_TOO_MUCH\": {\n" + - " \"detail\": \"无效请求过多\",\n" + - " \"reason\": \"连续错误请求数过多被系统短暂屏蔽\\t\",\n" + - " \"resolution\": \"请检查业务是否正常,确认业务正常后请在1分钟后再来重试\"\n" + - " },\n" + - " \"NOTENOUGH\": {\n" + - " \"detail\": \"余额不足\",\n" + - " \"reason\": \"商户可用退款余额不足\",\n" + - " \"resolution\": \"此状态代表退款申请失败,商户可根据具体的错误提示做相应的处理。\"\n" + - " },\n" + - " \"INVALID_TRANSACTIONID\": {\n" + - " \"detail\": \"无效transaction_id\",\n" + - " \"reason\": \"请求参数未按指引进行填写\",\n" + - " \"resolution\": \"请求参数错误,检查原交易号是否存在或发起支付交易接口返回失败\"\n" + - " },\n" + - " \"PARAM_ERROR\": {\n" + - " \"detail\": \"参数错误\",\n" + - " \"reason\": \"请求参数未按指引进行填写\",\n" + - " \"resolution\": \"请求参数错误,请重新检查再调用退款申请\"\n" + - " },\n" + - " \"APPID_NOT_EXIST\": {\n" + - " \"detail\": \"APPID不存在\",\n" + - " \"reason\": \"参数中缺少APPID\",\n" + - " \"resolution\": \"请检查APPID是否正确\"\n" + - " },\n" + - " \"MCHID_NOT_EXIST\": {\n" + - " \"detail\": \"MCHID不存在\",\n" + - " \"reason\": \"参数中缺少MCHID\",\n" + - " \"resolution\": \"请检查MCHID是否正确\"\n" + - " },\n" + - " \"REQUIRE_POST_METHOD\": {\n" + - " \"detail\": \"请使用post方法\",\n" + - " \"reason\": \"未使用post传递参数\",\n" + - " \"resolution\": \"请检查请求参数是否通过post方法提交\"\n" + - " },\n" + - " \"SIGNERROR\": {\n" + - " \"detail\": \"签名错误\",\n" + - " \"reason\": \"参数签名结果不正确\",\n" + - " \"resolution\": \"请检查签名参数和方法是否都符合签名算法要求\"\n" + - " },\n" + - " \"XML_FORMAT_ERROR\": {\n" + - " \"detail\": \"XML格式错误\",\n" + - " \"reason\": \"XML格式错误\",\n" + - " \"resolution\": \"请检查XML参数格式是否正确\"\n" + - " },\n" + - " \"FREQUENCY_LIMITED\": {\n" + - " \"detail\": \"频率限制\",\n" + - " \"reason\": \"2个月之前的订单申请退款有频率限制\",\n" + - " \"resolution\": \"该笔退款未受理,请降低频率后重试\"\n" + - " }\n" + - "}"); - - private WxRefundOrderP generateWxRefundOrderP(WxPayAccount payAccount,WxAppinfo appInfo,WxRefundOrder record,WxPayOrder payOrder,EnumPayType payType) { - String noncestr = Utility.generate32UUID(); - WxRefundOrderP wxRefundOrderP = new WxRefundOrderP(); - wxRefundOrderP.setAppid(appInfo.getAppId()); - wxRefundOrderP.setMch_id(payAccount.getMchId()); - wxRefundOrderP.setNonce_str(noncestr); - // 微信内部订单号 - if (record.getTransactionId() != null) - wxRefundOrderP.setTransaction_id(record.getTransactionId()); - // 支付订单号 - wxRefundOrderP.setOut_trade_no(payOrder.getPayOrderNo()); - // 退款支付订单号 - wxRefundOrderP.setOut_refund_no(String.valueOf(record.getId())); - wxRefundOrderP.setTotal_fee(record.getTotalFee()); - wxRefundOrderP.setRefund_fee(record.getRefundFee()); - if(null != payType) { - if (payType == EnumPayType.PAY_B_REFUND) { - wxRefundOrderP.setRefund_desc("B端商户退款"); - } else if (payType == EnumPayType.PAY_ADMIN_REFUND) { - wxRefundOrderP.setRefund_desc("管理端商户退款"); - } else if (payType == EnumPayType.PAY_AUTO_REFUND) { - wxRefundOrderP.setRefund_desc("超期自动退款"); - } else { - wxRefundOrderP.setRefund_desc("用户自己退款"); - } - } - wxRefundOrderP.setNotify_url(payAccount.getRefundNotifyUrl()); - return wxRefundOrderP; - } + @Autowired + MaUtil maUtil; + private RefundAdapterResult getReusltFromp(String response,WxRefundOrder record,WxPayOrder payOrder) throws MallinkException{ Map returnMap = WxPayment.xmlToMap(response); String result_no = returnMap.get("result_code"); @@ -270,39 +93,6 @@ public class WxRefundV3AdapterService implements RefundPayAdapterService{ } - private WxRefundOrderSP generateWxRefundOrderSP(WxPayAccount payAccount,WxAppinfo appInfo,WxRefundOrder record,WxPayOrder payOrder,EnumPayType payType) { - String noncestr = Utility.generate32UUID(); - WxRefundOrderSP wxRefundOrderSP = new WxRefundOrderSP(); - wxRefundOrderSP.setAppid(appInfo.getParentAppId()); - wxRefundOrderSP.setSub_appid(appInfo.getAppId()); - wxRefundOrderSP.setMch_id(payAccount.getMchId()); - wxRefundOrderSP.setSub_mch_id(payAccount.getSubMchId()); - wxRefundOrderSP.setNonce_str(noncestr); - // 微信内部订单号 - if (record.getTransactionId() != null) - wxRefundOrderSP.setTransaction_id(record.getTransactionId()); - // 支付订单号 - wxRefundOrderSP.setOut_trade_no(payOrder.getPayOrderNo()); - // 退款支付订单号 - wxRefundOrderSP.setOut_refund_no(String.valueOf(record.getId())); - wxRefundOrderSP.setTotal_fee(record.getTotalFee()); - wxRefundOrderSP.setRefund_fee(record.getRefundFee()); - if(null != payType) { - if (payType == EnumPayType.PAY_B_REFUND) { - wxRefundOrderSP.setRefund_desc("B端商户退款"); - } else if (payType == EnumPayType.PAY_ADMIN_REFUND) { - wxRefundOrderSP.setRefund_desc("管理端商户退款"); - } else if (payType == EnumPayType.PAY_AUTO_REFUND) { - wxRefundOrderSP.setRefund_desc("超期自动退款"); - } else { - wxRefundOrderSP.setRefund_desc("用户自己退款"); - } - } - wxRefundOrderSP.setNotify_url(payAccount.getRefundNotifyUrl()); - wxRefundOrderSP.setSign_type("HMAC-SHA256"); - return wxRefundOrderSP; - } - private RefundAdapterResult getResultFromSp(String response,WxRefundOrder record,WxPayOrder payOrder) { Map returnMap = WxPayment.xmlToMap(response); String result_no = returnMap.get("result_code"); @@ -341,64 +131,28 @@ public class WxRefundV3AdapterService implements RefundPayAdapterService{ return new RefundAdapterResult(false,EnumRefundStatus.REFUND_REQ_FAIL.getCode(),errMsg,returnMap); } } - + private V3PayRefundReq getReq(WxPayAccount payAccount,WxAppinfo appInfo,WxRefundOrder record,WxPayOrder payOrder,EnumPayType payType) { + V3PayRefundReq req = new V3PayRefundReq(); + if (payAccount.getMchType() == EnumPayMchType.DIRECT.getCode()) { + req.setSub_mchid(getMerchantUid(record,composeOrder.getSingleOrder())); + //总分 + }else if (payAccount.getMchType() == EnumPayMchType.TOTAL.getCode()) { + req.setSub_mchid(payAccount.getSubMchId()); + }else { + throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"当前支付模式非法"); + } + req.setSub_mchid(sub_mchid); + } @Override public RefundAdapterResult refund(WxPayAccount payAccount,WxAppinfo appInfo,WxRefundOrder record,WxPayOrder payOrder,EnumPayType payType) { - if (StringUtils.isBlank(payAccount.getApiKey())) { - log.error("支付密钥为空"); - throw new MallinkException(ErrorCode.API_KEY_NOT_FOUND.getCode(), "支付密钥为空,请联系商城管理员"); - } - if (StringUtils.isBlank(payAccount.getCertPath())) { - log.error("证书路径为空"); - throw new MallinkException(ErrorCode.CERT_PATH_NOT_FOUND.getCode(), "证书路径为空,请联系商城管理员"); - } - if (!Utility.isFileExist(payAccount.getCertPath())) { - log.error("证书文件不存在"); - throw new MallinkException(ErrorCode.CERT_PATH_NOT_FOUND.getCode(), "证书文件不存在,请联系商城管理员"); - } - - // 实际支付 // 向微信提交退款申请 if (payAccount.getType() == EnumPayMode.MCH.getCode()) { - // 普通商户模式 - WxRefundOrderP wxRefundOrderP = generateWxRefundOrderP(payAccount, appInfo, record, payOrder, payType); - - Map signMap = null; - try { - signMap = BeanUtils.toStringMap(wxRefundOrderP); - } catch (Exception e) { - log.error("退款命令生辰: " + e.getMessage()); - throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR.getCode(), "退款签名异常"); - } - - String signAgent = WxPayment.createSign(signMap, payAccount.getApiKey()); - signMap.put("sign", signAgent); - String response = null; - try { - response = WxPay.orderRefund(signMap, payAccount.getCertPath(), payAccount.getMchId()); - } catch (Exception e) { - log.error("退款异常: " + e.getMessage()); - throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR.getCode(), "退款异常"); - } - log.info("微信退款订单:" + wxRefundOrderP.toString() + ", response: " + response.toString()); - return getReusltFromp(response, record, payOrder); } else { // 服务商模式 - WxRefundOrderSP wxRefundOrderSP = generateWxRefundOrderSP(payAccount, appInfo, record, payOrder, payType); - - Map signMap = null; - try { - signMap = BeanUtils.toStringMap(wxRefundOrderSP); - } catch (Exception e) { - log.error("退款命令生成: " + e.getMessage()); - throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR.getCode(), "退款签名异常"); - } - - String signAgent = WxPayment.createSignHMAC(signMap, payAccount.getApiKey()); - signMap.put("sign", signAgent); + WxPayService payService = maUtil.getWxPayService(appInfo, payAccount); String response = null; try { - response = WxPay.orderRefund(signMap, payAccount.getCertPath(), payAccount.getMchId()); + response = WxPayV3.payCommonRefund(payService, getReq(payAccount, appInfo, record, payOrder, payType)); } catch (Exception e) { log.error("退款异常: " + e.getMessage()); throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR.getCode(), "退款异常"); diff --git a/mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundAmountReq.java b/mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundAmountReq.java new file mode 100644 index 000000000..e187ba6ec --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundAmountReq.java @@ -0,0 +1,11 @@ +package com.iformall.service.pay.service.refund.wx.v3.entity; + +import lombok.Data; + +@Data +public class V3PayRefundAmountReq { + + private int refund;//退款金额。 + private int total;//原订单金额 + private String currency = "CNY";//退款币种 +} diff --git a/mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundGoodsReq.java b/mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundGoodsReq.java new file mode 100644 index 000000000..c707caf78 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundGoodsReq.java @@ -0,0 +1,14 @@ +package com.iformall.service.pay.service.refund.wx.v3.entity; + +import lombok.Data; + +@Data +public class V3PayRefundGoodsReq { + + private String merchant_goods_id;//商户侧商品编码。 + private String goods_name;//商品名称 + private int unit_price;//商品单价 + private int refund_amount;//商品退款金额 + private int refund_quantity;//商品退货数量 + +} diff --git a/mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundReq.java b/mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundReq.java new file mode 100644 index 000000000..cea352411 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundReq.java @@ -0,0 +1,17 @@ +package com.iformall.service.pay.service.refund.wx.v3.entity; + +import java.util.List; + +import lombok.Data; + +@Data +public class V3PayRefundReq { + + private String sub_mchid;//微信支付分配的子商户号,即分账的出资商户号。 + private String out_trade_no;//微信支付订单号 + private String out_refund_no;//商户退款单号 + private String reason;//退款原因 + private String notify_url;//退款结果回调url + private V3PayRefundAmountReq amount;//金额信息 + private List goods_detail;//退款商品 +} diff --git a/mallinkService/src/main/java/com/iformall/service/pay/service/share/wx/v3/WxPayShareV3Service.java b/mallinkService/src/main/java/com/iformall/service/pay/service/share/wx/v3/WxPayShareV3Service.java index 1b7eae812..6bba99019 100644 --- a/mallinkService/src/main/java/com/iformall/service/pay/service/share/wx/v3/WxPayShareV3Service.java +++ b/mallinkService/src/main/java/com/iformall/service/pay/service/share/wx/v3/WxPayShareV3Service.java @@ -24,8 +24,6 @@ import com.iformall.common.ErrorCode; import com.iformall.common.ResultData; import com.iformall.exception.MallinkException; import com.iformall.pay.WxPayV3; -import com.iformall.pay.WxPayment; -import com.iformall.pay.WxProfitSharing; import com.iformall.service.WxPayAccountService; import com.iformall.service.WxProfitSharingReceiverService; import com.iformall.service.order.util.OrderHelper; @@ -38,11 +36,8 @@ import com.iformall.service.pay.service.share.entity.ShareNotifyAdapterResult; import com.iformall.service.pay.service.share.wx.v3.entity.V3PayShareQueryReq; import com.iformall.service.pay.service.share.wx.v3.entity.V3PayShareReq; import com.iformall.service.pay.service.share.wx.v3.entity.V3PayShareUnfreezeReq; -import com.iformall.utils.BeanUtils; import com.iformall.utils.MaUtil; import com.iformall.utils.Utility; -import com.iformall.utils.XmlUtil; - import lombok.extern.slf4j.Slf4j; @Slf4j @@ -244,14 +239,14 @@ public class WxPayShareV3Service extends PayShareBaseAdapterService{ SortedMap resultMap = new TreeMap(); resultMap.put("return_code", "FAIL"); resultMap.put("return_msg", msg); - return new ShareNotifyAdapterResult(false,ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR.getCode(),msg,XmlUtil.getRequestXml(resultMap)); + return new ShareNotifyAdapterResult(false,ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR.getCode(),msg,JSON.toJSONString(resultMap)); } private ShareNotifyAdapterResult getSuccessResult(WxPayOrder payOrder, String transcationId){ SortedMap resultMap = new TreeMap(); - resultMap.put("return_code", "SUCCESS"); - resultMap.put("return_msg", "OK"); - return new ShareNotifyAdapterResult(transcationId, payOrder, XmlUtil.getRequestXml(resultMap)); + resultMap.put("code", "SUCCESS"); + resultMap.put("message", "成功"); + return new ShareNotifyAdapterResult(transcationId, payOrder, JSON.toJSONString(resultMap)); } @Override