package com.stylefeng.guns.modular.huifu.biz; import com.alibaba.fastjson.JSONObject; import com.huifu.bspay.sdk.opps.core.BasePay; import com.huifu.bspay.sdk.opps.core.config.MerConfig; import com.huifu.bspay.sdk.opps.core.net.BasePayRequest; import com.stylefeng.guns.core.util.DateUtil; import com.stylefeng.guns.modular.huifu.properties.HuiFuProperties; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * 斗拱提现业务 * @author mitao * @date 2025/11/21 */ @Slf4j @Component public class DouGongRefundBiz { @Autowired private HuiFuProperties huiFuProperties; @Value("${callbackPath}") private String callbackPath; /** * 交易退款接口 * * @param reqSeqId 请求流水号,同一huifu_id下当天唯一 * @param ordAmt 申请退款金额,单位元 * @param orgReqDate 原交易请求日期,格式yyyyMMdd * @param orgReqSeqId 原交易请求流水号(三选一) * @param type 类型 1:小件物流;2:跨城出行 * @return 请求结果 */ public Map refund(String reqSeqId, BigDecimal ordAmt, String orgReqDate, String orgReqSeqId, Integer type) throws Exception { log.info("开始调用斗拱退款接口, 退款金额: {}", ordAmt); // 1. 数据初始化,填入对应的商户配置 MerConfig merConfig = new MerConfig(); merConfig.setProcutId(huiFuProperties.getProductId()); merConfig.setSysId(huiFuProperties.getSysId()); merConfig.setRsaPrivateKey(huiFuProperties.getRsaPrivateKey()); merConfig.setRsaPublicKey(huiFuProperties.getRsaPublicKey()); BasePay.initWithMerConfig(merConfig); // 构建业务参数data // 2.组装请求参数 Map data = new HashMap<>(); data.put("req_date", DateUtil.format(new Date(),"yyyyMMdd")); data.put("req_seq_id", reqSeqId); data.put("huifu_id", huiFuProperties.getSysId()); data.put("ord_amt", ordAmt.setScale(2, RoundingMode.HALF_UP).toString()); data.put("org_req_date", orgReqDate); // 三选一参数:org_hf_seq_id,org_party_order_id,org_req_seq_id data.put("org_req_seq_id", orgReqSeqId); String notifyUrl = type.equals(1) ? "/base/dougong/refund-logistics" : "/base/dougong/refund-crosscity"; data.put("notify_url", callbackPath + notifyUrl); // 发送HTTP请求 - POST JSON格式 Map response = BasePayRequest.requestBasePay("v4/trade/payment/scanpay/refund", data, null, false); log.info("斗拱退款接口响应内容: {}", JSONObject.toJSONString(response)); return response; } }