สารบัญ
- เหตุการณ์ Stripe แบบไหนที่ต้องการตัวคุณจริง ๆ
- ขั้นที่ 1 — สร้างแชนเนลตามระดับความเร่งด่วน
- ขั้นที่ 2 — เพิ่มเอนด์พอยต์ใน Stripe
- ขั้นที่ 3 — แปลง payload ให้อ่านรู้เรื่อง
- ขั้นที่ 4 — ทดสอบโดยไม่ต้องรอการจ่ายเงินจริง
- สิ่งที่การตั้งค่านี้ไม่ได้ให้
- คำถามที่พบบ่อย
- Stripe โทรหาผมเองได้ไหม
- การแจ้งเตือนข้อพิพาทจะปลุกผมได้จริงไหม
- หุ้นส่วนของผมรับการแจ้งเตือนชุดเดียวกันได้ไหม
- แล้วโหมดทดสอบล่ะ
- สรุป
- เนื้อหาที่เกี่ยวข้อง
Stripe ส่งอีเมลหาคุณเรื่องทุกอย่าง ซึ่งเท่ากับไม่ได้แจ้งอะไรเลย การเก็บเงินสำเร็จ การต่ออายุสมาชิกที่ล้มเหลว และการขอคืนเงินผ่านบัตร ล้วนมาถึงในรูปแบบข้อความเดียวกันในกล่องจดหมายเดียวกัน และกว่าคุณจะได้อ่าน ความต่างระหว่างสามอย่างนี้ก็หายไปแล้ว
ทางแก้ไม่ใช่การเพิ่มการแจ้งเตือน แต่คือการให้เหตุการณ์แต่ละแบบของ Stripe มีระดับความเร่งด่วนที่มันสมควรได้จริง ๆ คือแจ้งเบา ๆ เมื่อมีคนจ่ายเงิน ใช้การแจ้งเตือนแบบไวต่อเวลาเมื่อต่ออายุไม่สำเร็จ และโทรเข้ามาเมื่อมีข้อพิพาทพร้อมกำหนดเวลาตอบกลับ
เหตุการณ์ Stripe แบบไหนที่ต้องการตัวคุณจริง ๆ
ไม่ใช่ทุกเหตุการณ์จะควรค่าแก่การแจ้งเตือน และที่ควรค่าก็ไม่ได้เร่งด่วนเท่ากันหมด
| เหตุการณ์ Stripe | ทำไมถึงสำคัญ | ความเร่งด่วน |
|---|---|---|
payment_intent.succeeded | มีคนจ่ายเงินแล้ว รู้ไว้ก็ดี แต่ไม่เคยด่วน | ปกติ |
invoice.payment_failed | การต่ออายุล้มเหลว ยังมีช่วงลองเก็บเงินซ้ำก่อนสมาชิกภาพจะหมด | ไวต่อเวลา |
charge.dispute.created | การขอคืนเงินผ่านบัตร Stripe จะระบุกำหนดตอบกลับที่เครือข่ายบัตรกำหนดไว้ และการพลาดกำหนดนั้นเท่ากับแพ้โดยอัตโนมัติ | สายเรียกเข้า |
payment_intent.payment_failed | การจ่ายเงินครั้งเดียวล้มเหลว ดูรวม ๆ มีประโยชน์ แต่ดูทีละอันน่ารำคาญ | ปกติ หรือไม่ต้องแจ้ง |
มีแค่ข้อพิพาทเท่านั้นที่คุ้มกับการโทร ที่เหลือรอจนคุณหยิบมือถือขึ้นมาเองได้ ส่วนข้อพิพาทที่เพิ่งรู้ตัวหลังผ่านไปหนึ่งสัปดาห์ ก็คือเงินที่ยังไงคุณก็รักษาไว้ไม่ได้อยู่แล้ว
ขั้นที่ 1 — สร้างแชนเนลตามระดับความเร่งด่วน
สร้างแชนเนลใน Echobell สามอัน เพราะความเร่งด่วนเป็นการตั้งค่าระดับแชนเนล
- Stripe · รายได้ — การแจ้งเตือนปกติ สำหรับการชำระเงินสำเร็จ
- Stripe · ชำระเงินล้มเหลว — ไวต่อเวลา
- Stripe · ข้อพิพาท — สายเรียกเข้า
คัดลอก URL ของ webhook จากหน้าตั้งค่าของแต่ละแชนเนล คุณจะให้ Stripe ชี้มาที่ทั้งสามอัน
ระหว่างที่อยู่ตรงนั้น เปิด เฉพาะ POST ให้ทุกแชนเนลด้วย Stripe ส่งด้วย POST เสมอ และการเปิดไว้จะกันไม่ให้การแสดงตัวอย่างลิงก์หรือการเติมข้อความอัตโนมัติในแถบที่อยู่ไปทริกเกอร์แชนเนลโดยไม่ตั้งใจ
ขั้นที่ 2 — เพิ่มเอนด์พอยต์ใน Stripe
ในแดชบอร์ดของ Stripe ไปที่ Developers → Webhooks → Add endpoint วาง URL ของแชนเนล แล้วเลือกเฉพาะเหตุการณ์ที่แชนเนลนั้นควรรับผิดชอบ
แนะนำให้ทำหนึ่งเอนด์พอยต์ต่อหนึ่งแชนเนล แทนที่จะยัดทุกอย่างไว้ในเอนด์พอยต์เดียว Stripe ให้เลือกเหตุการณ์ได้ทีละเอนด์พอยต์ การกระจายจึงจบที่ฝั่ง Stripe และแชนเนลของคุณก็ยังเรียบง่าย
ถ้าอยากใช้เอนด์พอยต์เดียวจริง ๆ ให้ชี้ไปที่แชนเนลหนึ่งแล้วกรองด้วยเงื่อนไข
type == "charge.dispute.created"
เงื่อนไขเขียนโดยไม่ต้องมี {{ }} ครอบแบบที่เทมเพลตใช้
ขั้นที่ 3 — แปลง payload ให้อ่านรู้เรื่อง
Stripe ส่ง JSON มาหน้าตาประมาณนี้
{
"type": "charge.dispute.created",
"data": {
"object": {
"amount": 4900,
"currency": "usd",
"reason": "fraudulent",
"status": "warning_needs_response"
}
}
}
เทมเพลตของแชนเนลจึงต้องเอื้อมเข้าไปใน data.object
หัวเรื่อง
ข้อพิพาท: {{data.object.reason}}
เนื้อหา
{{data.object.amount}} {{data.object.currency}} ถูกยื่นข้อพิพาท
สถานะ: {{data.object.status}}
กับดักที่แทบทุกคนเจอ: จำนวนเงินของ Stripe อยู่ในหน่วยย่อยที่สุดของสกุลนั้น 4900 คือ 49.00 ดอลลาร์ ไม่ใช่ 4,900 ดอลลาร์ เทมเพลตของ Echobell จะแทนค่าตรง ๆ ดังนั้นให้หารก่อนส่ง หรือเขียนสกุลเงินต่อท้ายแล้วอ่านมันเป็นเซนต์ ถ้าตัวเลขต้องถูกต้องตั้งแต่แรกเห็น ให้เอาการหารไปไว้ในสิ่งที่คั่นอยู่ระหว่าง Stripe กับ Echobell ไม่ว่าจะเป็น Worker ระบบอัตโนมัติ หรือเอนด์พอยต์ของคุณเอง
สำหรับแชนเนลรายได้ ใช้แนวคิดเดียวกันแต่สั้นกว่า
หัวเรื่อง
+{{data.object.amount}} {{data.object.currency}}
เนื้อหา
{{data.object.description}}
ขั้นที่ 4 — ทดสอบโดยไม่ต้องรอการจ่ายเงินจริง
Stripe CLI ยิง payload ของเหตุการณ์จริงเข้าเอนด์พอยต์ของคุณได้
stripe trigger payment_intent.succeeded
stripe trigger charge.dispute.created
ทำก่อนที่จะไว้ใจมัน และนี่ยังเป็นวิธีที่เร็วที่สุดในการดูว่าเทมเพลตจะแสดงผลอย่างไรเมื่อฟิลด์ที่คุณคิดว่าต้องมีกลับส่งมาเป็น null
สิ่งที่การตั้งค่านี้ไม่ได้ให้
มีข้อจำกัดสองข้อที่ควรรู้ก่อนเอาไปวางไว้หน้ารายได้ของคุณ
Echobell ไม่ตรวจสอบลายเซ็นของ Stripe Stripe เซ็นทุก webhook ด้วยเฮดเดอร์ Stripe-Signature และการตรวจสอบต้องใช้ secret ของเอนด์พอยต์ แต่เอนด์พอยต์ webhook ของ Echobell ไม่ได้ทำการตรวจนั้น สิ่งเดียวที่ปกป้องแชนเนลอยู่จึงคือตัว URL เอง ให้ถือว่ามันเป็นความลับ เปิด เฉพาะ POST ไว้ และอย่าเอาไปวางในรีโพสาธารณะหรือภาพหน้าจอ
คุณเพิ่มการตรวจแบบอ่อน ๆ ด้วยเงื่อนไขได้
header["stripe-signature"] != ""
มันยืนยันได้ว่ามีบางอย่างกำลังส่งคำขอที่มีหน้าตาแบบ Stripe แต่ยืนยันไม่ได้ว่านั่นคือ Stripe ถ้าการแจ้งเตือนปลอมจะสร้างความเสียหายจริง ไม่ใช่แค่ทำให้งงชั่วครู่ ให้เอาเอนด์พอยต์ของคุณเองไปวางไว้ข้างหน้า ตรวจลายเซ็นตรงนั้น แล้วค่อยให้มันเรียก Echobell
นี่คือเส้นทางแจ้งเตือน ไม่ใช่บัญชี Stripe จะลองส่ง webhook ที่ล้มเหลวซ้ำ แต่การแจ้งเตือนไม่ใช่บันทึกว่าเกิดอะไรขึ้น การกระทบยอดให้ยึด Stripe เป็นหลัก ไม่ใช่ประวัติการแจ้งเตือนของคุณ
คำถามที่พบบ่อย
Stripe โทรหาผมเองได้ไหม
ไม่ได้ Stripe ส่งอีเมลกับ webhook เท่านั้น จะให้กลายเป็นสายโทรเข้าต้องส่ง webhook ต่อไปยังบริการที่โทรออกได้
การแจ้งเตือนข้อพิพาทจะปลุกผมได้จริงไหม
ถ้าตั้งแชนเนลเป็นโหมดสายเรียกเข้า ได้ มันจะมาถึงเหมือนสายโทรเข้าและดังทะลุโหมดโฟกัสกับห้ามรบกวน ดูเพิ่มที่ ทำให้การแจ้งเตือนสำคัญทะลุโหมดโฟกัสของ iOS
หุ้นส่วนของผมรับการแจ้งเตือนชุดเดียวกันได้ไหม
ได้ แชร์แชนเนลออกไป แล้วผู้ติดตามแต่ละคนเลือกประเภทการแจ้งเตือนของตัวเอง คุณอาจรับสายเอง ส่วนอีกคนได้แค่การแจ้งเตือนเงียบ ๆ จากเหตุการณ์เดียวกัน
แล้วโหมดทดสอบล่ะ
เหตุการณ์ในโหมดทดสอบของ Stripe จะไปที่เอนด์พอยต์ที่ลงทะเบียนไว้ในโหมดทดสอบเท่านั้น ถ้าอยากเห็นทราฟฟิกนั้นด้วยก็ลงทะเบียน URL แชนเนลไว้ทั้งสองโหมด หรือจะลงเฉพาะโหมดทดสอบไปก่อนจนกว่าจะไว้ใจการตั้งค่านี้ก็ได้
สรุป
สามแชนเนล สามเอนด์พอยต์ แชนเนลละหนึ่งเทมเพลต ประเด็นไม่ได้อยู่ที่ว่าคุณจะได้รับการแจ้งเตือนจาก Stripe เพราะคุณได้รับอยู่แล้ว ประเด็นคือการขอคืนเงินผ่านบัตรจะเลิกหน้าตาเหมือนใบเสร็จเสียที
ดาวน์โหลด Echobell สำหรับ iPhone หรือ รับบน Google Play แล้วลองรัน stripe trigger charge.dispute.created หนึ่งครั้ง ปล่อยให้โทรศัพท์ดังขึ้นมาโดยตั้งใจ