diff --git a/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java index 2eac1e2..c8bc1a6 100644 --- a/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java @@ -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 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 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 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 processRefund(Map data) throws Exception { - // 请求头(需要根据业务生成 Authorization Token) - Map 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 responseMap = JSONObject.parseObject(response, Map.class); - return responseMap; - } /** * 生成退款请求token