liujie
2026-03-24 3f9649b1c963ccf83d7fb4bd124a2b6404a62220
支付对接
1个文件已添加
361 ■■■■■ 已修改文件
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/CbyzxPayUtil.java 361 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/CbyzxPayUtil.java
New file
@@ -0,0 +1,361 @@
package com.stylefeng.guns.modular.system.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
/**
 * 创博优支付工具类
 * 目前仅实现创建支付单接口。
 */
public class CbyzxPayUtil {
    /**
     * 测试环境域名
     */
    public static final String TEST_BASE_URL = "https://test-api-pay.cbyzx.com";
    /**
     * 创建支付单接口
     */
    public static final String CREATE_PAY_ORDER_PATH = "/api/inner/pay/create";
    public static final String CLOSE_PAY_ORDER_PATH = "/api/inner/pay/close";
    private static final String PAYMENT_ORDER_TYPE = "PAYMENT_ORDER";
    private static final String DEFAULT_CURRENCY = "CNY";
    private static final String DEFAULT_PAY_CHANNEL_CODE = "ykdride-wxmini";
    private static final String DEFAULT_TENANT = "gz.zuny.ykdride.platform";
    private CbyzxPayUtil() {
    }
    /**
     * 创建支付单
     *
     * @param request 请求参数
     * @return 接口响应
     */
    public static JSONObject createPayOrder(CreatePayOrderRequest request) {
        return createPayOrder(TEST_BASE_URL, request);
    }
    /**
     * 创建支付单
     *
     * @param baseUrl 域名
     * @param request 请求参数
     * @return 接口响应
     */
    public static JSONObject createPayOrder(String baseUrl, CreatePayOrderRequest request) {
        validateCreatePayOrderRequest(request);
        return postForJson(baseUrl, CREATE_PAY_ORDER_PATH, request.toParamMap(), "create pay order");
    }
    /**
     *
     * 关闭支付单
     * @param request
     * @return
     */
    public static JSONObject closePayOrder(ClosePayOrderRequest request) {
        return closePayOrder(TEST_BASE_URL, request);
    }
    public static JSONObject closePayOrder(String baseUrl, ClosePayOrderRequest request) {
        validateClosePayOrderRequest(request);
        return postForJson(baseUrl, CLOSE_PAY_ORDER_PATH, request.toParamMap(), "close pay order");
    }
    private static JSONObject postForJson(String baseUrl, String path, Map<String, Object> params, String actionName) {
        HttpClientUtil httpClientUtil = new HttpClientUtil();
        String responseText = httpClientUtil.pushHttpRequset(
                "POST",
                buildUrl(baseUrl, path),
                params,
                buildJsonHeader(),
                "json"
        );
        if (!StringUtils.hasText(responseText)) {
            throw new IllegalStateException(actionName + " failed: empty response");
        }
        try {
            return JSON.parseObject(responseText);
        } catch (Exception ex) {
            JSONObject result = new JSONObject();
            result.put("success", false);
            result.put("rawResponse", responseText);
            result.put("message", "response is not json");
            return result;
        }
    }
    private static Map<String, String> buildJsonHeader() {
        Map<String, String> header = new LinkedHashMap<>();
        header.put("Content-Type", "application/json;charset=UTF-8");
        header.put("Accept", "application/json");
        return header;
    }
    private static String buildUrl(String baseUrl, String path) {
        String finalBaseUrl = baseUrl;
        if (!StringUtils.hasText(finalBaseUrl)) {
            finalBaseUrl = TEST_BASE_URL;
        }
        if (finalBaseUrl.endsWith("/")) {
            finalBaseUrl = finalBaseUrl.substring(0, finalBaseUrl.length() - 1);
        }
        return finalBaseUrl + path;
    }
    private static void validateCreatePayOrderRequest(CreatePayOrderRequest request) {
        if (request == null) {
            throw new IllegalArgumentException("request must not be null");
        }
        if (!StringUtils.hasText(request.getTenant())) {
            throw new IllegalArgumentException("tenant must not be blank");
        }
        if (!StringUtils.hasText(request.getPaymentOrderType())) {
            throw new IllegalArgumentException("paymentOrderType must not be blank");
        }
        if (!StringUtils.hasText(request.getOutRequestNo())) {
            throw new IllegalArgumentException("outRequestNo must not be blank");
        }
        if (request.getPaymentOrderAmount() == null) {
            throw new IllegalArgumentException("paymentOrderAmount must not be null");
        }
        if (!StringUtils.hasText(request.getCurrency())) {
            throw new IllegalArgumentException("currency must not be blank");
        }
        if (request.getBuyerId() == null) {
            throw new IllegalArgumentException("buyerId must not be null");
        }
        if (!StringUtils.hasText(request.getOpenId())) {
            throw new IllegalArgumentException("openId must not be blank");
        }
        if (!StringUtils.hasText(request.getStoreIds())) {
            throw new IllegalArgumentException("storeIds must not be blank");
        }
        if (!StringUtils.hasText(request.getPayChannelCode())) {
            throw new IllegalArgumentException("payChannelCode must not be blank");
        }
        if (!StringUtils.hasText(request.getPayEndTime())) {
            throw new IllegalArgumentException("payEndTime must not be blank");
        }
        if (!StringUtils.hasText(request.getCallbackUrl())) {
            throw new IllegalArgumentException("callbackUrl must not be blank");
        }
    }
    private static void validateClosePayOrderRequest(ClosePayOrderRequest request) {
        if (request == null) {
            throw new IllegalArgumentException("request must not be null");
        }
        if (!StringUtils.hasText(request.getTenant())) {
            throw new IllegalArgumentException("tenant must not be blank");
        }
        if (!StringUtils.hasText(request.getOutRequestNo())) {
            throw new IllegalArgumentException("outRequestNo must not be blank");
        }
    }
    /**
     * 构造一份本地测试数据
     */
    public static CreatePayOrderRequest mockRequest() {
        CreatePayOrderRequest request = new CreatePayOrderRequest();
        request.setTenant(DEFAULT_TENANT);
        request.setPaymentOrderType(PAYMENT_ORDER_TYPE);
        request.setOutRequestNo("TEST" + System.currentTimeMillis());
        request.setPaymentOrderAmount(new BigDecimal("100"));
        request.setCurrency(DEFAULT_CURRENCY);
        request.setBuyerId(10001L);
        request.setOpenId("oMockOpenId123456789");
        request.setStoreIds("[246]");
        request.setPayChannelCode(DEFAULT_PAY_CHANNEL_CODE);
        request.setPayEndTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis() + 30L * 60L * 1000L)));
        request.setCallbackUrl("http://127.0.0.1:8080/pay/mockCallback");
        return request;
    }
    public static ClosePayOrderRequest mockCloseRequest(String outRequestNo) {
        ClosePayOrderRequest request = new ClosePayOrderRequest();
        request.setTenant(DEFAULT_TENANT);
        request.setOutRequestNo(outRequestNo);
        return request;
    }
    public static void main(String[] args) {
        CreatePayOrderRequest request = mockRequest();
        System.out.println("request url: " + buildUrl(TEST_BASE_URL, CREATE_PAY_ORDER_PATH));
        System.out.println("request body: " + JSON.toJSONString(request.toParamMap(), true));
        try {
            JSONObject response = createPayOrder(request);
            System.out.println("response body: " + JSON.toJSONString(response, true));
        } catch (Exception ex) {
            System.err.println("request failed: " + ex.getMessage());
            ex.printStackTrace();
        }
    }
    /**
     * 创建支付单请求参数
     */
    public static class CreatePayOrderRequest {
        private String tenant;
        private String paymentOrderType;
        private String outRequestNo;
        private BigDecimal paymentOrderAmount;
        private String currency;
        private Long buyerId;
        private String openId;
        private String storeIds;
        private String payChannelCode;
        private String payEndTime;
        private String callbackUrl;
        public Map<String, Object> toParamMap() {
            Map<String, Object> params = new LinkedHashMap<>();
            params.put("tenant", tenant);
            params.put("paymentOrderType", paymentOrderType);
            params.put("outRequestNo", outRequestNo);
            params.put("paymentOrderAmount", paymentOrderAmount);
            params.put("currency", currency);
            params.put("buyerId", buyerId);
            params.put("openId", openId);
            params.put("storeIds", storeIds);
            params.put("payChannelCode", payChannelCode);
            params.put("payEndTime", payEndTime);
            params.put("callbackUrl", callbackUrl);
            return params;
        }
        public String getTenant() {
            return tenant;
        }
        public void setTenant(String tenant) {
            this.tenant = tenant;
        }
        public String getPaymentOrderType() {
            return paymentOrderType;
        }
        public void setPaymentOrderType(String paymentOrderType) {
            this.paymentOrderType = paymentOrderType;
        }
        public String getOutRequestNo() {
            return outRequestNo;
        }
        public void setOutRequestNo(String outRequestNo) {
            this.outRequestNo = outRequestNo;
        }
        public BigDecimal getPaymentOrderAmount() {
            return paymentOrderAmount;
        }
        public void setPaymentOrderAmount(BigDecimal paymentOrderAmount) {
            this.paymentOrderAmount = paymentOrderAmount;
        }
        public String getCurrency() {
            return currency;
        }
        public void setCurrency(String currency) {
            this.currency = currency;
        }
        public Long getBuyerId() {
            return buyerId;
        }
        public void setBuyerId(Long buyerId) {
            this.buyerId = buyerId;
        }
        public String getOpenId() {
            return openId;
        }
        public void setOpenId(String openId) {
            this.openId = openId;
        }
        public String getStoreIds() {
            return storeIds;
        }
        public void setStoreIds(String storeIds) {
            this.storeIds = storeIds;
        }
        public String getPayChannelCode() {
            return payChannelCode;
        }
        public void setPayChannelCode(String payChannelCode) {
            this.payChannelCode = payChannelCode;
        }
        public String getPayEndTime() {
            return payEndTime;
        }
        public void setPayEndTime(String payEndTime) {
            this.payEndTime = payEndTime;
        }
        public String getCallbackUrl() {
            return callbackUrl;
        }
        public void setCallbackUrl(String callbackUrl) {
            this.callbackUrl = callbackUrl;
        }
    }
    public static class ClosePayOrderRequest {
        private String tenant;
        private String outRequestNo;
        public Map<String, Object> toParamMap() {
            Map<String, Object> params = new LinkedHashMap<>();
            params.put("tenant", tenant);
            params.put("outRequestNo", outRequestNo);
            return params;
        }
        public String getTenant() {
            return tenant;
        }
        public void setTenant(String tenant) {
            this.tenant = tenant;
        }
        public String getOutRequestNo() {
            return outRequestNo;
        }
        public void setOutRequestNo(String outRequestNo) {
            this.outRequestNo = outRequestNo;
        }
    }
}