Cảnh báo thanh toán Stripe: được gọi khi tiền đang gặp rủi ro

Đưa webhook của Stripe về điện thoại với mức khẩn đúng cho từng sự kiện — thông báo lặng lẽ khi thu tiền thành công, cuộc gọi khi có tranh chấp kèm hạn trả lời.

Cập nhật

Mục lục

Stripe gửi email cho bạn về mọi thứ, và vì thế hoá ra chẳng báo cho bạn điều gì cả. Một lần thu tiền thành công, một lần gia hạn thuê bao thất bại, và một vụ đòi bồi hoàn đều đến dưới cùng một dạng thư trong cùng một hộp thư; đến lúc bạn đọc thì khác biệt giữa chúng đã mất.

Cách xử lý không phải là thêm thông báo, mà là cho mỗi sự kiện Stripe đúng mức khẩn mà nó xứng đáng: một thông báo lặng lẽ khi có người trả tiền, một cảnh báo nhạy cảm thời gian khi gia hạn thất bại, và một cuộc gọi khi tranh chấp ập đến kèm theo hạn trả lời.

Những sự kiện Stripe thật sự cần đến bạn

Không phải sự kiện nào cũng đáng báo, và những cái đáng báo cũng không khẩn như nhau.

Sự kiện StripeVì sao quan trọngMức khẩn
payment_intent.succeededCó người vừa trả tiền. Biết thì tốt, không bao giờ gấp.Thường
invoice.payment_failedGia hạn thất bại. Vẫn còn khoảng thời gian thử lại trước khi thuê bao mất hiệu lực.Nhạy cảm thời gian
charge.dispute.createdĐòi bồi hoàn. Stripe nêu một hạn trả lời do tổ chức thẻ đặt ra, bỏ lỡ là mặc nhiên thua.Cuộc gọi
payment_intent.payment_failedMột giao dịch lẻ thất bại. Hữu ích khi nhìn theo số lượng, ồn ào khi nhìn từng cái.Thường, hoặc bỏ qua

Chỉ tranh chấp mới đáng một cuộc gọi. Phần còn lại có thể đợi đến khi bạn tự cầm điện thoại lên; một vụ đòi bồi hoàn phát hiện muộn một tuần là khoản tiền vốn dĩ bạn cũng không giữ được.

Bước 1 — Mỗi mức khẩn một kênh

Tạo ba kênh trong Echobell, vì mức khẩn là thiết lập theo từng kênh:

  • Stripe · Doanh thu — thông báo thường, dùng cho thanh toán thành công
  • Stripe · Thanh toán thất bại — nhạy cảm thời gian
  • Stripe · Tranh chấp — cuộc gọi

Sao chép URL webhook của từng kênh trong phần thiết lập. Bạn sẽ trỏ Stripe tới cả ba.

Nhân tiện, hãy bật Chỉ POST cho từng kênh. Stripe luôn gửi bằng POST, và cách này ngăn việc xem trước liên kết hay tự động điền thanh địa chỉ vô tình kích hoạt kênh của bạn.

Bước 2 — Thêm endpoint trong Stripe

Trong bảng điều khiển Stripe, vào Developers → Webhooks → Add endpoint, dán URL của kênh và chỉ chọn những sự kiện mà kênh đó cần xử lý.

Hãy tạo mỗi kênh một endpoint thay vì gộp tất cả vào một. Stripe cho phép chọn sự kiện theo từng endpoint, nghĩa là việc định tuyến diễn ra ở phía Stripe và các kênh của bạn giữ được sự đơn giản.

Nếu bạn thích chỉ dùng một endpoint, hãy trỏ nó vào một kênh rồi lọc bằng điều kiện:

type == "charge.dispute.created"

Điều kiện được viết mà không cần cặp {{ }} như trong template.

Bước 3 — Biến payload thành thứ đọc được

Stripe gửi phần thân JSON có dạng như sau:

{
  "type": "charge.dispute.created",
  "data": {
    "object": {
      "amount": 4900,
      "currency": "usd",
      "reason": "fraudulent",
      "status": "warning_needs_response"
    }
  }
}

Vì vậy template của kênh sẽ với vào bên trong data.object:

Tiêu đề

Tranh chấp: {{data.object.reason}}

Nội dung

{{data.object.amount}} {{data.object.currency}} bị tranh chấp
Trạng thái: {{data.object.status}}

