Browse Source

[支付/退款][修复]:微信支付退款map修复

release_toaliyun_real
Stormeye.Wu 7 years ago
parent
commit
f84e5c6332
4 changed files with 200 additions and 55 deletions
  1. +16
    -2
      mallinkService/src/main/java/com/simple/pay/WxPay.java
  2. +155
    -31
      mallinkService/src/main/java/com/simple/service/impl/WxRefundOrderServiceImpl.java
  3. +22
    -0
      mallinkService/src/main/java/com/simple/utils/MapUtil.java
  4. +7
    -22
      mallinkService/src/main/java/com/simple/utils/TJDCarUtil.java

+ 16
- 2
mallinkService/src/main/java/com/simple/pay/WxPay.java View File

@@ -11,9 +11,9 @@ public class WxPay {
protected static Logger log = LoggerFactory.getLogger(WxPay.class);

// 统一下单接口
private static final String UNIFIEDORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
private static final String UNIFIEDORDER_URL = "https://api.mch.weixin.qq.com/sandboxnew/pay/unifiedorder";
// 订单查询
private static final String ORDERQUERY_URL = "https://api.mch.weixin.qq.com/pay/orderquery";
private static final String ORDERQUERY_URL = "https://api.mch.weixin.qq.com/sandboxnew/pay/orderquery";
// 关闭订单
private static final String CLOSEORDER_URL = "https://api.mch.weixin.qq.com/pay/closeorder";
// 撤销订单
@@ -37,6 +37,9 @@ public class WxPay {
// 查询企业付款
private static final String GETTRANSFERINFO_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo";

// 沙箱
private static final String SANDBOX_GETSIGNKEY_URL = "https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey";

private WxPay() {
}

@@ -277,6 +280,17 @@ public class WxPay {
return qrCodeUrl;
}

/**
* 获取验签秘钥API
* https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_1
*
* @param params
* @return
*/
public static String sanboxSignGet(Map<String, String> params) {
return doPost(SANDBOX_GETSIGNKEY_URL, params);
}

public static String doPost(String url, Map<String, String> params) {
return HttpUtil.payPost(url, WxPayment.toXml(params));
}


+ 155
- 31
mallinkService/src/main/java/com/simple/service/impl/WxRefundOrderServiceImpl.java View File

@@ -40,37 +40,161 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService {
@Autowired
WxPayAccountMapper wxPayAccountMapper;

JSONObject errorRefundReqMap = JSON.parseObject("{\"SYSTEMERROR\":{\"detail\":\"接口返回错误\",\"reason\":\"系统超时等\",\"resolution\":\"请不要更换商户退款单号,请使用相同参数再次调用API。\"},\n" +
"{\"BIZERR_NEED_RETRY\":{\"detail\":\"退款业务流程错误,需要商户触发重试来解决\",\"reason\":\"并发情况下,业务被拒绝,商户重试即可解决\",\"resolution\":\"请不要更换商户退款单号,请使用相同参数再次调用API。\"},\n" +
"{\"TRADE_OVERDUE\":{\"detail\":\"订单已经超过退款期限\",\"reason\":\"订单已经超过可退款的最大期限(支付后一年内可退款)\t\",\"resolution\":\"请选择其他方式自行退款\"},\n" +
"{\"ERROR\":{\"detail\":\"业务错误\",\"reason\":\"申请退款业务发生错误\",\"resolution\":\"该错误都会返回具体的错误原因,请根据实际返回做相应处理。\"},\n" +
"{\"USER_ACCOUNT_ABNORMAL\":{\"detail\":\"退款请求失败\",\"reason\":\"用户帐号注销\",\"resolution\":\"此状态代表退款申请失败,商户可自行处理退款。\"},\n" +
"{\"INVALID_REQ_TOO_MUCH\":{\"detail\":\"无效请求过多\",\"reason\":\"连续错误请求数过多被系统短暂屏蔽\t\",\"resolution\":\"请检查业务是否正常,确认业务正常后请在1分钟后再来重试\"},\n" +
"{\"NOTENOUGH\":{\"detail\":\"余额不足\",\"reason\":\"商户可用退款余额不足\",\"resolution\":\"此状态代表退款申请失败,商户可根据具体的错误提示做相应的处理。\"},\n" +
"{\"INVALID_TRANSACTIONID\":{\"detail\":\"无效transaction_id\",\"reason\":\"请求参数未按指引进行填写\",\"resolution\":\"请求参数错误,检查原交易号是否存在或发起支付交易接口返回失败\"},\n" +
"{\"PARAM_ERROR\":{\"detail\":\"参数错误\",\"reason\":\"请求参数未按指引进行填写\",\"resolution\":\"请求参数错误,请重新检查再调用退款申请\"},\n" +
"{\"APPID_NOT_EXIST\":{\"detail\":\"APPID不存在\",\"reason\":\"参数中缺少APPID\",\"resolution\":\"请检查APPID是否正确\"},\n" +
"{\"MCHID_NOT_EXIST\":{\"detail\":\"MCHID不存在\",\"reason\":\"参数中缺少MCHID\",\"resolution\":\"请检查MCHID是否正确\"},\n" +
"{\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"},\n" +
"{\"SIGNERROR\":{\"detail\":\"签名错误\",\"reason\":\"参数签名结果不正确\",\"resolution\":\"请检查签名参数和方法是否都符合签名算法要求\"},\n" +
"{\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\",\"reason\":\"XML格式错误\",\"resolution\":\"请检查XML参数格式是否正确\"},\n" +
"{\"FREQUENCY_LIMITED\":{\"detail\":\"频率限制\",\"reason\":\"2个月之前的订单申请退款有频率限制\",\"resolution\":\"该笔退款未受理,请降低频率后重试\"}");

JSONObject errorRefundQueryMap = JSON.parseObject("{\"SYSTEMERROR\":{\"detail\":\"接口返回错误\",\"reason\":\"系统超时等\",\"resolution\":\"请不要更换商户退款单号,请使用相同参数再次调用API。\"},\n" +
"{\"BIZERR_NEED_RETRY\":{\"detail\":\"退款业务流程错误,需要商户触发重试来解决\",\"reason\":\"并发情况下,业务被拒绝,商户重试即可解决\",\"resolution\":\"请不要更换商户退款单号,请使用相同参数再次调用API。\"},\n" +
"{\"TRADE_OVERDUE\":{\"detail\":\"订单已经超过退款期限\",\"reason\":\"订单已经超过可退款的最大期限(支付后一年内可退款)\t\",\"resolution\":\"请选择其他方式自行退款\"},\n" +
"{\"ERROR\":{\"detail\":\"业务错误\",\"reason\":\"申请退款业务发生错误\",\"resolution\":\"该错误都会返回具体的错误原因,请根据实际返回做相应处理。\"},\n" +
"{\"USER_ACCOUNT_ABNORMAL\":{\"detail\":\"退款请求失败\",\"reason\":\"用户帐号注销\",\"resolution\":\"此状态代表退款申请失败,商户可自行处理退款。\"},\n" +
"{\"INVALID_REQ_TOO_MUCH\":{\"detail\":\"无效请求过多\",\"reason\":\"连续错误请求数过多被系统短暂屏蔽\t\",\"resolution\":\"请检查业务是否正常,确认业务正常后请在1分钟后再来重试\"},\n" +
"{\"NOTENOUGH\":{\"detail\":\"余额不足\",\"reason\":\"商户可用退款余额不足\",\"resolution\":\"此状态代表退款申请失败,商户可根据具体的错误提示做相应的处理。\"},\n" +
"{\"INVALID_TRANSACTIONID\":{\"detail\":\"无效transaction_id\",\"reason\":\"请求参数未按指引进行填写\",\"resolution\":\"请求参数错误,检查原交易号是否存在或发起支付交易接口返回失败\"},\n" +
"{\"PARAM_ERROR\":{\"detail\":\"参数错误\",\"reason\":\"请求参数未按指引进行填写\",\"resolution\":\"请求参数错误,请重新检查再调用退款申请\"},\n" +
"{\"APPID_NOT_EXIST\":{\"detail\":\"APPID不存在\",\"reason\":\"参数中缺少APPID\",\"resolution\":\"请检查APPID是否正确\"},\n" +
"{\"MCHID_NOT_EXIST\":{\"detail\":\"MCHID不存在\",\"reason\":\"参数中缺少MCHID\",\"resolution\":\"请检查MCHID是否正确\"},\n" +
"{\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"},\n" +
"{\"SIGNERROR\":{\"detail\":\"签名错误\",\"reason\":\"参数签名结果不正确\",\"resolution\":\"请检查签名参数和方法是否都符合签名算法要求\"},\n" +
"{\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\",\"reason\":\"XML格式错误\",\"resolution\":\"请检查XML参数格式是否正确\"},\n" +
"{\"FREQUENCY_LIMITED\":{\"detail\":\"频率限制\",\"reason\":\"2个月之前的订单申请退款有频率限制\",\"resolution\":\"该笔退款未受理,请降低频率后重试\"}");
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" +
"}");

