Webhookã®å詊è¡ãšæåãªãã¬ã€ïŒå®å šãªåŸ©æ§èšèš
Webhookã®å詊è¡ãšæåãªãã¬ã€ãæ¯èŒããUXããµããŒãè² è·ãèããäžã§äºéè«æ±ãéè€ã¬ã³ãŒããé²ããªãã¬ã€ããŒã«èšèšãåŠã³ãŸãã

Webhookã倱æãããšãã«äœãå£ããã®ã
Webhookã®å€±æã¯ãããŠãããã ã®æè¡çãªäžå ·åãã§ã¯ãããŸããããŠãŒã¶ãŒãããããšãã¢ããªãäœããå¿ããããã«èŠããŸãïŒæ³šæããä¿çãã®ãŸãŸããµãã¹ã¯ãªãã·ã§ã³ãè§£é€ãããªãããã±ããããæ¯æãæžã¿ãã«ç§»ããªããé éã¹ããŒã¿ã¹ãééã£ãŠããããªã©ã§ãã
å€ãã®äººã¯WebhookèªäœãèŠãŠããŸããã圌ããèŠãã®ã¯ãããªãã®ãããã¯ããšéè¡ãåä¿¡ç®±ãããã·ã¥ããŒãã®éã§äžæŽåãèµ·ããŠããããšã§ããééã絡ããšããã®ã®ã£ããã¯ããã«ä¿¡é Œãå£ããŸãã
倱æã¯éå±ãªçç±ã§èµ·ããŸãããšã³ããã€ã³ããé ããŠã¿ã€ã ã¢ãŠãããããããã€äžã«ãµãŒããŒã500ãè¿ãããããã¯ãŒã¯ã®ãããã§ãªã¯ãšã¹ããèœã¡ããäœæ¥ã¯çµãã£ãŠããã®ã«é ããŠå¿çããŠããŸãããšããããŸããéä¿¡åŽããèŠããšã©ãããé ä¿¡ãããŠããªããæ±ãã«ãªãã®ã§ãå詊è¡ãããã€ãã³ãã倱æãšããŠããŒã¯ããŸãã
埩æ§èšèšã¯éèŠã§ããWebhookã€ãã³ãã¯åãæ¶ããªãæäœïŒæ¯æãã®å®äºãè¿éã®çºè¡ãã¢ã«ãŠã³ãäœæããã¹ã¯ãŒããªã»ãããçºéãªã©ïŒã衚ãããšãå€ããã€ãã³ããéããšããŒã¿ãå£ããŸããéã«äºåºŠåŠçãããšäºéè«æ±ãäºéäœæãèµ·ããŸãã
ã ããWebhookã®å詊è¡ãšæåãªãã¬ã€ã¯åãªããšã³ãžãã¢ãªã³ã°ã®åé¡ã§ã¯ãªãããããã¯ãã®å€æã§ããéžæè¢ã¯2ã€ãããŸãïŒ
- ãããã€ãåŽã®èªåå詊è¡ïŒéä¿¡åŽãæåå¿çãåãåããŸã§ã¹ã±ãžã¥ãŒã«ã«åŸã£ãŠåéããã
- ããªãåŽã®æåãªãã¬ã€ïŒãµããŒãæ åœã管çè ãäœããããããšå€æããŠååŠçãããªã¬ãŒããã
ãŠãŒã¶ãŒã¯äºæããªãããšãªãä¿¡é Œæ§ãæåŸ ããŸããã·ã¹ãã ã¯å€ãã®å Žåã§èªåçã«å埩ãã¹ãã§ã人ãä»å ¥ããå Žåã¯äœãèµ·ãããæç¢ºã§ãäºåæŒããŠãå®å šã§ããã¹ãã§ããããŒã³ãŒãã§äœãå Žåã§ãããã¹ãŠã®Webhookã¯ãåå°çããå¯èœæ§ãããããšæ±ã£ãŠãã ããã
èªåå詊è¡ïŒå©ããå Žé¢ãšå®³ã«ãªãå Žé¢
èªåå詊è¡ã¯Webhookã®ããã©ã«ãã®å®å šç¶²ã§ããå€ãã®ãããã€ãã¯ãããã¯ãŒã¯ãšã©ãŒãã¿ã€ã ã¢ãŠãæã«ããã¯ãªãã䌎ã£ãŠå詊è¡ãã1ã2æ¥åŸã«æã¡åãããšãå€ãã§ããããã¯å®å¿æããããŸãããUXãšãµããŒãã®ããåããå€ããŸãã
ãŠãŒã¶ãŒåŽã§ã¯ãå詊è¡ããæ¯æã確å®ãã®ç¬éãæ°ãŸããé å»¶ã«å€ããããšããããŸãã顧客ã¯ãããã€ãã®ããŒãžã§æåãèŠãŠããã®ã«ãããªãã®ã¢ããªã¯ãä¿çãã®ãŸãŸæ¬¡ã®å詊è¡ãåŸ ã¡ãŸããéã«ãããŠã³ã¿ã€ã åŸã«å詊è¡ãäžæ°ã«å°çããŠå€ãã€ãã³ããäžæã« "catch up" ããããšããããŸãã
å詊è¡ãããŸããããšãµããŒãã®ãã±ããã¯æžãããšãå€ãã§ãããæ®ã£ããã±ããã¯é£ãããã®ã«ãªããŸããåäžã®æçœãªå€±æã§ã¯ãªããè€æ°åã®é ä¿¡ãç°ãªãã¬ã¹ãã³ã¹ã³ãŒããå ã®æäœãšæçµæåã®éã«é·ãã®ã£ããããã£ãŠããã®èª¬æãé£ããã®ã§ãã
ããŠã³ã¿ã€ã ãé å»¶é ä¿¡ã®å€§éçºçãåŒãèµ·ãããããé ããã³ãã©ãåŠçæžã¿ã®äœæ¥ã§ãã¿ã€ã ã¢ãŠããç¶ããããã·ã¹ãã ãåªçã§ãªãããã«éè€é ä¿¡ãäºéäœæãäºéè«æ±ãèªçºãããšãéçšäžã®çã¿ãçŸå®ã«ãªããŸãããã©ãããŒãªåäœãé ããŠããŸããåé¡ããã¿ãŒã³åããããšããããŸãã
å詊è¡ã¯ã倱æåŠçãåçŽãªå Žåã«ååã§ãïŒéééçãªæŽæ°ãäºåºŠé©çšããŠãå®å šãªã¢ã¯ã·ã§ã³ãå€å°ã®é ãã蚱容ãããã€ãã³ããªã©ãã€ãã³ããééãåããããåãæ¶ããªãèšé²ãäœãå¯èœæ§ãããå ŽåãWebhookã®å詊è¡å¯Ÿæåãªãã¬ã€ã¯å©äŸ¿æ§ã§ã¯ãªãã³ã³ãããŒã«ã®åé¡ã«ãªããŸãã
æåãªãã¬ã€ïŒã³ã³ãããŒã«ã説æè²¬ä»»ããã¬ãŒããªã
æåãªãã¬ã€ã¯ã人ãWebhookã€ãã³ãã®ååŠçãæ±ºå®ããããšãæå³ããŸãããµããŒãæ åœã顧客åŽã®ç®¡çè ããããã¯ïŒäœãªã¹ã¯ã®å ŽåïŒãšã³ããŠãŒã¶ãŒããå詊è¡ããã¯ãªãã¯ããã±ãŒã¹ããããŸããæåãªãã¬ã€ã¯ã¹ããŒãããã人ã®ã³ã³ãããŒã«ãåªå ããŸãã
UXã¯è³åŠããããŸããé«äŸ¡å€ã®ã€ã³ã·ãã³ãã§ã¯ããªãã¬ã€ãã¿ã³ã¯æ¬¡ã®å詊è¡ãåŸ ããã«åäžã®ã±ãŒã¹ãçŽ æ©ãçŽããŸãããããå€ãã®åé¡ã¯èª°ããæ°ã¥ããŠè¡åãããŸã§æŸçœ®ãããã¡ã§ãã
ãµããŒãã®è² è·ã¯éåžžå¢ããŸãããªãã¬ã€ã¯ãéããªå€±æãããã±ããããã©ããŒã¢ããã«å€ããããã§ããå©ç¹ã¯éææ§ïŒãµããŒãã¯äœããªãã¬ã€ããããããã€ã誰ãããªãã確èªã§ããŸããééãã¢ã¯ã»ã¹ãæ³çèšé²ã絡ãå Žåããã®ç£æ»ãã¬ã€ã«ã¯éèŠã§ãã
ã»ãã¥ãªãã£ãæãé£ããç¹ã§ãããªãã¬ã€ããŒã«ã¯æš©éãšç¯å²ãå³ãããã¹ãã§ãïŒ
- ä¿¡é Œããã圹å²ã®ã¿ããç¹å®ã®ã·ã¹ãã ã«å¯ŸããŠãªãã¬ã€ãè¡ããã
- ãªãã¬ã€ã¯ãå šãŠåéãã§ã¯ãªãåäžã€ãã³ãã«éå®ããã
- ãã¹ãŠã®ãªãã¬ã€ã¯çç±ãå®è¡è ãã¿ã€ã ã¹ã¿ã³ãããã°ã«æ®ãã
- UIã§ã¯æ©åŸ®ãªãã€ããŒãã¯ãã¹ã¯ããã
- ã¬ãŒãå¶éã§ä¹±çšã誀æäœãé²ãã
æåãªãã¬ã€ã¯ãè«æ±æžäœæãã¢ã«ãŠã³ãããããžã§ãã³ã°ãè¿éãäºéè«æ±ãäºéäœæãæãå¯èœæ§ã®ããé«ãªã¹ã¯æäœã«å¥œãŸããŸãããŸããæ¯æãã確å®ããããšã確èªããŠããæ³šæäœæããªãã©ã€ããããšãã£ãã¬ãã¥ãŒæé ãå¿ èŠãªããŒã ã«ãåããŸãã
å詊è¡ãšãªãã¬ã€ã®éžã³æ¹
èªåå詊è¡ãšæåãªãã¬ã€ã®ã©ã¡ããæ¡ããã«äžåŸã®ã«ãŒã«ã¯ãããŸãããäžè¬çã«å®å šãªã®ã¯æ··åæŠç¥ã§ãïŒäœãªã¹ã¯ã€ãã³ãã¯èªåã§å詊è¡ããééãåãè¿ãã®ä»ããªãéãåŠçã¯æç€ºçãªãªãã¬ã€ãèŠæ±ããã
ãŸãåWebhookã€ãã³ãããªã¹ã¯ã§åé¡ããŸããé
éã¹ããŒã¿ã¹ã®æŽæ°ã¯é
ãããšè¿·æã§ããé·æçãªè¢«å®³ã¯å°ãªããäžæ¹ã§ payment_succeeded ã create_subscription ã®ãããªã€ãã³ãã¯é«ãªã¹ã¯ã§ãäœåã«åŠçããããšäºéè«æ±ãäºéäœæã®å¯èœæ§ããããŸãã
次ã«èª°ã埩æ§ãããªã¬ãŒã§ããããæ±ºããŸããã·ã¹ãã ã«ããèªåå詊è¡ã¯å®å šãã€é«éãªæäœã«åããŸããææãªã€ãã³ãã¯ãµããŒãããªãã¬ãŒã·ã§ã³ã顧客ã®ã¢ã«ãŠã³ãããããã€ãã®ããã·ã¥ããŒãã確èªããŠãããªãã¬ã€ãå®è¡ããæ¹ãããããšãå€ãã§ãããšã³ããŠãŒã¶ãŒã«ãªãã¬ã€æš©éãäžããã®ã¯äœãªã¹ã¯ã®æäœã«éãã¹ãã§ããããªããšç¹°ãè¿ãã¯ãªãã¯ã§éè€ãçã¿ãŸãã
æéãŠã£ã³ããŠãéèŠã§ããå詊è¡ã¯äžæçãªåé¡ãæ²»ãç®çã§ååäœã»æéåäœã§è¡ãããŸããæåãªãã¬ã€ã¯ããé·ã蚱容ã§ããŸãããç¡æéã«ããŠã¯ãããŸãããäžè¬çãªã«ãŒã«ã¯ããžãã¹æèããŸã æå¹ãªéïŒäŸïŒåºè·åãè«æ±æéãéããåïŒã«ãªãã¬ã€ãèš±å¯ãããã®åŸã¯ããæ éãªèª¿æŽãèŠæ±ããããšã§ãã
ã€ãã³ãããšã®ç°¡æãã§ãã¯ãªã¹ãïŒ
- ããäºåºŠå®è¡ããããææªäœãèµ·ãããïŒ
- 誰ãçµæãæ€èšŒã§ãããïŒã·ã¹ãã ããµããŒãããªãã¹ããŠãŒã¶ãŒïŒïŒ
- ã©ã®ãããã®éãã§æåãããå¿ èŠããããïŒç§ãåãæ¥ïŒïŒ
- 蚱容ã§ããéè€çã¯ã©ãããããïŒãéãªãã»ãŒãŒãïŒïŒ
- ã€ã³ã·ãã³ã1ä»¶ãããã©ãã ãã®ãµããŒãæéã蚱容ããããïŒ
create_invoice ãéããå Žåã¯çãå詊è¡ã«ãŒãã§ååãªããšããããŸããcharge_customer ãéããå Žåã¯ãç£æ»ãã¬ã€ã«ãšåªçæ§ãã§ãã¯ãåããæåãªãã¬ã€ãåªå
ããŠãã ããã
ããŒã³ãŒãããŒã«ïŒäŸïŒAppMasterïŒã§ãããŒãäœããªããåWebhookãããžãã¹ããã»ã¹ãšããŠæ±ããäœãªã¹ã¯ã¹ãããã¯èªåå詊è¡ãé«ãªã¹ã¯ã¯ç¢ºèªãå¿ èŠãšãããªãã¬ã€ã¢ã¯ã·ã§ã³ã«åããŠãã ããããªãã¬ã€åã«äœãèµ·ãããã衚瀺ããäºéã¯ãªãã¯ã§ãå®å šã«ãªãããã«ããŸãã
åªçæ§ãšéè€æé€ã®åºæ¬
åªçæ§ãšã¯ãåãWebhookãè€æ°ååŠçããŠãçµæãäžè²«ããŠããããšãæå³ããŸãããããã€ããå詊è¡ããŠãããµããŒãããªãã¬ã€ããŠããæçµçãªçµæã¯äžåºŠã ãåŠçããå Žåãšåãã§ããã¹ãã§ããããã¯Webhookã®å詊è¡ãšæåãªãã¬ã€ã«ãããå®å šãªåŸ©æ§ã®åºç€ã§ãã
ä¿¡é Œã§ããåªçæ§ããŒã®éžã³æ¹
éèŠãªã®ã¯ããããæ¢ã«é©çšãããã©ãããã©ã倿ããããã§ããéä¿¡è ãæäŸãããã®ã«ãã£ãŠè¯ãéžæè¢ãå€ãããŸãïŒ
- ãããã€ãã®ã€ãã³ãIDïŒå®å®ããŠäžæãªãæè¯ïŒ
- ãããã€ãã®é ä¿¡IDïŒå詊è¡ã®èšºæã«æçšã ãã€ãã³ãIDãšåäžãšã¯éããªãïŒ
- ããªãã®è€åããŒïŒäŸïŒprovider + account + object ID + event typeïŒ
- çãã€ããŒãã®ããã·ã¥ïŒäœããªããã°ãã©ãŒã«ããã¯ããã ã空çœããã£ãŒã«ãé ã«æ³šæïŒ
- ããªããçæããŠãããã€ãã«è¿ãããŒïŒå¯Ÿå¿ããAPIãããå Žåã®ã¿æ©èœïŒ
ãããã€ããäžæã®IDãä¿èšŒããªããªãããã€ããŒããå¯äžæ§ã®æ ¹æ ãšããŠä¿¡çšãããããžãã¹æå³ã«åºã¥ãè€åããŒãäœããŸããããæ¯æããªãchargeãinvoiceã®IDãšã€ãã³ãã¿ã€ãã®çµã¿åãããèããããŸãã
éè€æé€ãã©ãã§è¡ãã
äžå±€ã«é Œãã®ã¯å±éºã§ããå®å šãªèšèšã¯è€æ°ã®ãã€ã³ãã§ãã§ãã¯ããŸãïŒWebhookãšã³ããã€ã³ãïŒããã«æåŠããïŒãããžãã¹ããžãã¯ïŒç¶æ ãã§ãã¯ïŒãããŒã¿ããŒã¹ïŒæçµçãªä¿èšŒïŒãããŒã¿ããŒã¹ã¯æçµããã¯ãšããŠãåŠçæžã¿ããŒãäžæå¶çŽä»ãã®ããŒãã«ã«ä¿åããŠããã°ãè€æ°ã®ã¯ãŒã«ãŒãåãã€ãã³ããåæã«é©çšããã®ãé²ããŸãã
é åºã®å ¥ãæ¿ããã¯å¥åé¡ã§ããéè€æé€ã¯éè€ãæ¢ããŸãããå€ãæŽæ°ãæ°ããç¶æ ãäžæžãããã®ã¯æ¢ããããŸãããã¿ã€ã ã¹ã¿ã³ããã·ãŒã±ã³ã¹çªå·ããŸãã¯ãåžžã«åãžé²ãããã«ãŒã«ã§å¯ŸåŠããŸããäŸïŒæ³šæãæ¢ã«PaidãªããåŸããæ¥ã"Pending"æŽæ°ã¯ç¡èŠããŸãã
ããŒã³ãŒãç°å¢ïŒäŸïŒAppMasterïŒã§ã¯ãprocessed_webhooks ããŒãã«ãã¢ãã«åããåªçæ§ããŒã«äžæã€ã³ããã¯ã¹ãä»ããŸããããžãã¹ããã»ã¹ã¯ãŸãã¬ã³ãŒãäœæã詊ã¿ã倱æãããåŠçãæ¢ããŠéä¿¡å
ã«ã¯æåãè¿ããŸãã
ã¹ããããã€ã¹ãããïŒããã©ã«ãã§å®å šãªãªãã¬ã€ããŒã«èšèš
è¯ããªãã¬ã€ããŒã«ã¯ãåé¡çºçæã®ãããã¯ã軜æžããŸãããªãã¬ã€ã¯åãå®å šãªåŠççµè·¯ãåå®è¡ããéè€ãé²ãã¬ãŒãã¬ãŒã«ãåããŠãããšãã«æã广çã§ãã
1) ãŸãèšé²ããæ¬¡ã«è¡åãã
åä¿¡ããWebhookã¯ç£æ»èšé²ãšããŠä¿åããŠãã ãããåãåã£ãçã®ããã£ã眲åãã¿ã€ã ã¹ã¿ã³ããªã©ã®ããŒãšãªãããããé ä¿¡ã¡ã¿ããŒã¿ïŒåä¿¡æå»ããœãŒã¹ã詊è¡åæ°ãªã©ïŒããã®ãŸãŸä¿åããæ£èŠåããã€ãã³ãèå¥åãä¿æããŸãã
眲åã¯æ€èšŒããŸãããããžãã¹ã¢ã¯ã·ã§ã³ãå®è¡ããåã«ã¡ãã»ãŒãžãæ°žç¶åããŠãã ãããåŠçãéäžã§ã¯ã©ãã·ã¥ããŠããå ã®ã€ãã³ããæ®ã£ãŠããã°äœãå±ããã蚌æã§ããŸãã
2) ãã³ãã©ãåªçã«ãã
ããã»ããµã¯äºåºŠèµ°ã£ãŠãåãæçµçµæãåºããã¹ãã§ããã¬ã³ãŒãäœæãã«ãŒãè«æ±ãã¢ã¯ã»ã¹ä»äžã®åã«ããã®ã€ãã³ããŸãã¯ããžãã¹æäœãæ¢ã«æåããŠããªãã確èªããŸãã
åºæ¬ã«ãŒã«ã¯åçŽã§ãïŒ1ã€ãã³ãID + 1ã¢ã¯ã·ã§ã³ = 1ã€ã®æåçµæãå ã®æåãããã°å床ã¢ã¯ã·ã§ã³ãè¡ãããæåãè¿ããŸãã
3) 人ã䜿ãã圢ã§çµæãèšé²ãã
ãªãã¬ã€ããŒã«ã¯å±¥æŽãé Œãã§ããåŠçã¹ããŒã¿ã¹ãšãµããŒããçè§£ã§ããçãçç±ãä¿åããŸãããïŒ
- SuccessïŒäœæãããã¬ã³ãŒãIDä»ãïŒ
- Retryable failureïŒã¿ã€ã ã¢ãŠããäžæµã®äžæçåé¡ïŒ
- Permanent failureïŒçœ²åäžæ£ãå¿ é ãã£ãŒã«ãæ¬ èœïŒ
- IgnoredïŒéè€ã€ãã³ããé åºãå€ãã€ãã³ãïŒ
4) ãåäœæãã§ã¯ãªããã³ãã©ãåå®è¡ãã
ãªãã¬ã€ãã¿ã³ã¯æ ŒçŽããããã€ããŒãã§åããã³ãã©ãåãã¥ãŒããã¹ãã§ããUIããçŽæ¥ãä»ããæ³šæãäœããã®ãããªæžã蟌ã¿ãè¡ããšéè€æé€ããã€ãã¹ããŠããŸããŸãã
é«ãªã¹ã¯ã€ãã³ãïŒæ¯æããè¿éããã©ã³å€æŽãªã©ïŒã§ã¯ãã©ã®ã¬ã³ãŒããäœæã»æŽæ°ãããã©ããéè€ãšããŠã¹ãããããããã瀺ããã¬ãã¥ãŒã远å ããŸãããã
AppMasterã®ãããªããŒã«ã§æ§ç¯ãããªãããªãã¬ã€ã¢ã¯ã·ã§ã³ã¯ç®¡çç»é¢ããåŒã°ããŠãåžžã«åªçããžãã¯ãéãããã¯ãšã³ãã®ãšã³ããã€ã³ããããžãã¹ããã»ã¹ãšããŠå®è£ ããŠãã ããã
ãµããŒããçŽ æ©ãåé¡ã解決ããããã«äœãä¿åããã
Webhookã倱æãããšãããµããŒããã§ããããšã¯ããªãã®èšé²ãæç¢ºã§ããéãéããªããŸããå¯äžã®æããããã500ãšã©ãŒãã ãã ãšæ¬¡ã®ã¹ãããã¯æšæž¬ã«ãªããå±éºãªãªãã¬ã€ã«ã€ãªãããŸãã
è¯ãä¿åèšèšã¯æãããã€ã³ã·ãã³ããæ¥åžžã®ãã§ãã¯ã«å€ããŸãïŒã€ãã³ããèŠã€ããäœãèµ·ããã確èªããå®å šã«ãªãã¬ã€ããŠäœãå€ãã£ãã蚌æããã®ã§ãã
ãŸãã¯ãã¹ãŠã®åä¿¡ã€ãã³ãã«å¯ŸããŠå°ããäžè²«ããWebhooké ä¿¡ã¬ã³ãŒããæã¡ãããžãã¹ããŒã¿ïŒordersãinvoicesãusersãªã©ïŒãšã¯åããŠãããŸãããã倱æã調æ»ããéã«æ¬çªããŒã¿ã«è§Šããã«æžã¿ãŸãã
å°ãªããšã次ãä¿åããŠãã ããïŒ
- ãããã€ãç±æ¥ã®Event IDããœãŒã¹åããšã³ããã€ã³ãïŒãã³ãã©å
- åä¿¡æå»ãçŸåšã®ã¹ããŒã¿ã¹ïŒnewãprocessingãsucceededãfailedïŒãåŠçæé
- 詊è¡åæ°ã次ååè©Šè¡æå»ïŒããã°ïŒãæåŸã®ãšã©ãŒã¡ãã»ãŒãžãšãšã©ãŒã¿ã€ãïŒã³ãŒã
- ãªããžã§ã¯ãã«çŽã¥ãçžé¢IDïŒuser_idãorder_idãinvoice_idãticket_idïŒãšãããã€ãID
- ãã€ããŒãã®åãæ±ãæ å ±ïŒçã®ãã€ããŒãïŒãŸãã¯æå·åãããBlobïŒããã€ããŒãããã·ã¥ãã¹ããŒãïŒããŒãžã§ã³
çžé¢IDãããã°ãµããŒãã¯æå¹ã«åããŸãããµããŒãæ åœããOrder 18431ãã§æ€çŽ¢ããã°ããã®æ³šæã«é¢ä¿ãããã¹ãŠã®WebhookïŒäœæãããªãã£ã倱æãå«ãïŒãå³åº§ã«èŠãããã¹ãã§ãã
æåæäœã®ç£æ»ãã¬ã€ã«ãæ®ããŸãããã誰ããã€ã©ãããïŒUIïŒAPIïŒãªãã¬ã€ããããçµæã¯ã©ãã ã£ãããèšé²ããŸããçã倿޿ŠèŠïŒäŸïŒãinvoiceãæ¯ææžã¿ã«ããŒã¯ãïŒãæ®ãã ãã§çŽäºã倧ããæžããŸãã
ä¿ææéãæ±ºããããšãéèŠã§ãããã°ã¯æåã¯å®äŸ¡ã§ããããã€ããŒãã«å人ããŒã¿ãå«ãŸããããšããããŸããæç¢ºãªã«ãŒã«ãå®ããŠå®ããŸãããïŒäŸïŒçãã€ããŒãã¯7ã30æ¥ãã¡ã¿ããŒã¿ã¯90æ¥ãªã©ïŒã
管çç»é¢ã¯åçãæçœã«ããã¹ãã§ããã€ãã³ãIDãšçžé¢IDã§æ€çŽ¢ãã¹ããŒã¿ã¹ãã察å¿ãå¿ èŠããã£ã«ã¿ã詊è¡ãšãšã©ãŒã®ã¿ã€ã ã©ã€ã³ãå®å šãªãªãã¬ã€ãã¿ã³ïŒç¢ºèªãšå¯èŠåãããåªçããŒä»ãïŒãå éšã€ã³ã·ãã³ãçšã®ãšã¯ã¹ããŒãããããšäŸ¿å©ã§ãã
äºéè«æ±ãéè€ã¬ã³ãŒããé¿ãã
Webhookã®å詊è¡ãšæåãªãã¬ã€ã§æãå±éºãªã®ã¯ãå詊è¡ãã®ãã®ãã§ã¯ãªããåŠçã®å¯äœçšãç¹°ãè¿ãããšã§ãïŒã«ãŒããäºåºŠè«æ±ãããäºéã«ãµãã¹ã¯ãäœããåãæ³šæãäºåºŠåºè·ããããªã©ã
å®å šãªèšèšã¯ããéã®ç§»åããšãããžãã¹ã®å®è¡ïŒãã«ãã£ã«ã¡ã³ãïŒããåé¢ããŸããæ¯æãã§ã¯ããã€ã¡ã³ãã€ã³ãã³ãäœæïŒãŸãã¯ãªãŒãœãªïŒããã£ããã£ããã«ãã£ã«ïŒæ³šæãPaidã«ãããã¢ã¯ã»ã¹ãè§£æŸãããåºè·ããïŒã®ããã«ã¹ããããåããŸããWebhookãäºåºŠå±ããå ŽåãäºåºŠç®ã¯ãæ¢ã«ãã£ããã£æžã¿ããæ¢ã«ãã«ãã£ã«æžã¿ããæ€ç¥ããŠåæ¢ã§ããã®ãçæ³ã§ãã
è«æ±ã®äœææã«ã¯ãããã€ãåŽã®åªçæ§ãå©çšããŸããããå€ãã®æ±ºæžãããã€ãã¯åããªã¯ãšã¹ãã«å¯ŸããŠåãçµæãè¿ãidempotency keyããµããŒãããŸãããã®ããŒãå éšã®æ³šæã«ä¿åããŠãããåè©Šè¡æã«åå©çšããŸãã
ããŒã¿ããŒã¹å ã§ãã¬ã³ãŒãäœæãåªçã«ããŸããæãåçŽãªã¬ãŒãã¯å€éšã®ã€ãã³ãIDããªããžã§ã¯ãIDïŒcharge_idãpayment_intent_idãsubscription_idïŒã«ãŠããŒã¯å¶çŽã眮ãããšã§ããåãWebhookãæ¥ããæ¿å ¥ã¯å®å šã«å€±æããæ¢åã¬ã³ãŒããèªã¿èŸŒãã§åŠçãç¶ããŸãã
ç¶æ é·ç§»ã«å¯ŸããŠãåé²ã®ã¿èš±ãã¬ãŒããå ¥ããŸããäŸïŒæ³šæãPendingããPaidã«ããã®ã¯ãçŸåšãPendingã®ãšãã ããæ¢ã«Paidãªãäœãããªãã
éšåçãªå€±æã¯ãããããŸãïŒãéã¯æåãããDBæžã蟌ã¿ã倱æããããããžã®å¯ŸåŠã¯ããŸãåä¿¡ã€ãã³ãã®æ°žç¶åãè¡ãããã®åŸåŠçããèšèšã§ãããµããŒããåŸã§ã€ãã³ãããªãã¬ã€ããã°ããã³ãã©ãéè€ããã«æ¬ ããŠããã¹ããããå®äºã§ããŸãã
ããã§ã倱æããå Žåã«åããŠè£åã¢ã¯ã·ã§ã³ïŒãªãŒãœãªã®åãæ¶ããè¿éããã«ãã£ã«ã®åãæ¶ãïŒãå®çŸ©ããŠãããŸãããªãã¬ã€ããŒã«ã¯ãããã®éžæè¢ãæç€ºããŠãäººãæšæž¬ãªãã«çµæãä¿®æ£ã§ããããã«ããŸãã
ãããã誀ããšçœ
å€ãã®åŸ©æ§èšç»ã倱æããã®ã¯ãWebhookããããäžåºŠæŒãããã¿ã³ããšããŠæ±ãããã§ããæåã®è©Šè¡ã§æ¢ã«äœããå€ããŠããå ŽåãäºåºŠç®ã¯ã«ãŒããäºåºŠè«æ±ãããéè€ã¬ã³ãŒããäœã£ããããŸãã
ããããçœ ã®äžã€ã¯ãæåã®ãã€ããŒããä¿åããã«ãªãã¬ã€ããããšã§ãããµããŒããåŸã§ãªãã¬ã€ãããšãã仿¥äœãçŽããããŒã¿ãéã£ãŠããŸããå®éã«å±ããã¡ãã»ãŒãžãšç°ãªãããšããããŸããããã§ã¯ç£æ»ãå£ãããã°åçŸãå°é£ã«ãªããŸãã
å¥ã®çœ ã¯ã¿ã€ã ã¹ã¿ã³ããåªçããŒã«äœ¿ãããšã§ãã2ã€ã®ã€ãã³ããåãç§ã«çºçããããšãããããæèšããããããšããããŸããåªçããŒã¯ãããã€ãã®äžæã€ãã³ãIDïŒãŸãã¯ãã€ããŒãã®å®å®ããäžæããã·ã¥ïŒã«çµã³ã€ããã¹ãã§ãæå»ã«ã¯äŸåããªãã§ãã ããã
ãµããŒããã±ããã«ç¹ããã¬ãããã©ãã°ïŒ
- ç¶æ ãã§ãã¯ãªãã«éåªçã¢ã¯ã·ã§ã³ãå詊è¡ããŠããïŒäŸïŒãinvoiceãäœãããæ¢ã«ååšããŠãåå®è¡ãããïŒ
- å詊è¡å¯èœãšã©ãŒïŒã¿ã€ã ã¢ãŠãã503ïŒãšæ°žä¹ çãšã©ãŒïŒçœ²åäžæ£ãå¿ é ãã£ãŒã«ãæ¬ èœïŒã®åºå¥ããªã
- 誰ã§ã䜿ãããªãã¬ã€ãã¿ã³ãæš©éãã§ãã¯ãªããçç±æ¬ãªããç£æ»ãã¬ã€ã«ãªã
- å®éã®ãã°ãé ãèªåå詊è¡ã«ãŒããäžæµãæ»æãç¶ãã
- 詊è¡åæ°ã«äžéããªããåãã€ãã³ããç¹°ãè¿ã倱æããŠã人ã«éç¥ãããªã
æ··åšããªã·ãŒã«ã泚æããŠãã ãããããŒã ãäž¡æ¹ã®ä»çµã¿ãç¡èª¿æŽã§æå¹ã«ãããšãåãã€ãã³ããå¥ã ã®ã¡ã«ããºã ãåéããŠããŸãããšããããŸãã
åçŽãªã·ããªãªïŒæ¯æãWebhookãå°éãããšãã«ããªãã®ã¢ããªã泚æä¿åã§ã¿ã€ã ã¢ãŠããããšããŸããå詊è¡ãã顧客ã«åè«æ±ãããã®ã§ã¯ãªããæ¢åã®è«æ±ã確èªããŠããæ³šæãPaidã«ããããªããåä»ãªäºæ ã¯é²ããŸããå®å šãªãªãã¬ã€ããŒã«ã¯åžžã«çŸåšã®ç¶æ ãæåã«ç¢ºèªããæ¬ ããŠããã¹ãããã ããå®è¡ããŸãã
åºè·åã®ç°¡åãã§ãã¯ãªã¹ã
埩æ§ã¯åŸåãã«ããæ©èœã§ã¯ãªããæåããçµã¿èŸŒãæ©èœã§ããåžžã«å®å šã«åå®è¡ã§ããäœãèµ·ããã説æã§ããããã«ããŸãããã
å®çšçãªåºè·åãã§ãã¯ãªã¹ãïŒ
- ããžãã¹ããžãã¯ãå®è¡ããåã«ããã¹ãŠã®Webhookã€ãã³ããåä¿¡æã«æ°žç¶åãããçã®ããã£ãããããåä¿¡æå»ãå®å®ããå€éšã€ãã³ãIDãä¿åã
- ã€ãã³ãããšã«1ã€ã®å®å®ããåªçæ§ããŒã䜿ãããã¹ãŠã®å詊è¡ãæåãªãã¬ã€ã§ãããåå©çšããã
- ããŒã¿ããŒã¹ã¬ãã«ã§éè€æé€ã匷å¶ãããå€éšIDïŒæ¯æãIDãè«æ±æžIDãã€ãã³ãIDïŒã«äžæå¶çŽã眮ãã2åç®ã®å®è¡ã§å¥è¡ãäœãããªãããã«ããã
- ãªãã¬ã€ã¯æç€ºçã§äºæž¬å¯èœã«ããã£ããã£ãäžå¯éãªããããžã§ãã³ã°ã®ãããªãªã¹ã¯ã®é«ãæäœã«ã¯ç¢ºèªãèŠæ±ããäœãèµ·ãããã衚瀺ããã
- åä¿¡ããåŠçãŸã§ã®æç¢ºãªã¹ããŒã¿ã¹ã远跡ããïŒreceivedãprocessingãsucceededãfailedãignoredãæåŸã®ãšã©ãŒã¡ãã»ãŒãžã詊è¡åæ°ã誰ããªãã¬ã€ããããå«ããã
å®äºãšåŒã¶åã«ãµããŒãã®èŠç¹ã§ãã¹ãããŠãã ããã誰ãã1å以å ã«çãããããïŒäœãèµ·ãããããªã倱æãããããªãã¬ã€åŸã«äœãå€ãã£ããïŒ
AppMasterã§ãããäœããªãããŸãData Designerã§ã€ãã³ããã°ãã¢ãã«åãããã®åŸã«åªçæ§ã確èªããå®å šãªãªãã¬ã€ã¢ã¯ã·ã§ã³ãæã€å°ããªç®¡çç»é¢ã远å ããŠãã ããããã®é åºã§è¡ãã°ãåŸã§å®å šæ§ã远å ããããããªãã¬ã€ã§ããªããã«å€ããã®ãé²ããŸãã
ãããã€æŠç¥ãæ©ãã«æ±ºããŠãã ãããã¯ã©ãŠããã»ã«ããã¹ããã¯éçšã«åœ±é¿ããŸãããµããŒããå®å šã«ãã°ãšãªãã¬ã€ç»é¢ã«ã¢ã¯ã»ã¹ã§ããä¿æããªã·ãŒãçŽäºè§£æ±ºã«ååãªå±¥æŽãæ®ãããšã確èªããŠãã ããã
äŸïŒæ¯æãWebhookãäžåºŠå€±æããŠããæåããå Žå
é¡§å®¢ãæ¯æããè¡ãããããã€ãã payment_succeeded ã€ãã³ããéããŸããåæã«ããªãã®DBãé«è² è·ã§æžã蟌ã¿ãã¿ã€ã ã¢ãŠããããšããŸãããããã€ãã«ã¯500ãè¿ããåŸã§å詊è¡ããŸãã
å®å šã«å埩ããã¹ãæµãã¯æ¬¡ã®ãšããã§ãïŒ
- 12:01 ã€ãã³ãID
evt_123ã§Webhook詊è¡#1ãå°çããã³ãã©ã¯INSERT invoiceã§DBã¿ã€ã ã¢ãŠãã«ãã倱æãã500ãè¿ãã - 12:05 ãããã€ããåãã€ãã³ãID
evt_123ãå詊è¡ããã³ãã©ã¯ãŸãéè€ãã§ãã¯ããŒãã«ã確èªãããŸã é©çšãããŠããªãããšã確èªããŠè«æ±æžãäœæããevt_123ãåŠçæžã¿ãšããŠããŒã¯ããŠ200ãè¿ãã
éèŠãªã®ã¯äž¡æ¹ã®é
ä¿¡ãåãã€ãã³ããšããŠæ±ãããšã§ããè«æ±æžã¯1ã€ã ãäœæãããæ³šæã¯1åã ã "Paid" ã«ç§»ãã顧客ã«ã¯é åæžã1éã ãéãããŸãããããã€ããæååŸã«ããã«å詊è¡ãéãããšããã£ãŠãããã³ãã©ã¯ evt_123 ãæ¢ã«åŠçæžã¿ãšèŠãŠããŒãªãã§200ãè¿ãã°ããã®ã§ãã
ãã°ã¯ãµããŒããå®å¿ããããã®ã§ããã¹ãã§ããè¯ãèšé²ã¯ã詊è¡#1ã¯DBã¿ã€ã ã¢ãŠãã§å€±æã詊è¡#2ãæåãæçµç¶æ ã¯é©çšæžã¿ããšç€ºããŸãã
ãµããŒãã evt_123 ã®ãªãã¬ã€ããŒã«ãéããšéå±ã§ããã¹ãã§ãïŒ"Already applied" ã衚瀺ãããªãã¬ã€ãã¿ã³ãæŒããŠãå®å
šãã§ãã¯ã ããåå®è¡ããããéè€è«æ±ãªããéè€ã¡ãŒã«ãªããäºéè«æ±ãªãã
次ã®ã¹ãããïŒå®çšçãªåŸ©æ§ãããŒãäœã
åãåãWebhookã€ãã³ãããã¹ãŠæžãåºããäœãªã¹ã¯ãé«ãªã¹ã¯ããããŒã¯ããŠãã ããã"User signed up" ã¯éåžžäœãªã¹ã¯ã§ããäžæ¹ã§ payment_succeededãrefund_issuedãsubscription_renewed ã¯é«ãªã¹ã¯ã§ããã¹ãééã®æå€±ãé¢åãªå·»ãæ»ããæããŸãã
ãã®åŸãåäœããæå°éã®åŸ©æ§ãããŒãäœããŸãïŒãã¹ãŠã®åä¿¡ã€ãã³ããä¿åããåªçãªãã³ãã©ã§åŠçãããµããŒãåãã®æå°éã®ãªãã¬ã€ç»é¢ãå ¬éãããç®æšã¯æŽŸæãªããã·ã¥ããŒãã§ã¯ãªããæ¬¡ã®è³ªåã«å®å šã«çããããããšã§ãïŒãåä¿¡ãããïŒåŠçãããïŒããŠããªããªãéè€ãªãã§å詊è¡ã§ãããïŒã
ã·ã³ãã«ãªæåã®ããŒãžã§ã³ïŒ
- çã®ãã€ããŒãããããã€ãã®ã€ãã³ãIDãåä¿¡æå»ãçŸåšã®ã¹ããŒã¿ã¹ãæ°žç¶åããã
- åãã€ãã³ããäºéã«è«æ±ãã¬ã³ãŒããäœããªãããåªçæ§ã匷å¶ããã
- åäžã€ãã³ããåå®è¡ãããªãã¬ã€ã¢ã¯ã·ã§ã³ã远å ããã
- æåŸã®ãšã©ãŒãšæåŸã®åŠç詊è¡ã衚瀺ããŠãµããŒããäœãèµ·ãããåããããã«ããã
ãããæ©èœãããããªã¹ã¯ã¬ãã«ã«å¿ããä¿è·ã远å ããŠãã ãããé«ãªã¹ã¯ã€ãã³ãã¯å³æ Œãªæš©éãæç¢ºãªç¢ºèªïŒäŸïŒããªãã¬ã€ã¯ãã«ãã£ã«ãåŒãèµ·ããå¯èœæ§ããããŸããç¶è¡ããŸããïŒãïŒã誰ããã€äœããããã®å®å šãªç£æ»ãã¬ã€ã«ãèŠæ±ããŸãã
ããŒã³ãŒãã§äœããããªããAppMasterïŒappmaster.ioïŒã¯ãã®ãã¿ãŒã³ã«é©ããå®çšçãªéžæè¢ã§ãïŒData Designerã«Webhookã€ãã³ããä¿åããBusiness Process Editorã§åªçãªã¯ãŒã¯ãããŒãå®è£ ããUIãã«ããŒã§å éšãªãã¬ã€ç®¡çç»é¢ãåºè·ã§ããŸãã
ãããã€ãæ©ãã«æ±ºããŠãã ãããã¯ã©ãŠãã§ãã»ã«ããã¹ãã§ãããµããŒããå®å šã«ãã°ãšãªãã¬ã€ç»é¢ã«ã¢ã¯ã»ã¹ã§ããä¿æããªã·ãŒãçŽäºè§£æ±ºã«ååãªå±¥æŽãä¿ã€ããšã確èªããŠãã ããã
ãŸãšãã®ãã§ãã¯ãªã¹ãïŒåºè·åïŒ
- åä¿¡ããWebhookã€ãã³ãã¯å¿ ãæ°žç¶åããïŒçã®ããã£ãããããåä¿¡æå»ãå€éšã€ãã³ãIDãä¿åïŒã
- ã€ãã³ãããšã«å®å®ããåªçæ§ããŒã䜿ãããã¹ãŠã®å詊è¡ãšæåãªãã¬ã€ã§ãã®ããŒãåå©çšããã
- ããŒã¿ããŒã¹åŽã§ã®éè€æé€ã匷å¶ãããäžæå¶çŽã«ããäºåºŠç®ã®å®è¡ã§å¥è¡ãäœãããªãããã«ããã
- ãªãã¬ã€ã¯æç€ºçã§äºæž¬å¯èœã«ãæ¯æãã®ãã£ããã£ãäžå¯éãªæäœã¯ç¢ºèªãèŠæ±ããã
- åä¿¡ããé©çšãŸã§ã®ã¹ããŒã¿ã¹ã远跡ããïŒreceivedãprocessingãsucceededãfailedãignoredïŒãæåŸã®ãšã©ãŒã詊è¡åæ°ããªãã¬ã€å®è¡è ãå«ããã
æåŸã«ããµããŒãã®è³ªåããã¹ãããŠãã ããïŒ1å以å ã«ãäœãèµ·ããããããªã倱æããããããªãã¬ã€åŸã«äœãå€ãã£ããããçããããããã«ããããšã
ããAppMasterã§ãããäœããªãããŸãData Designerã§ã€ãã³ããã°ãå®çŸ©ããæ¬¡ã«UIã§å®å šãªãªãã¬ã€ã¢ã¯ã·ã§ã³ãæã€ç®¡çç»é¢ãäœã£ãŠãã ãããããããåŸã§å®å šæ§ãè¶³ããããå®å šã«ãªãã¬ã€ã§ããªããã«ãªãã®ãé²ããŸãã
ä»é²ïŒå®å šã«åŸ©æ§ããç°¡åãªäŸ
é¡§å®¢ãæ¯æããè¡ãããããã€ãã payment_succeeded ãéä¿¡ãããšãããããªãã®DBæžã蟌ã¿ãã¿ã€ã ã¢ãŠãããŠ500ãè¿ããŠããŸã£ããšããŸãããããã€ã㯠evt_123 ãå詊è¡ãã2åç®ã§æåããŸããã
çæ³çãªèšé²ã¯ããã§ãïŒè©Šè¡#1ã¯DBã¿ã€ã ã¢ãŠãã§å€±æã詊è¡#2ãæåãæçµç¶æ ã¯é©çšæžã¿ããµããŒãããªãã¬ã€ãèŠãŠããæ¢ã«é©çšæžã¿ããšè¡šç€ºããããªãã¬ã€ããŠãäºéè«æ±ãéè€ã¡ãŒã«ã¯çºçããŸããã
ãããå®çŸããã«ã¯ïŒ
- åä¿¡æã«ã€ãã³ããä¿åãã
- åªçæ§ããŒã§éè€ãé²ã
- ããŒã¿ããŒã¹ã®äžæå¶çŽã§æçµçãªä¿èšŒãåŸã
- ãªãã¬ã€ã¯åããã³ãã©ãéããŠå®è¡ãããã¬ãã¥ãŒã確èªãå ãã
ããã ãã§ãµããŒãã¯å®å¿ããŠæäœã§ããŸãã
æåŸã«
ãã¹ãŠã®Webhookãããžãã¹ããã»ã¹ãšããŠæ±ããäœãªã¹ã¯ã¯èªåå詊è¡ãé«ãªã¹ã¯ã¯æç¢ºãªæåãªãã¬ã€ã§ä¿è·ããèšèšãå®å šã§ãããŸãã¯åä¿¡ãä¿åããŠåªçã«åŠçãããµããŒãåãã«ã·ã³ãã«ã§å®å šãªãªãã¬ã€æ©èœãçšæããŠãã ããã


