API 目錄
依金流分類查看可串接的 API。
本頁列出 PayCore 對外串接可使用的 API。每個金流可展開查看 Endpoint、可填參數、gateway_credentials、回應格式、錯誤與測試範例。
API CATALOG
PayCore 公開 API 方法目錄
本頁提供 PayCore API 串接流程、欄位說明、請求範例、回應格式與付款通知規格。
快速開始
先註冊會員並完成 Email 驗證,再由會員後台自行建立 PayCore API Key;註冊不會自動產生 Key。取得 Key 後,決定 Direct Gateway 或 All-in-One 收款專案,再呼叫建立付款 API。
API 認證
PayCore API 使用 X-API-KEY Header 驗證呼叫方;完整 Key 只會在會員後台建立成功時顯示一次,請保存於伺服器端。Direct Gateway 的金流憑證放在 gateway_credentials;PayCore AIO 則固定從 API Key 綁定配置的加密付款來源讀取,不接受客戶端覆蓋。
串接模式
Direct Gateway 適合商戶直接帶金流憑證建立付款;All-in-One 收款專案則由 PayCore 專案 API Key 統一管理付款頁與付款方式。
付款結果通知(Webhook/PayOK)
付款通知分成兩個方向:上游金流透過各自固定的 Callback URL 通知 PayCore;PayCore 驗證並更新付款後,再依該筆產單 Request 的 payok_url 通知商戶。payok_url 是商戶逐筆自訂的 HTTPS 接收網址,不是 PayCore 固定 API。
本章是 AIO 與所有 Direct Gateway 共用的完整商戶串接規格。商戶不需要、也不應直接呼叫 Provider 專用的 /api/paycore/webhooks/{gateway};該路徑只供上游金流通知 PayCore。
1. 設定接收網址
每次建立 AIO 或 Direct Gateway 付款時,可將該筆交易的商戶 HTTPS 接收網址放入 payok_url。不同交易可指定不同網址;未提供時 PayCore 不會投遞付款結果通知。
{
"merchant_order_no": "ORDER202608310001",
"amount": 2250,
"currency": "TWD",
"item_name": "PayCore test product",
"payok_url": "https://merchant.example.com/webhooks/paycore",
"success_url": "https://merchant.example.com/payment/success",
"cancel_url": "https://merchant.example.com/payment/cancel"
}- success_url 與 cancel_url 只是付款人瀏覽器的回站網址,不是付款成功證據。
- 只依已驗證的 PayCore Webhook,或付款查詢 API 回傳 status=paid 後,才可入帳、出貨或開通。
- payok_url 必須是外部可連線的 HTTPS 網域名稱;不接受 IPv4/IPv6 位址、localhost、Loopback、Private 或 Reserved IP。
2. Callback Secret 與通知 Headers
每一把 PayCore API Key 都有各自的 Callback Secret。請在會員後台的 API Key 管理頁建立並安全保存,接收端使用它驗證 PayCore 簽章。
- Callback Secret 只保存在商戶伺服器端,不可放在 JavaScript、瀏覽器、App、公開原始碼或 Log。
- Callback Secret 不等於 X-API-KEY,也不等於 Provider 的 gateway_credentials。
- 輪替 Callback Secret 後,舊 Secret 立即失效,接收端必須同步更新。
POST /webhooks/paycore HTTP/1.1
Content-Type: application/json
X-PayCore-Event-Id: evt_20260831080530ABCDEFGH
X-PayCore-Timestamp: 1788134730
X-PayCore-Signature: v1=4d7f...X-PayCore-Event-Id:事件唯一識別,用於冪等處理。X-PayCore-Timestamp:PayCore 產生通知時的 Unix 秒數。X-PayCore-Signature:使用 Callback Secret 計算的 HMAC-SHA256 簽章。
3. payment.paid Payload
PayCore 確認付款成功後會發送 payment.paid。AIO 保留對外主單;Direct Gateway 則使用實際金流與付款方式。
PayCore AIO
{
"event_id": "evt_20260831080530ABCDEFGH",
"event_type": "payment.paid",
"payment_no": "PAY20260831080000ABCDEFGH",
"merchant_order_no": "ORDER202608310001",
"gateway": "paycore",
"method": "aio",
"amount": 2250,
"currency": "twd",
"status": "paid",
"paid_at": "2026-08-31T08:05:30+08:00"
}Direct Gateway
{
"event_id": "evt_20260831081530DIRECT01",
"event_type": "payment.paid",
"payment_no": "PAY20260831081000DIRECT01",
"merchant_order_no": "ORDER202608310002",
"gateway": "ecpay",
"method": "credit",
"amount": 980,
"currency": "twd",
"status": "paid",
"paid_at": "2026-08-31T08:15:30+08:00"
}event_id:通知事件唯一識別;重送時保持不變。event_type:目前付款成功事件為 payment.paid。payment_no:PayCore 對外付款編號。merchant_order_no:商戶建立付款時提供的訂單編號。gateway、method:AIO 為 paycore/aio;Direct 使用實際金流與付款方式。amount、currency:必須與商戶原訂單再次比對。status:只有 paid 才代表 PayCore 已確認付款成功。paid_at:含時區的 ISO-8601 付款完成時間。
4. 簽章驗證與 Laravel 範例
簽章原文必須使用收到的原始 Request Body,不可先解析 JSON、重新排序欄位或重新編碼。正式環境建議拒絕與目前時間相差超過 5 分鐘的通知,並使用 hash_equals 做 Constant-Time Comparison。
signed_payload = X-PayCore-Timestamp + "." + raw_request_body
expected_signature = "v1=" + HMAC-SHA256(signed_payload, callback_secret)先將 Callback Secret 放入商戶 Laravel 專案的環境設定,並透過 config/services.php 讀取;不可直接寫死在程式碼。
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::post('/webhooks/paycore', function (Request $request) {
$rawBody = $request->getContent();
$timestamp = (string) $request->header('X-PayCore-Timestamp', '');
$eventId = (string) $request->header('X-PayCore-Event-Id', '');
$received = (string) $request->header('X-PayCore-Signature', '');
$secret = (string) config('services.paycore.callback_secret');
if (! ctype_digit($timestamp) || abs(time() - (int) $timestamp) > 300) {
return response('Invalid timestamp', 401);
}
$expected = 'v1=' . hash_hmac(
'sha256',
$timestamp . '.' . $rawBody,
$secret
);
if ($eventId === '' || ! hash_equals($expected, $received)) {
return response('Invalid signature', 401);
}
$payload = json_decode($rawBody, true, 512, JSON_THROW_ON_ERROR);
if (($payload['event_id'] ?? null) !== $eventId) {
return response('Event ID mismatch', 422);
}
if (($payload['event_type'] ?? null) !== 'payment.paid'
|| ($payload['status'] ?? null) !== 'paid') {
return response('Unsupported event', 422);
}
// Enforce idempotency with a UNIQUE event_id, verify the order and amount,
// then commit the merchant transaction before returning HTTP 2xx.
return response('OK', 200);
});5. 回覆、自動重送與冪等
商戶完成驗章與內部交易後回傳任意 HTTP 2xx。PayCore 只以 HTTP Status 判斷投遞是否成功,Response Body 不需要固定 JSON 格式。
HTTP/1.1 200 OK
Content-Type: text/plain
OK若接收端回非 2xx、連線失敗或逾時,PayCore 預設最多共投遞 5 次:
- 付款成功後立即投遞。
- 第一次失敗後 1 分鐘重送。
- 第二次失敗後 5 分鐘重送。
- 第三次失敗後 15 分鐘重送。
- 第四次失敗後 60 分鐘進行最後一次重送。
同一次事件重送時 event_id 不變,商戶必須用 event_id 建立唯一約束或等效冪等鎖,避免重複入帳、出貨或開通。
6. 商戶端處理順序與常見錯誤
- 保留原始 Request Body。
- 驗證 Timestamp 是否在允許時差內。
- 使用建立該筆付款之 API Key 對應的 Callback Secret 驗證 HMAC。
- 比對 Header 與 Body 的 event_id,並以 event_id 做冪等。
- 比對 payment_no、merchant_order_no、amount、currency 與 status=paid。
- 必要時呼叫 GET /api/paycore/payments/{paymentNo} 再次確認狀態。
- 完成商戶內部交易後才回 HTTP 2xx。
常見錯誤
- 使用解析並重新編碼後的 JSON 驗章,造成簽章不一致。
- 把 X-API-KEY、Provider HashKey 或 gateway_credentials 當成 Callback Secret。
- 收到 payment.paid 後沒有比對金額與商戶訂單編號。
- 只依 success_url 回站畫面判斷付款成功。
- 沒有用 event_id 做冪等,導致重送時重複處理。
- 尚未完成內部交易就先回 HTTP 200,導致後續失敗不再重送。
PayCore 欄位字典與金流對照
欄位名稱以 PayCore 公開 API 的原始名稱為準。payer_ip、api_request_ip、payment_page_first_ip、provider_callback_first_ip 代表不同資料來源;付款頁 IP 會在有效付款連結第一次開啟時記錄,金流 Callback IP 則在通知通過驗證後記錄。這些 IP 只表示網路來源,不代表付款人身分已經完成驗證。沒有專用金流欄位時,資料會保留於 PayCore,或寫入該金流允許的 Remark/Metadata 欄位。
建立付款 Request
| 欄位 | 來源 | 型別 | 必填 | 說明 | 範例 |
|---|---|---|---|---|---|
merchant_order_no |
API body | string|max:100 |
是 | 商戶訂單號;同一 API Key 下應保持唯一。 | ORDER202607130001 |
amount |
API body | integer|min:1 |
是 | 付款金額;實際單位與幣別限制依金流而定。 | 980 |
currency |
API body | string|max:10 |
否 | 幣別代碼,例如 TWD、USD。 | TWD |
payer_account |
API body | string|max:100 |
否 | 商戶系統內的付款人/會員識別,不是身分證號。 | member-001 |
payer_identity_no |
API body | string|max:80 |
否 | 付款人身分識別號;只交給有正式對應欄位的金流。 | A123456789 |
payer_ip |
API body | IPv4|IPv6 |
否 | API 使用者提供的實際付款人或產單情境 IP。 | 203.0.113.20 |
success_url |
API body | URL |
否 | 付款成功後可導回商戶的網址。 | https://merchant.example/success |
return_url |
API body | URL |
否 | 相容用回站網址;部分金流會在未提供 success_url 時使用此欄位。 | https://merchant.example/return |
cancel_url |
API body | URL |
否 | 付款取消或未完成時導回商戶的網址。 | https://merchant.example/cancel |
payok_url |
API body | HTTPS hostname URL |
否 | PayCore 確認付款成功後通知商戶的網址;每筆 Request 可自訂網域網址,不接受 IP 位址。 | https://merchant.example/payok |
locale |
API body | string|max:20 |
否 | 付款頁偏好語系。 | zh-tw |
item_name |
API body | string|max:200 |
否 | 商品名稱;依金流官方長度限制安全裁切。 | 測試商品 |
description |
API body | string|max:200 |
否 | 交易描述;未提供商品名稱時,部分金流會將此欄位作為商品名稱使用。 | 訂單付款 |
payer_name |
API body | string|max:100 |
否 | 付款人姓名;只有有正式對應欄位的金流才直接帶入。 | 王小明 |
payer_mobile |
API body | string|max:30 |
否 | 付款人手機號碼。 | 0912345678 |
payer_tel |
API body | string|max:30 |
否 | 付款人一般電話/市話。 | 02-12345678 |
payer_email |
API body | email|max:150 |
否 | 付款人 Email。 | [email protected] |
merchant_custom_field_1 |
API body | string|max:200 |
否 | 商戶自訂欄位 1;只映射到官方支援的欄位。 | campaign-A |
merchant_custom_field_2 |
API body | string|max:200 |
否 | 商戶自訂欄位 2;只映射到官方支援的欄位。 | note-B |
credit_installment |
API body | integer|0,3,6,12,18,24,30 |
否 | 信用卡分期期數;目前只有 GoMyPay credit 使用,0 或未填為一般交易。 | 0 |
expire_days |
API body | integer|1..60 |
否 | 離線付款有效天數。 | 7 |
expire_minutes |
API body | integer|60..43200 |
否 | 離線付款有效分鐘;有值時通常優先於 expire_days。 | 1440 |
cvs_type |
API body | enum |
否 | 超商類型;可用值依金流而定,例如 SmilePay 使用 ibon/fami,均鼎科技 GoMyPay 使用 family/ok/hilife/ibon。 | ibon |
bank_code |
API body | string|max:10 |
否 | ECPay 背景 ATM 指定銀行代碼的通用名稱。 | 007 |
atm_bank_code |
API body | string|max:10 |
否 | ECPay 背景 ATM 銀行代碼相容名稱。 | 007 |
ecpay_atm_bank_code |
API body | string|max:10 |
否 | ECPay 背景 ATM 銀行代碼專用欄位名稱。 | 007 |
cvs_code |
API body | enum |
否 | ECPay 背景超商代碼通用名稱。 | FAMILY |
ecpay_cvs_code |
API body | enum |
否 | ECPay 背景超商代碼專用欄位名稱。 | FAMILY |
desc_1 |
API body | string|max:20 |
否 | ECPay 背景付款描述欄位 1。 | |
desc_2 |
API body | string|max:20 |
否 | ECPay 背景付款描述欄位 2。 | |
desc_3 |
API body | string|max:20 |
否 | ECPay 背景付款描述欄位 3。 | |
desc_4 |
API body | string|max:20 |
否 | ECPay 背景付款描述欄位 4。 | |
gateway_credentials |
API body | object |
是 | 該金流的商店憑證;子欄位請查看各 endpoint,禁止放入備註或 Metadata。 | {...} |
PayCore 自動欄位
| 欄位 | 來源 | 型別 | 必填 | 說明 | 範例 |
|---|---|---|---|---|---|
api_request_ip |
PayCore | IPv4|IPv6|null |
否 | PayCore 在 API 產單當下由 HTTP request 自動取得的呼叫來源 IP;API 使用者不可覆寫。 | 198.51.100.10 |
payment_page_first_ip |
PayCore | IPv4|IPv6|null |
否 | 持有效付款 token 第一次開啟 PayCore show/processing/result HTML 頁面時,由 PayCore 自動取得的來源 IP;不代表已驗證真人身分。 | 203.0.113.30 |
payment_page_first_seen_at |
PayCore | datetime|null |
否 | payment_page_first_ip 第一次原子寫入的時間;刷新與 status 輪詢不會覆寫。 | 2026-07-13T10:30:00+08:00 |
provider_callback_first_ip |
PayCore | IPv4|IPv6|null |
否 | 金流商對 PayCore 的第一個已驗證 server callback 來源 IP;不包含瀏覽器 Return URL、PayOK 對外通知或無效回調。 | 192.0.2.40 |
provider_callback_first_seen_at |
PayCore | datetime|null |
否 | provider_callback_first_ip 第一次原子寫入的時間;金流重試不會覆寫。 | 2026-07-13T10:35:00+08:00 |
payment_no |
PayCore | string |
是 | PayCore 付款編號。 | PAY202607130001ABCDEFGH |
gateway |
URL / PayCore | string |
是 | 金流代號,例如 stripe、plus、pfun、gomypay、funpoint。 | stripe |
method |
URL / PayCore | string |
是 | 該金流下的付款方式 key。 | credit |
api_key_id |
PayCore | integer |
是 | 由 X-API-KEY 驗證後自動關聯的唯讀欄位;不接受從 API body 傳入。 | |
preferred_locale |
PayCore | string|null |
否 | 由 locale 或 Accept-Language 正規化後的付款頁語系。 | zh-tw |
共用 Response
| 欄位 | 來源 | 型別 | 必填 | 說明 | 範例 |
|---|---|---|---|---|---|
success |
API response | boolean |
是 | 請求是否成功。 | true |
message |
API response | string |
是 | 人類可讀的結果訊息。 | Payment created successfully |
data.payment_no |
API response | string |
是 | PayCore 付款編號。 | |
data.merchant_order_no |
API response | string |
是 | 商戶訂單號。 | |
data.gateway |
API response | string |
是 | 金流代號。 | |
data.method |
API response | string |
是 | 付款方式 key。 | |
data.amount |
API response | integer |
是 | 交易金額。 | |
data.currency |
API response | string |
是 | 交易幣別。 | |
data.status |
API response | string |
是 | PayCore 付款狀態。 | pending |
data.payment_method |
API response | string|null |
否 | PayCore 付款流程分類。 | |
data.payment_url |
API response | URL|null |
否 | PayCore 付款頁或金流導轉網址。 | |
data.payment_info |
API response | object |
否 | 金流取號、付款頁或前端初始化所需資訊;內容依金流而異。 | |
data.created |
API response | boolean |
否 | 本次是否新建交易;回傳既有有效交易時為 false。 | |
data.paid_at |
API response | datetime|null |
否 | PayCore 確認付款成功的時間。 | |
data.created_at |
API response | datetime|null |
否 | PayCore 交易建立時間。 | |
error |
API response | object|string|null |
否 | 失敗時的錯誤碼、欄位錯誤或附加內容。 | |
各金流欄位對照
「僅保存於 PayCore」表示資料會保留在 PayCore 交易紀錄中,但不會傳送至該金流。標示「備用」的欄位,只會在主要對應欄位沒有資料時使用。
| PayCore field | ECPay | SmilePay | Stripe | PayPal | PLUS | PFun | 均鼎科技 GoMyPay | FunPoint |
|---|---|---|---|---|---|---|---|---|
api_request_ip |
僅保存於 PayCore | Remark | metadata.api_request_ip | 僅保存於 PayCore | 僅保存於 PayCore | ClientIP 備用;有 payer_ip 時另寫 Remark | Buyer_Memo 備用 | Remark 備用 |
payer_ip |
僅保存於 PayCore | Remark | metadata.payer_ip | 僅保存於 PayCore | 僅保存於 PayCore | ClientIP(優先) | Buyer_Memo 備用 | Remark 備用 |
payment_page_first_ip |
僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore |
provider_callback_first_ip |
已驗證 Callback 來源 IP | 已驗證 Callback 來源 IP | 已驗證簽章來源 IP | 已驗證 Webhook 來源 IP | 已驗證 Callback 來源 IP | 已通過驗證的 Callback 來源 IP | 已驗證 str_check 來源 IP | 已驗證 CheckMacValue 來源 IP |
payer_account |
僅保存於 PayCore | Pur_name 備用 | metadata.payer_account | 僅保存於 PayCore | payName 組成 | 僅保存於 PayCore | Buyer_Memo 備用 | Remark 備用 |
payer_name |
僅保存於 PayCore | Pur_name | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | ReceiverName | Buyer_Name | Remark 備用 |
payer_mobile |
僅保存於 PayCore | Mobile_number | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | ReceiverTel(優先) | Buyer_Telm(優先) | Remark 備用 |
payer_tel |
僅保存於 PayCore | Tel_number | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | ReceiverTel 備用 | Buyer_Telm 備用 | Remark 備用 |
payer_email |
僅保存於 PayCore | receipt_email | 僅保存於 PayCore | 僅保存於 PayCore | ReceiverEmail | Buyer_Mail | Remark 備用 | |
payer_identity_no |
僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | ReceiverID | 僅保存於 PayCore | 僅保存於 PayCore |
item_name |
ItemName | Od_sob | PaymentIntent description 備用 | 商品名稱 | 僅保存於 PayCore | TradeTitle | Buyer_Memo 備用 | ItemName |
description |
TradeDesc / ItemName 備用 | Od_sob 備用 | PaymentIntent.description | 交易描述 | 僅保存於 PayCore | OrderInfo / TradeTitle 備用 | Buyer_Memo | TradeDesc / ItemName 備用 |
merchant_custom_field_1 |
僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | CustomField1 | Buyer_Memo 備用 | CustomField1 |
merchant_custom_field_2 |
僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | CustomField2 | Buyer_Memo 備用 | CustomField2 |
credit_installment |
僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | 僅保存於 PayCore | TransMode / Installment | 僅保存於 PayCore |
選擇左側 API 查看完整內容
為了避免 /developer/api 一次渲染過多表格與程式碼範例,本頁只先載入 API 目錄;點選 endpoint 後才以 AJAX 載入該 API 的完整參數表與範例。