Skip to content

建立 2026-09-14 更新 2026-09-14

安全原則

金流程式的安全,核心是:卡號不要經過你、金額不要信前端、事件不要信未驗證的 POST

PCI 合規:不要碰卡號

使用 Checkout 或 Payment Element 時,卡號在 Stripe 的 iframe 裡直接送到 Stripe。你的伺服器只會看到 pm_... 這類代號。

不要自己做 <input> 收完整卡號再 POST 到 Flask。那樣會讓你落入嚴格的 PCI 範圍,一般網站不該走這條路。

金鑰

  • Secret key 只出現在伺服器環境變數或密鑰管理服務。
  • 不要提交 .env。本站 .gitignore 已忽略 .env
  • 前端只用 publishable key。
  • 測試與正式金鑰分開;CI 與正式機用不同值。

金額與庫存

在建立 Session / PaymentIntent 之前,用伺服器資料算出 amount。建立之後顧客改前端也改不了這筆 Intent 的金額。

若使用 Dashboard 的 Price ID,把 price_... 寫在伺服器,不要讓瀏覽器指定任意 Price ID 除非你有白名單。

Webhook 簽章

任何人都能對你的 /webhook 發 JSON,假裝付款成功。必須用 endpoint secret 驗證:

event = stripe.Webhook.construct_event(
    payload, sig_header, webhook_secret
)

驗證失敗就回 400,不要出貨。詳見 Webhook 履約

HTTPS 與上線

正式環境全站 HTTPS。Webhook URL 必須是公開 HTTPS。本機用 Stripe CLI 轉送,不必把測試機暴露到網路上。

冪等

Stripe 可能重送同一個 Event。用 event.id 記到資料庫,處理過就跳過,避免出貨兩次。建立 Session 時也可帶 idempotency_key,避免網路重試建立兩筆付款。