Một cái bẫy hầu như ai cũng dính: số tiền của Stripe tính theo đơn vị nhỏ nhất của loại tiền đó. 4900 là 49,00 đô la, không phải 4.900 đô la. Template của Echobell thay giá trị vào nguyên trạng, nên hoặc bạn chia trước khi gửi, hoặc viết đơn vị tiền phía sau và hiểu nó là xu. Nếu con số bắt buộc phải đúng ngay từ cái nhìn đầu tiên, hãy đặt phép chia vào thứ nằm giữa Stripe và Echobell — một Worker, một luồng tự động, hay endpoint của chính bạn.

Với kênh doanh thu, vẫn ý đó nhưng ít chữ hơn:

Tiêu đề

+{{data.object.amount}} {{data.object.currency}}

Nội dung

{{data.object.description}}

Bước 4 — Thử mà không cần đợi giao dịch thật

Stripe CLI có thể bắn payload sự kiện thật vào endpoint của bạn:

stripe trigger payment_intent.succeeded
stripe trigger charge.dispute.created

Hãy làm việc này trước khi bạn dựa vào nó. Đây cũng là cách nhanh nhất để thấy template hiển thị ra sao khi một trường bạn đinh ninh là luôn có lại về dưới dạng null.

Những gì cách làm này không đem lại

Có hai giới hạn nên biết trước khi đặt nó trước dòng tiền của bạn.

Echobell không xác minh chữ ký của Stripe. Stripe ký từng webhook bằng header Stripe-Signature, và việc xác minh cần đến khoá bí mật của endpoint. Endpoint webhook của Echobell không làm bước kiểm tra đó, nên thứ duy nhất bảo vệ kênh chính là URL của nó. Hãy coi nó như một khoá bí mật, giữ Chỉ POST luôn bật, và đừng dán vào kho mã công khai hay ảnh chụp màn hình.

Bạn có thể thêm một lớp kiểm tra yếu bằng điều kiện:

header["stripe-signature"] != ""

Nó xác nhận rằng có thứ gì đó đang gửi một yêu cầu mang hình dạng của Stripe. Nó không xác nhận rằng đó chính là Stripe. Nếu một thông báo giả mạo có thể gây thiệt hại thật — chứ không chỉ khiến bạn bối rối một lúc — hãy đặt endpoint của riêng bạn ở phía trước, xác minh chữ ký tại đó, rồi để nó gọi sang Echobell.

Đây là đường cảnh báo, không phải sổ sách. Stripe có thử lại những lần gửi webhook thất bại, nhưng thông báo không phải là bản ghi những gì đã xảy ra. Hãy đối soát với Stripe, đừng đối soát với lịch sử thông báo.

Câu hỏi thường gặp

Stripe có gọi thẳng cho tôi được không?

Không. Stripe gửi email và webhook. Muốn thành một cuộc gọi thì phải chuyển webhook sang một dịch vụ biết gọi điện.

Cảnh báo tranh chấp có thật sự đánh thức tôi không?

Nếu kênh được đặt ở chế độ gọi thì có — nó đến như một cuộc gọi đến và đổ chuông xuyên qua chế độ Tập trung lẫn Không làm phiền. Xem xuyên qua chế độ Tập trung của iOS cho cảnh báo quan trọng.

Người đồng sáng lập có nhận được cùng cảnh báo không?

Có. Chia sẻ kênh và mỗi người đăng ký tự chọn kiểu thông báo của mình. Bạn có thể nhận cuộc gọi trong khi người kia chỉ nhận một thông báo lặng lẽ cho cùng sự kiện.

Còn chế độ thử nghiệm thì sao?

Sự kiện ở chế độ thử nghiệm của Stripe chỉ tới các endpoint đăng ký trong chế độ thử nghiệm. Hãy đăng ký URL kênh ở cả hai nếu bạn muốn thấy luồng đó, hoặc chỉ ở chế độ thử nghiệm cho tới khi bạn tin tưởng cách thiết lập này.

Kết lại

Ba kênh, ba endpoint, mỗi cái một template. Vấn đề không phải là bạn được Stripe thông báo — điều đó vốn đã có. Vấn đề là một vụ đòi bồi hoàn thôi trông y hệt một tờ biên lai.

Tải Echobell cho iPhone hoặc lấy trên Google Play, rồi chạy stripe trigger charge.dispute.created và cố ý để điện thoại đổ chuông một lần.


Nội dung liên quan