import request from "@/utils/request"; /************************************************* *************** 平台端支付模块接口 *************** * 业务:平台向租户收取平台使用费,资金直接进平台对公账户; * 不涉及退款流程(仅保留后台手动原路退回兜底); * 推广佣金为平台自有资金支出,与收款解耦;不跨境。 *************************************************/ /** * 支付模块接口前缀。 * 需求约定里接口写作 /api/payment/*、/api/commission/*, * 但本项目平台端接口统一走 /platform 前缀(vite.config.js 的 dev 代理也只转发 /platform、/backend)。 * 若后端最终把支付路由挂在 /api 下,只需要改下面这两个常量。 */ const PAY = "/platform/payment"; const COMMISSION = "/platform/commission"; /* ================= 支付单 ================= */ /** * 创建支付单 * TODO: 后端实现 POST /api/payment/create * 约定入参:{ out_trade_no, tenant_id, order_type, amount(分), channel, subject, return_url, client_ip } * 约定返回:{ pay_no, channel, pay_params } pay_params 交给前端拉起渠道支付 * @param {Object} data 下单参数 * @returns {Promise} */ export function createPayment(data) { return request({ url: `${PAY}/create`, method: "post", data, }); } /** * 查询支付单(本地库) * TODO: 后端实现 GET /api/payment/query/:payNo * @param {string} payNo 支付单号 * @param {Object} [params] { sync: true } 时同步渠道最新状态后再返回 * @returns {Promise} */ export function queryPayment(payNo, params = {}) { return request({ url: `${PAY}/query/${payNo}`, method: "get", params, }); } /** * 手动原路退回(兜底,不做业务层退款流程) * TODO: 后端实现 POST /api/payment/refund * @param {Object} data { pay_no, amount(分), reason } * @returns {Promise} */ export function refundPayment(data) { return request({ url: `${PAY}/refund`, method: "post", data, }); } /** * 支付单列表 * TODO: 后端实现 GET /api/payment/orders * @param {Object} params { page, pageSize, tenant_id, channel, status, start_time, end_time } * @returns {Promise} */ export function getOrders(params) { return request({ url: `${PAY}/orders`, method: "get", params, }); } /** * 支付单详情(含状态流转记录) * TODO: 后端实现 GET /api/payment/orders/:payNo * @param {string} payNo 支付单号 * @returns {Promise} */ export function getOrderDetail(payNo) { return request({ url: `${PAY}/orders/${payNo}`, method: "get", }); } /* ================= 渠道配置 ================= */ /** * 渠道配置列表(首页概览用) * TODO: 后端实现 GET /api/payment/channels * @returns {Promise} */ export function getChannelList() { return request({ url: `${PAY}/channels`, method: "get", }); } /** * 获取单个渠道配置 * TODO: 后端实现 GET /api/payment/channels/:channel * 注意:敏感字段(密钥/私钥/Secret)后端只返回掩码,前端提交时掩码值应原样回传表示“不修改” * @param {string} channel 渠道标识 wechat / alipay / unionpay / cloudpay / paypal * @returns {Promise} */ export function getChannelConfig(channel) { return request({ url: `${PAY}/channels/${channel}`, method: "get", }); } /** * 保存渠道配置 * TODO: 后端实现 POST /api/payment/channels/:channel * @param {string} channel 渠道标识 * @param {Object} data 渠道参数 * @returns {Promise} */ export function saveChannelConfig(channel, data) { return request({ url: `${PAY}/channels/${channel}`, method: "post", data, }); } /** * 测试渠道连通性(校验参数 + 渠道鉴权) * TODO: 后端实现 POST /api/payment/channels/:channel/test * @param {string} channel 渠道标识 * @param {Object} [data] 未保存的参数可一并提交 * @returns {Promise} */ export function testChannelConnection(channel, data) { return request({ url: `${PAY}/channels/${channel}/test`, method: "post", data, }); } /** * 启用 / 停用渠道 * TODO: 后端实现 POST /api/payment/channels/:channel/status * @param {string} channel 渠道标识 * @param {boolean} enabled 是否启用 * @returns {Promise} */ export function toggleChannel(channel, enabled) { return request({ url: `${PAY}/channels/${channel}/status`, method: "post", data: { enabled }, }); } /** * 上传渠道证书(微信 apiclient_cert.pem / apiclient_key.pem、银联证书等) * TODO: 后端实现 POST /api/payment/channels/:channel/certificate * @param {string} channel 渠道标识 * @param {File} file 证书文件 * @param {string} [certType] 证书类型 cert / key * @returns {Promise} */ export function uploadChannelCert(channel, file, certType = "cert") { const formData = new FormData(); formData.append("file", file); formData.append("cert_type", certType); return request({ url: `${PAY}/channels/${channel}/certificate`, method: "post", data: formData, timeout: 0, }); } /* ================= 推广佣金 ================= */ /** * 佣金台账列表 * TODO: 后端实现 GET /api/commission/list * @param {Object} params { page, pageSize, promoter, status, start_time, end_time } * @returns {Promise} */ export function getCommissionList(params) { return request({ url: `${COMMISSION}/list`, method: "get", params, }); } /** * 佣金统计(应付总额 / 已付总额 / 待处理笔数) * TODO: 后端实现 GET /api/commission/stats * @param {Object} [params] 统计维度(时间范围等) * @returns {Promise} */ export function getCommissionStats(params) { return request({ url: `${COMMISSION}/stats`, method: "get", params, }); } /** * 标记佣金已发放 * TODO: 后端实现 POST /api/commission/:id/pay * @param {number|string} id 佣金单 id * @param {Object} [data] { pay_method, remark } * @returns {Promise} */ export function markCommissionPaid(id, data = {}) { return request({ url: `${COMMISSION}/markPaid/${id}`, method: "post", data, }); } /** * 佣金规则列表 * TODO: 后端实现 GET /api/commission/rules * @param {Object} [params] { page, pageSize, keyword } * @returns {Promise} */ export function getCommissionRules(params) { return request({ url: `${COMMISSION}/rules`, method: "get", params, }); } /** * 新增佣金规则 * TODO: 后端实现 POST /api/commission/rules * @param {Object} data 规则数据 * @returns {Promise} */ export function saveCommissionRule(data) { return request({ url: `${COMMISSION}/rules`, method: "post", data, }); } /** * 更新佣金规则 * TODO: 后端实现 POST /api/commission/rules/:id * @param {number|string} id 规则 id * @param {Object} data 规则数据 * @returns {Promise} */ export function updateCommissionRule(id, data) { return request({ url: `${COMMISSION}/rules/${id}`, method: "post", data, }); } /** * 删除佣金规则 * TODO: 后端实现 DELETE /api/commission/rules/:id * @param {number|string} id 规则 id * @returns {Promise} */ export function deleteCommissionRule(id) { return request({ url: `${COMMISSION}/rules/${id}`, method: "delete", }); } /** * 启用 / 停用佣金规则 * TODO: 后端实现 POST /api/commission/rules/:id/status * @param {number|string} id 规则 id * @param {number} status 1 启用 / 0 停用 * @returns {Promise} */ export function toggleCommissionRule(id, status) { return request({ url: `${COMMISSION}/rules/${id}/status`, method: "post", data: { status }, }); } /* ================= 对账 ================= */ /** * 对账差异列表 * TODO: 后端实现 GET /api/payment/reconcile * @param {Object} params { page, pageSize, channel, reconcile_date, diff_type, handle_status } * @returns {Promise} */ export function getReconcileList(params) { return request({ url: `${PAY}/reconcile`, method: "get", params, }); } /** * 标记对账差异已处理 * TODO: 后端实现 POST /api/payment/reconcile/:id/handle * @param {number|string} id 差异记录 id * @param {Object} [data] { handle_type, remark } * @returns {Promise} */ export function markReconcileHandled(id, data = {}) { return request({ url: `${PAY}/reconcile/handle/${id}`, method: "post", data, }); }