ソースを参照

fix pay v3

release_toaliyun_real
zhengfangyuan 3年前
コミット
f72ece7ee6
9個のファイルの変更95行の追加291行の削除
  1. +9
    -9
      mallinkCallback/src/main/java/com/iformall/controller/callback/WxPayController.java
  2. +3
    -3
      mallinkService/src/main/java/com/iformall/domain/po/WxPayAccount.java
  3. +13
    -0
      mallinkService/src/main/java/com/iformall/pay/WxPayV3.java
  4. +2
    -2
      mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java
  5. +22
    -268
      mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/WxRefundV3AdapterService.java
  6. +11
    -0
      mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundAmountReq.java
  7. +14
    -0
      mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundGoodsReq.java
  8. +17
    -0
      mallinkService/src/main/java/com/iformall/service/pay/service/refund/wx/v3/entity/V3PayRefundReq.java
  9. +4
    -9
      mallinkService/src/main/java/com/iformall/service/pay/service/share/wx/v3/WxPayShareV3Service.java

+ 9
- 9
mallinkCallback/src/main/java/com/iformall/controller/callback/WxPayController.java ファイルの表示

@@ -293,21 +293,21 @@ public class WxPayController extends BaseController {
} catch (BizMessageException e) { } catch (BizMessageException e) {
logger.error("share wxpay, notify error, req: " + xml + ", e:" + e.getLocalizedMessage()); logger.error("share wxpay, notify error, req: " + xml + ", e:" + e.getLocalizedMessage());
SortedMap resultMap = new TreeMap(); 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) { } catch (MallinkException e) {
logger.error("refund wxpay, notify error, req: " + xml + ", e:" +e.getLocalizedMessage()); logger.error("refund wxpay, notify error, req: " + xml + ", e:" +e.getLocalizedMessage());
SortedMap resultMap = new TreeMap(); 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) { } catch (Exception e) {
logger.error("refund wxpay, order create error, req: " + xml + ", e: " + e.getMessage()); logger.error("refund wxpay, order create error, req: " + xml + ", e: " + e.getMessage());
SortedMap resultMap = new TreeMap(); 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);
} }
} }




+ 3
- 3
mallinkService/src/main/java/com/iformall/domain/po/WxPayAccount.java ファイルの表示

@@ -59,19 +59,19 @@ public class WxPayAccount extends TenantEntity {




public String getPayNotifyV3Url() { public String getPayNotifyV3Url() {
return notifyUrl + "/pay/v3";
return notifyUrl + "/pay/v3/"+this.getTenantId();
} }
public String getPayNotifyUrl() { public String getPayNotifyUrl() {
return notifyUrl + "/pay"; return notifyUrl + "/pay";
} }
public String getRefundNotifyV3Url() { public String getRefundNotifyV3Url() {
return notifyUrl + "/refund/v3";
return notifyUrl + "/refund/v3/"+this.getTenantId();
} }
public String getRefundNotifyUrl() { public String getRefundNotifyUrl() {
return notifyUrl + "/refund"; return notifyUrl + "/refund";
} }
public String getSubsidyNotifyV3Url() { public String getSubsidyNotifyV3Url() {
return notifyUrl + "/subsidyPay/v3";
return notifyUrl + "/subsidyPay/v3/"+this.getTenantId();
} }
public String getSubsidyNotifyUrl() { public String getSubsidyNotifyUrl() {
return notifyUrl + "/subsidyPay"; return notifyUrl + "/subsidyPay";


+ 13
- 0
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.V3CombinePayCommonMiniAppReq;
import com.iformall.service.pay.service.pay.wx.v3.entity.V3PayCommonMiniAppReq; 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.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.V3PayShareQueryReq;
import com.iformall.service.pay.service.share.wx.v3.entity.V3PayShareReq; 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.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_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 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() { private WxPayV3() {
@@ -188,4 +191,14 @@ public class WxPayV3 {
public static String shareQuery(WxPayService payService,V3PayShareQueryReq req) throws WxPayException { 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)); 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));
}
} }

+ 2
- 2
mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java ファイルの表示

@@ -174,8 +174,8 @@ public class PayServiceFactory {
refundMap = new ConcurrentHashMap<String, RefundPayAdapterService>(); refundMap = new ConcurrentHashMap<String, RefundPayAdapterService>();
refundMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxRefundService); 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_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); refundMap.put(EnumPayWay.PAY_WAY_TT.getCode()+"_"+EnumPayVersion.DY_PAY_V2.getCode(), ttRefundService);
} }
return refundMap; return refundMap;