@Override
public ResultData createRefundOrder(WxAppinfo appInfo, WxRefundOrder record, EnumPayWay payWay) {


+ 22
- 0
mallinkService/src/main/java/com/simple/utils/MapUtil.java View File

@@ -0,0 +1,22 @@
package com.simple.utils;

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

public class MapUtil {
/**
* 获取带排序的Map
* @return
*/
public static Map<String, String> getOrderMap() {
Map<String, String> paramMap = new TreeMap<String, String>(
new Comparator<String>() {
public int compare(String obj1, String obj2) {
// 降序排序
return obj1.compareTo(obj2);
}
});
return paramMap;
}
}

+ 7
- 22
mallinkService/src/main/java/com/simple/utils/TJDCarUtil.java View File

@@ -60,21 +60,6 @@ public class TJDCarUtil {
*/
}

/**
* 获取带排序的Map
* @return
*/
public static Map<String, String> getOrderMap() {
Map<String, String> paramMap = new TreeMap<String, String>(
new Comparator<String>() {
public int compare(String obj1, String obj2) {
// 降序排序
return obj1.compareTo(obj2);
}
});
return paramMap;
}

/**
* md5算法
* @param data
@@ -150,7 +135,7 @@ public class TJDCarUtil {
String carNum, String carNumColor, String phone, String outCarId) {
String service = "parkhub.car.register";

Map<String, String> paramMap = getOrderMap();
Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put("carNum", carNum);
paramMap.put("carNumColor", carNumColor);
if (phone != null) {
@@ -200,7 +185,7 @@ public class TJDCarUtil {
String carId) {
String service = "parkhub.car.writeOff";

Map<String, String> paramMap = getOrderMap();
Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put("carId", carId);
paramMap.put("charset", "utf-8");
paramMap.put("partner", partner);
@@ -243,7 +228,7 @@ public class TJDCarUtil {

String freeMins = "0";

Map<String, String> paramMap = getOrderMap();
Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put("carNum", carNum);
//paramMap.put("carNumColor", "");
//paramMap.put("pmParkId", "");
@@ -311,7 +296,7 @@ public class TJDCarUtil {
// 为指定订单抵扣停车费,如果此时车辆已经出场,返回isSuccess错误码为3,
// 停简单系统不再接收此笔抵扣信息,对方系统需要给用户发起退款(后续业务中无结算)
String service = "parkhub.order.deductionNotSettle";
Map<String, String> paramMap = getOrderMap();
Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put("tradeId", tradeId);
paramMap.put("deductionAmount", deductionAmount);
paramMap.put("outTradeNo", outTradeNo);
@@ -360,7 +345,7 @@ public class TJDCarUtil {
String tradeId, String outTicketNo, String accountId, String prePayType, String minutes, String memo) throws Exception {
String service = "parkhub.ticket.bindTime";

Map<String, String> paramMap = getOrderMap();
Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put("tradeId", tradeId);
paramMap.put("outTicketNo", outTicketNo);
paramMap.put("accountId", accountId);
@@ -414,7 +399,7 @@ public class TJDCarUtil {
String startDt, String EndDt, String expireDt, String memo) throws Exception {
String service = "parkhub.ticket.bindPeriod";

Map<String, String> paramMap = getOrderMap();
Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put("tradeId", tradeId);
paramMap.put("outTicketNo", outTicketNo);
paramMap.put("accountId", accountId);
@@ -463,7 +448,7 @@ public class TJDCarUtil {
String tradeId, String ticketid) throws Exception {
String service = "parkhub.ticket.unbind";

Map<String, String> paramMap = getOrderMap();
Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put("tradeId", tradeId);
paramMap.put("ticketid", ticketid);
paramMap.put("charset", "utf-8");


Loading…
Cancel
Save