退款
This commit is contained in:
parent
5249cc2cc8
commit
d646a8a542
@ -15,6 +15,10 @@ import com.wechat.pay.java.service.partnerpayments.jsapi.model.Transaction;
|
|||||||
import com.wechat.pay.java.service.payments.jsapi.JsapiService;
|
import com.wechat.pay.java.service.payments.jsapi.JsapiService;
|
||||||
import com.wechat.pay.java.service.payments.jsapi.model.*;
|
import com.wechat.pay.java.service.payments.jsapi.model.*;
|
||||||
import com.wechat.pay.java.service.payments.model.TransactionAmount;
|
import com.wechat.pay.java.service.payments.model.TransactionAmount;
|
||||||
|
import com.wechat.pay.java.service.refund.RefundService;
|
||||||
|
import com.wechat.pay.java.service.refund.model.AmountReq;
|
||||||
|
import com.wechat.pay.java.service.refund.model.CreateRequest;
|
||||||
|
import com.wechat.pay.java.service.refund.model.Refund;
|
||||||
import com.ycwl.basic.config.WechatConfig;
|
import com.ycwl.basic.config.WechatConfig;
|
||||||
import com.ycwl.basic.constant.HttpConstant;
|
import com.ycwl.basic.constant.HttpConstant;
|
||||||
import com.ycwl.basic.constant.NumberConstant;
|
import com.ycwl.basic.constant.NumberConstant;
|
||||||
@ -58,6 +62,7 @@ import java.util.stream.Collectors;
|
|||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static com.wechat.pay.java.core.http.Constant.*;
|
import static com.wechat.pay.java.core.http.Constant.*;
|
||||||
|
import static com.wechat.pay.java.service.refund.model.Status.SUCCESS;
|
||||||
import static com.ycwl.basic.constant.WeiXinConstant.*;
|
import static com.ycwl.basic.constant.WeiXinConstant.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -244,23 +249,28 @@ public class WxPayServiceImpl implements WxPayService {
|
|||||||
public Boolean refundOrder(String orderId) throws Exception {
|
public Boolean refundOrder(String orderId) throws Exception {
|
||||||
OrderRespVO orderDetail = orderService.detail(Long.parseLong(orderId)).getData();
|
OrderRespVO orderDetail = orderService.detail(Long.parseLong(orderId)).getData();
|
||||||
BigDecimal payPrice = orderDetail.getPayPrice();
|
BigDecimal payPrice = orderDetail.getPayPrice();
|
||||||
int priceInCents = payPrice.multiply(new BigDecimal(NumberConstant.HUNDRED)).intValue(); // 转换为分(int)
|
long priceInCents = payPrice.multiply(new BigDecimal(NumberConstant.HUNDRED)).longValue(); // 转换为分(int)
|
||||||
// 构建退款请求参数
|
|
||||||
Map<String, Object> data = new HashMap<>();
|
|
||||||
data.put(WECHATPAY_OUT_TRADE_NO, orderId);// 你要退款的订单号
|
|
||||||
data.put(WECHATPAY_OUT_REFUND_NO, SnowFlakeUtil.getId()); // 退款订单号(随机生成一个就行,保证不重复)
|
|
||||||
|
|
||||||
Map<String, Object> amount = new HashMap<>();
|
Config config =
|
||||||
amount.put(WECHATPAY_REFUND, priceInCents); // 退款金额(以分为单位)
|
new RSAAutoCertificateConfig.Builder()
|
||||||
amount.put(WECHATPAY_TOTAL, priceInCents); // 订单总金额(以分为单位)
|
.merchantId(wechatConfig.getMchId())
|
||||||
amount.put(WECHATPAY_CURRENCY, WECHATPAY_CURRENCY_CNY);
|
// 使用 com.wechat.pay.java.core.util 中的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
|
||||||
data.put(WECHATPAY_AMOUNT, amount);
|
.privateKey(wechatConfig.getKeyPath())
|
||||||
|
.merchantSerialNumber(wechatConfig.getMchSerialNo())
|
||||||
// 回调通知 URL
|
.apiV3Key(wechatConfig.getApiV3())
|
||||||
data.put(WECHATPAY_NOTIFY_URL, wechatConfig.getRefundNotifyUrl());
|
.build();
|
||||||
Map<String, Object> stringObjectMap = this.processRefund(data);
|
RefundService service = new RefundService.Builder().config(config).build();
|
||||||
if (stringObjectMap.get(WECHATPAY_STATUS).equals(WECHATPAY_SUCCESS)
|
CreateRequest request = new CreateRequest();
|
||||||
|| stringObjectMap.get(WECHATPAY_STATUS).equals(WECHATPAY_PROCESSING)) {
|
request.setNotifyUrl(wechatConfig.getRefundNotifyUrl());
|
||||||
|
AmountReq amountReq = new AmountReq();
|
||||||
|
amountReq.setTotal(priceInCents);
|
||||||
|
amountReq.setRefund(priceInCents);
|
||||||
|
amountReq.setCurrency(WECHATPAY_CURRENCY_CNY);
|
||||||
|
request.setAmount(amountReq);
|
||||||
|
request.setOutTradeNo(orderId);
|
||||||
|
request.setOutRefundNo(SnowFlakeUtil.getId());
|
||||||
|
Refund refundResult = service.create(request);
|
||||||
|
if (refundResult.getStatus() == SUCCESS) {
|
||||||
orderService.updateOrderState(Long.parseLong(orderId), OrderStateEnum.REFUNDED, null);
|
orderService.updateOrderState(Long.parseLong(orderId), OrderStateEnum.REFUNDED, null);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
@ -353,30 +363,6 @@ public class WxPayServiceImpl implements WxPayService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 发起退款
|
|
||||||
*
|
|
||||||
* @param data 退款请求参数
|
|
||||||
* @return
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public Map<String, Object> processRefund(Map<String, Object> data) throws Exception {
|
|
||||||
// 请求头(需要根据业务生成 Authorization Token)
|
|
||||||
Map<String, String> headers = new HashMap<>();
|
|
||||||
headers.put(HttpConstant.Authorization, getToken(String.valueOf(HttpMethod.POST), REFUNDS_URL, JSONObject.toJSONString(data)));
|
|
||||||
headers.put(HttpConstant.Accept, HttpConstant.Application_Json);
|
|
||||||
headers.put(HttpConstant.Content_Type, HttpConstant.Application_Json);
|
|
||||||
|
|
||||||
// 请求体数据
|
|
||||||
String jsonData = JSONObject.toJSONString(data);
|
|
||||||
|
|
||||||
// 执行 POST 请求
|
|
||||||
String response = httpService.doPost(REFUNDS_URL, jsonData, headers, String.valueOf(StandardCharsets.UTF_8));
|
|
||||||
|
|
||||||
// 将响应字符串解析为 Map
|
|
||||||
Map<String, Object> responseMap = JSONObject.parseObject(response, Map.class);
|
|
||||||
return responseMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成退款请求token
|
* 生成退款请求token
|
||||||
|
Loading…
x
Reference in New Issue
Block a user