+ 22
- 268
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.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.github.binarywang.wxpay.service.WxPayService;
import com.iformall.common.ErrorCode; import com.iformall.common.ErrorCode;
import com.iformall.common.Result; import com.iformall.common.Result;
import com.iformall.common.ResultData; 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.WxPayAccount;
import com.iformall.domain.po.WxPayOrder; import com.iformall.domain.po.WxPayOrder;
import com.iformall.domain.po.WxRefundOrder; import com.iformall.domain.po.WxRefundOrder;
import com.iformall.enums.EnumPayMchType;
import com.iformall.enums.EnumPayMode; import com.iformall.enums.EnumPayMode;
import com.iformall.enums.EnumPayType; import com.iformall.enums.EnumPayType;
import com.iformall.enums.EnumPayWay; import com.iformall.enums.EnumPayWay;
@@ -28,14 +30,17 @@ import com.iformall.mapper.WxPayAccountMapper;
import com.iformall.mapper.WxPayOrderMapper; import com.iformall.mapper.WxPayOrderMapper;
import com.iformall.mapper.WxRefundOrderMapper; import com.iformall.mapper.WxRefundOrderMapper;
import com.iformall.pay.WxPay; import com.iformall.pay.WxPay;
import com.iformall.pay.WxPayV3;
import com.iformall.pay.WxPayment; import com.iformall.pay.WxPayment;
import com.iformall.pay.WxRefundOrderP; import com.iformall.pay.WxRefundOrderP;
import com.iformall.pay.WxRefundOrderSP; import com.iformall.pay.WxRefundOrderSP;
import com.iformall.service.pay.service.refund.RefundPayAdapterService; 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.RefundAdapterResult;
import com.iformall.service.pay.service.refund.entity.RefundNotifyAdapterResult; 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.BeanUtils;
import com.iformall.utils.CipherUtil; import com.iformall.utils.CipherUtil;
import com.iformall.utils.MaUtil;
import com.iformall.utils.Utility; import com.iformall.utils.Utility;
import com.iformall.utils.XmlUtil; import com.iformall.utils.XmlUtil;


@@ -45,192 +50,10 @@ import lombok.extern.slf4j.Slf4j;
@Service @Service
public class WxRefundV3AdapterService implements RefundPayAdapterService{ 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{ private RefundAdapterResult getReusltFromp(String response,WxRefundOrder record,WxPayOrder payOrder) throws MallinkException{
Map<String, String> returnMap = WxPayment.xmlToMap(response); Map<String, String> returnMap = WxPayment.xmlToMap(response);
String result_no = returnMap.get("result_code"); 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) { private RefundAdapterResult getResultFromSp(String response,WxRefundOrder record,WxPayOrder payOrder) {
Map<String, String> returnMap = WxPayment.xmlToMap(response); Map<String, String> returnMap = WxPayment.xmlToMap(response);
String result_no = returnMap.get("result_code"); 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); 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 @Override
public RefundAdapterResult refund(WxPayAccount payAccount,WxAppinfo appInfo,WxRefundOrder record,WxPayOrder payOrder,EnumPayType payType) { 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()) { 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 { } 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; String response = null;
try { try {
response = WxPay.orderRefund(signMap, payAccount.getCertPath(), payAccount.getMchId());
response = WxPayV3.payCommonRefund(payService, getReq(payAccount, appInfo, record, payOrder, payType));
} catch (Exception e) { } catch (Exception e) {
log.error("退款异常: " + e.getMessage()); log.error("退款异常: " + e.getMessage());
throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR.getCode(), "退款异常"); throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR.getCode(), "退款异常");


+ 11
- 0
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";//退款币种
}

+ 14
- 0
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;//商品退货数量
}

+ 17
- 0
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<V3PayRefundGoodsReq> goods_detail;//退款商品
}

+ 4
- 9
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.common.ResultData;
import com.iformall.exception.MallinkException; import com.iformall.exception.MallinkException;
import com.iformall.pay.WxPayV3; import com.iformall.pay.WxPayV3;
import com.iformall.pay.WxPayment;
import com.iformall.pay.WxProfitSharing;
import com.iformall.service.WxPayAccountService; import com.iformall.service.WxPayAccountService;
import com.iformall.service.WxProfitSharingReceiverService; import com.iformall.service.WxProfitSharingReceiverService;
import com.iformall.service.order.util.OrderHelper; 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.V3PayShareQueryReq;
import com.iformall.service.pay.service.share.wx.v3.entity.V3PayShareReq; 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.service.pay.service.share.wx.v3.entity.V3PayShareUnfreezeReq;
import com.iformall.utils.BeanUtils;
import com.iformall.utils.MaUtil; import com.iformall.utils.MaUtil;
import com.iformall.utils.Utility; import com.iformall.utils.Utility;
import com.iformall.utils.XmlUtil;

import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;


@Slf4j @Slf4j
@@ -244,14 +239,14 @@ public class WxPayShareV3Service extends PayShareBaseAdapterService{
SortedMap resultMap = new TreeMap(); SortedMap resultMap = new TreeMap();
resultMap.put("return_code", "FAIL"); resultMap.put("return_code", "FAIL");
resultMap.put("return_msg", msg); 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){ private ShareNotifyAdapterResult getSuccessResult(WxPayOrder payOrder, String transcationId){
SortedMap resultMap = new TreeMap(); 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 @Override


読み込み中…
キャンセル
保存