支付對賬怎麼做?把訂單、手續費、退款和提現與銀行流水一一對上
支付對賬實操指南:訂單與付款怎麼對、用資金流水解釋餘額、提現怎麼和銀行到賬對上,以及常見的對不上的原因。
支付對賬就是核對三份記錄是否一致:你系統裏的訂單、支付服務商説它收到的款項,以及真正到達你銀行的錢。它們永遠不會逐行相等:手續費要扣、退款和拒付會把錢退回去、一次提現會把很多筆付款合併成一筆轉賬。所以對賬不是指望沒有差異,而是要解釋清楚每一處差異。
這篇文章把支付對賬拆成可以每天執行的三步,説明每一步該用 KukoPay 的哪些數據,並列出最常見的對不上的情況和原因。
為什麼提現金額和銷售額對不上?
因為從一筆銷售到一筆銀行入賬,錢要移動好幾次:
- 手續費在付款入賬時扣除,所以你的餘額增加的是淨額,而不是訂單金額;
- 退款和拒付會把錢再拿出去,有時還會先凍結;
- 提現把很多筆付款合併成一筆轉賬,而且有自己的手續費;
- 時間不同:付款立即入賬,但要等上游結算後才變為可提現,見 支付結算是什麼;
- 幣種分開:USD、HKD 和 CNY 是各自獨立的餘額,分別提現,平台不做自動換匯。
對賬要逐層分開核對,而不是拿一個月的銷售額去和銀行對賬單比。
第一步:訂單與付款對賬
要回答的問題:我認為已付款的每一筆訂單,是不是真的付了,並且沒有多出別的?
- 用訂單號匹配,永遠不要用
payment_id。 買家更換支付方式時,一筆訂單可能經歷多次支付嘗試,所以payment_id會變。請使用你的out_trade_no和 KukoPay 的trade_no。 - 已付款就是
status: "paid"(之後可能變為partially_refunded/refunded)。pending、failed和expired的訂單都沒有收到錢。 - 拉取這段時間的訂單:用
GET /v1/orders按創建時間篩選,或者導出 CSV(見下文)。再和你系統裏根據payment.succeededWebhook 標記為已付款的訂單對比。
KukoPay 上已付款、而你的系統裏沒有的,説明漏收了回調:從 事件接口 補回即可,原因排查見 收不到支付 Webhook 回調怎麼辦。
第二步:用資金流水核對餘額
要回答的問題:我能解釋餘額的每一次變化嗎?
資金流水 把每一次變動記錄為一行帶符號的記錄。把一段時間內的 amount 加起來,正好等於這段時間可用餘額的變化,所以賬本可以從第一行開始解釋整個餘額。
| 類型 | 含義 | 方向 |
|---|---|---|
payment_credit | 一筆付款,按訂單全額記錄 | + |
fee_debit | 這筆付款的手續費 | − |
refund_freeze / refund_debit / refund_unfreeze | 退款受理、確認,或被拒後退回 | − / − / + |
dispute_freeze / dispute_debit / dispute_unfreeze / dispute_fee | 拒付開案、敗訴、勝訴或被撤銷,以及拒付處理費 | − / − / + / − |
payout_freeze / payout_success / payout_fee / payout_unfreeze | 提現申請、完成、手續費,或被駁回後退回 | − / − / − / + |
manual_adjustment | 平台人工調賬(僅正式環境),原因寫在 description 裏 | ± |
三個能省下大量時間的細節:
- 一筆成功付款是兩行:
payment_credit加fee_debit,兩者之差就是入賬淨額。通過reference_id把這兩行和訂單對上,它記錄的是訂單號、退款號、拒付號或提現號。 balance_before/balance_after記錄的是可用餘額。 凍結會讓可用餘額下降、凍結餘額上升;從凍結中扣賬時可用餘額不變,所以這一行的前後值相等。- 手續費是快照。 每筆已支付訂單都帶有
fee_details(渠道、比例費率、固定費),記錄的是當時實際適用的費率,所以之後調價不會改變過去的付款。計算方式見 跨境收款手續費怎麼算。
第三步:提現與銀行到賬對賬
要回答的問題:每一筆轉入我銀行的錢,都能對應到一筆提現嗎?
一筆提現在流水裏表現為:申請時一行 payout_freeze,完成時一行 payout_success(轉出的淨額)和一行 payout_fee(固定 $5.00),reference_id 都是提現單號。到賬金額為提現金額減 $5.00,所以提現 $1,000.00 到賬 $995.00。
- 用提現去對銀行到賬,而不是用付款。 一筆到賬就是一筆提現,裏面可能包含幾百筆付款。
processing不等於已到賬。 正式提現先審核、後轉賬;只有轉賬完成並登記了銀行流水號,才會變為success。在那之前不要把它記為已收到。狀態説明見 提現出金。
把所有數據導出成 CSV
訂單、退款、拒付和資金流水都可以用 format=csv 導出:
curl -G "https://api.kukopay.com/v1/balance_transactions" \
-H "X-Api-Key: $KUKOPAY_API_KEY" \
-d format=csv \
-d "created[gte]=2026-11-01T00:00:00Z" \
-d "created[lte]=2026-11-30T23:59:59Z" \
-o 2026-11-對賬.csv- 文件帶 UTF-8 BOM,Excel 直接打開不會亂碼,金額已換算成兩位小數,可以直接求和。
- 每次導出最多返回 10,000 行,並且單獨限制為每分鐘 10 次,長時間段請用更小的
created[gte]/created[lte]窗口分段導出。 - 以
=、+、-、@開頭的文本字段會自動加一個前導單引號,防止被表格軟件當成公式執行。這是有意為之,不是數據錯誤。
如果是自動化任務,JSON 列表使用游標分頁(limit、starting_after),翻頁期間新增的記錄不會被跳過。見 列表、分頁與導出。
每日支付對賬流程
拉取昨天已付款的訂單和支付事件
和你系統裏已履約的訂單對比。補回漏掉的事件;你已經履約、但實際沒有付款的訂單要逐筆核查。
按幣種拉取昨天的資金流水
確認 amount 之和等於可用餘額的變化,並且每一行的 reference_id 都能對應到你知道的訂單、退款、拒付或提現。
把新的銀行到賬和已完成的提現對上
每一筆到賬都應該等於一行 payout_success;payout_fee 記為費用。
檢查仍未結束的項目
處理中的退款、未結案的拒付和 processing 中的提現都不是錯誤,而是在途資金。記下來,明天再核對一次。
常見的對不上的情況和原因
| 你看到的現象 | 通常的原因 |
|---|---|
| KukoPay 上已付款,你的系統裏未付款 | 漏收了回調,從事件接口補回 |
| 訂單關閉後買家又被扣了款 | 罕見的延遲付款:已自動全額退回,並發送 payment.duplicate_refunded,你的餘額不受影響 |
| 餘額低於銷售額減手續費 | 有退款、未結案的拒付或提現被凍結 |
| 可用餘額為負數 | 有未結案的拒付;提現要等後續收款補平,見 信用卡拒付是什麼 |
| 已申請退款,餘額還沒扣 | 退款處於 pending,確認前處於凍結狀態,見 部分退款怎麼操作 |
| 提現已批准,銀行沒到賬 | 處於 processing,轉賬還沒有完成 |
| 跨幣種的合計對不上 | 每個幣種是獨立的餘額,請分幣種對賬 |
在沙箱裏演練對賬
沙箱賬本從每個幣種一行 5,000.00 的 opening_balance 開始,補充測試資金 會記一行 sandbox_top_up,這兩種都是正常記錄,不是異常。沙箱提現會立即完成,記下的流水和正式提現最終的一樣。做幾筆付款、一筆部分退款和一筆提現,導出流水,在真金白銀流動之前先對一遍賬;測試場景見 支付測試卡號大全。
總結
- 支付對賬分三層:訂單對付款、餘額對流水、提現對銀行到賬;
- 用
trade_no/out_trade_no匹配,永遠不要用payment_id,漏掉的付款從事件接口補回; - 資金流水逐行解釋餘額,一筆付款是
payment_credit加fee_debit; - 一筆銀行到賬就是一筆提現,金額為提現金額減 $5.00,在
success而不是processing時記賬; - 用
format=csv分段導出,每次最多 10,000 行,並且分幣種對賬。
在沙箱裏把它跑通
註冊商戶後即可申請測試密鑰,不需要等待資質審核。