yeg
2026-09-16 8fe2249e07ebe15b33e0231cd9dafa7c303486f6
talent-card-server/src/main/java/com/talentcard/server/business/payment/huifu/HuifuMiniProgramPaymentGateway.java
@@ -11,6 +11,7 @@
import com.huifu.bspay.sdk.opps.client.BasePayClient;
import com.huifu.bspay.sdk.opps.core.BasePay;
import com.huifu.bspay.sdk.opps.core.config.MerConfig;
import com.huifu.bspay.sdk.opps.core.request.V2TradePaymentScanpayCloseRequest;
import com.huifu.bspay.sdk.opps.core.request.V3TradePaymentJspayRequest;
import com.huifu.bspay.sdk.opps.core.request.V3TradePaymentScanpayQueryRequest;
import com.talentcard.server.common.BusinessException;
@@ -101,6 +102,37 @@
        }
    }
    /**
     * 关掉一笔还没支付的预支付单。
     *
     * <p>取消订单必须落到通道侧:只在本地把流水标成已关闭,用户仍然可以拿手上那张预支付单付款,
     * 钱会收进来而订单已经取消。关单只对未支付的原交易有效,通道对一分钟以内的订单、已终态的原交易
     * 都会拒绝——拒绝原因由调用方结合 {@code org_trans_stat} 判断。
     */
    public Map<String, Object> closeMiniProgramPayment(HuifuPaymentCloseCommand command) {
        ensureConfigured();
        ensureCollectingMerchant(command.huifuId());
        initializeSdk();
        V2TradePaymentScanpayCloseRequest request = new V2TradePaymentScanpayCloseRequest();
        request.setReqDate(REQUEST_DATE.format(LocalDateTime.now()));
        request.setReqSeqId(command.requestNo());
        request.setHuifuId(command.huifuId().trim());
        request.setOrgReqDate(command.requestDate());
        Map<String, Object> extendInfo = new LinkedHashMap<>();
        extendInfo.put("org_req_seq_id", command.paymentNo());
        if (!blank(command.providerTransactionNo())) extendInfo.put("org_hf_seq_id", command.providerTransactionNo());
        request.setExtendInfo(extendInfo);
        try {
            Map<String, Object> response = BasePayClient.request(request, false);
            log.info("Huifu mini-program payment close response: paymentNo={}, response={}", command.paymentNo(), logJson(response));
            return response;
        } catch (Exception exception) {
            log.warn("Huifu mini-program payment close failed: paymentNo={}, type={}, message={}",
                    command.paymentNo(), exception.getClass().getSimpleName(), safeMessage(exception.getMessage()));
            throw new HuifuPaymentGatewayException("汇付关单失败,请稍后重试", isOutcomeUnknown(exception), exception);
        }
    }
    private void ensureConfigured() {
        if (!properties.isEnabled()) throw new BusinessException(ErrorCode.CONFLICT, "汇付支付尚未启用");
        if (blank(properties.getSystemId()) || blank(properties.getProductId()) || blank(properties.getMerchantId())