This commit is contained in:
Jerry Yan 2024-12-18 10:33:48 +08:00
parent 5249cc2cc8
commit d646a8a542

View File

@ -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.model.*;
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.constant.HttpConstant;
import com.ycwl.basic.constant.NumberConstant;
@ -58,6 +62,7 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
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.*;
/**
@ -244,23 +249,28 @@ public class WxPayServiceImpl implements WxPayService {
public Boolean refundOrder(String orderId) throws Exception {
OrderRespVO orderDetail = orderService.detail(Long.parseLong(orderId)).getData();
BigDecimal payPrice = orderDetail.getPayPrice();
int priceInCents = payPrice.multiply(new BigDecimal(NumberConstant.HUNDRED)).intValue(); // 转换为分int
// 构建退款请求参数
Map<String, Object> data = new HashMap<>();
data.put(WECHATPAY_OUT_TRADE_NO, orderId);// 你要退款的订单号
data.put(WECHATPAY_OUT_REFUND_NO, SnowFlakeUtil.getId()); // 退款订单号随机生成一个就行保证不重复
long priceInCents = payPrice.multiply(new BigDecimal(NumberConstant.HUNDRED)).longValue(); // 转换为分int
Map<String, Object> amount = new HashMap<>();
amount.put(WECHATPAY_REFUND, priceInCents); // 退款金额以分为单位
amount.put(WECHATPAY_TOTAL, priceInCents); // 订单总金额以分为单位
amount.put(WECHATPAY_CURRENCY, WECHATPAY_CURRENCY_CNY);
data.put(WECHATPAY_AMOUNT, amount);
// 回调通知 URL
data.put(WECHATPAY_NOTIFY_URL, wechatConfig.getRefundNotifyUrl());
Map<String, Object> stringObjectMap = this.processRefund(data);
if (stringObjectMap.get(WECHATPAY_STATUS).equals(WECHATPAY_SUCCESS)
|| stringObjectMap.get(WECHATPAY_STATUS).equals(WECHATPAY_PROCESSING)) {
Config config =
new RSAAutoCertificateConfig.Builder()
.merchantId(wechatConfig.getMchId())
// 使用 com.wechat.pay.java.core.util 中的函数从本地文件中加载商户私钥商户私钥会用来生成请求的签名
.privateKey(wechatConfig.getKeyPath())
.merchantSerialNumber(wechatConfig.getMchSerialNo())
.apiV3Key(wechatConfig.getApiV3())
.build();
RefundService service = new RefundService.Builder().config(config).build();
CreateRequest request = new CreateRequest();
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);
return true;
} 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