{"id":12851,"date":"2023-03-19T15:40:41","date_gmt":"2023-03-19T12:10:41","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/basic-understanding-of-webhooks-with-examples-5877\/"},"modified":"2023-03-19T15:40:41","modified_gmt":"2023-03-19T12:10:41","slug":"basic-understanding-of-webhooks-with-examples-5877","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/basic-understanding-of-webhooks-with-examples-5877\/","title":{"rendered":"\u062f\u0631\u06a9 \u0627\u0648\u0644\u06cc\u0647 \u0627\u0632 Webhooks \u0628\u0627 \u0645\u062b\u0627\u0644"},"content":{"rendered":"<div data-article-id=\"1406408\" id=\"article-body\">\n<p>Webhooks \u0631\u0627\u0647\u06cc \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u062e\u0627\u0631\u062c\u06cc \u0627\u0633\u062a \u062a\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u0645\u0648\u0631\u062f \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u0633\u0631\u0648\u06cc\u0633 \u0631\u062e \u0645\u06cc \u062f\u0647\u062f \u0645\u0637\u0644\u0639 \u06a9\u0646\u062f.  \u0628\u0647 \u0639\u0628\u0627\u0631\u062a \u062f\u06cc\u06af\u0631\u060c \u0627\u06cc\u0646 \u0631\u0648\u0634\u06cc \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0628\u0631\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0627\u0639\u0644\u0627\u0646 \u0647\u0627\u06cc \u0628\u0644\u0627\u062f\u0631\u0646\u06af \u0627\u0632 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062e\u0627\u0631\u062c \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0627\u062a\u0641\u0627\u0642 \u0645\u06cc \u0627\u0641\u062a\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u0645\u06cc\u0646\u0647 Ruby on Rails\u060c \u0648\u0628 \u0647\u0648\u06a9 \u0647\u0627 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0628\u0631\u0627\u06cc \u0627\u062f\u063a\u0627\u0645 \u0628\u0627 \u0633\u0631\u0648\u06cc\u0633 \u0647\u0627\u06cc \u0634\u062e\u0635 \u062b\u0627\u0644\u062b \u0645\u0627\u0646\u0646\u062f Stripe\u060c PayPal \u0648 \u062f\u06cc\u06af\u0631\u0627\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u0646\u062f.  \u0627\u06cc\u0646 \u0633\u0631\u0648\u06cc\u0633 \u0647\u0627 \u0627\u0632 webhook \u0647\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u0627\u0639\u0644\u0627\u0646 \u0647\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u062f\u0631 \u0645\u0648\u0631\u062f \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f \u067e\u0631\u062f\u0627\u062e\u062a \u0647\u0627\u06cc \u0645\u0648\u0641\u0642\u060c \u067e\u0631\u062f\u0627\u062e\u062a \u0647\u0627\u06cc \u0646\u0627\u0645\u0648\u0641\u0642\u060c \u0645\u0634\u062a\u0631\u06a9\u06cc\u0646 \u062c\u062f\u06cc\u062f \u0648 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0648\u0628 \u0647\u0648\u06a9 \u0647\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 Ruby on Rails \u062e\u0648\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0641\u0631\u0622\u06cc\u0646\u062f\u0647\u0627\u06cc\u06cc \u0631\u0627 \u06a9\u0647 \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0645\u062f\u0627\u062e\u0644\u0647 \u062f\u0633\u062a\u06cc \u062f\u0627\u0631\u0646\u062f\u060c \u0645\u0627\u0646\u0646\u062f \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u0648\u0636\u0639\u06cc\u062a \u062d\u0633\u0627\u0628 \u06a9\u0627\u0631\u0628\u0631 \u06cc\u0627 \u0627\u0631\u0633\u0627\u0644 \u0627\u0639\u0644\u0627\u0646 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646\u060c \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f.  \u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0628\u062e\u0634\u062f \u0648 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0633\u0627\u062f\u0647 \u06a9\u0646\u062f.<\/p>\n<p>\u0648\u0628 \u0647\u0648\u06a9 \u0647\u0627 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u067e\u0631\u0648\u062a\u06a9\u0644 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641\u06cc \u0645\u0627\u0646\u0646\u062f HTTP\u060c HTTPS \u0648 \u063a\u06cc\u0631\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0631\u062f.  \u062f\u0631 Ruby on Rails\u060c \u0648\u0628\u06a9\u200c\u0647\u0648\u06a9\u200c\u0647\u0627 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u06a9\u0646\u062a\u0631\u0644\u200c\u06a9\u0646\u0646\u062f\u0647\u200c\u0627\u06cc \u06a9\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0648\u0628\u200c\u0647\u0648\u06a9 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u0648 \u067e\u0631\u062f\u0627\u0632\u0634 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f\u060c \u0648 \u06a9\u0627\u0631\u0647\u0627\u06cc \u067e\u0633\u200c\u0632\u0645\u06cc\u0646\u0647 \u0628\u0631\u0627\u06cc \u0627\u0646\u062c\u0627\u0645 \u06a9\u0627\u0631 \u0648\u0627\u0642\u0639\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0648\u0628 \u0647\u0648\u06a9\u060c \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u06cc\u200c\u0634\u0648\u0646\u062f.<\/p>\n<p>\u0628\u0647 \u0637\u0648\u0631 \u06a9\u0644\u06cc\u060c webhooks \u06cc\u06a9 \u0631\u0627\u0647 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0628\u0631\u0627\u06cc \u0627\u062f\u063a\u0627\u0645 \u0628\u0631\u0646\u0627\u0645\u0647 Ruby on Rails \u0634\u0645\u0627 \u0628\u0627 \u062e\u062f\u0645\u0627\u062a \u0634\u062e\u0635 \u062b\u0627\u0644\u062b \u0648 \u062e\u0648\u062f\u06a9\u0627\u0631\u0633\u0627\u0632\u06cc \u0641\u0631\u0622\u06cc\u0646\u062f\u0647\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<p>\u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0627\u0631\u0622\u0645\u062f \u0648 \u0628\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0635\u062d\u06cc\u062d \u062e\u0637\u0627\u0647\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 Ruby on Rails \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u062d\u062c\u0645 \u0632\u06cc\u0627\u062f\u06cc \u0627\u0632 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0648\u0628 \u0647\u0648\u06a9 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u062f \u0648 \u062e\u0637\u0627\u0647\u0627\u06cc\u06cc \u0631\u0627 \u06a9\u0647 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0631\u062e \u062f\u0647\u062f \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u062f\u060c \u0645\u0647\u0645 \u0627\u0633\u062a.  \u062f\u0631 \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644\u060c \u0645\u0627 \u0627\u0632 \u0633\u0631\u0648\u06cc\u0633 \u067e\u0631\u062f\u0627\u0632\u0634 \u067e\u0631\u062f\u0627\u062e\u062a \u0645\u062d\u0628\u0648\u0628 Stripe \u0628\u0631\u0627\u06cc \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0646 \u0646\u062d\u0648\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0627\u0631\u0622\u0645\u062f \u0648 \u0628\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0635\u062d\u06cc\u062d \u062e\u0637\u0627\u0647\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 Ruby on Rails \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.<\/p>\n<p><strong>\u0628\u0631\u067e\u0627\u06cc\u06cc<\/strong><br \/>\u0627\u0648\u0644\u06cc\u0646 \u0642\u062f\u0645 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 Gem Stripe \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0631\u062f\u0647 \u0648 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 Rails \u062e\u0648\u062f \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f.  \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0627 \u0627\u0641\u0632\u0648\u062f\u0646 \u06a9\u062f \u0632\u06cc\u0631 \u0628\u0647 Gemfile \u062e\u0648\u062f \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f:<br \/><code>gem 'stripe'<\/code><\/p>\n<p>\u0633\u067e\u0633\u060c bundle install \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u062a\u0627 Gem \u0646\u0635\u0628 \u0634\u0648\u062f \u0648 a \u0627\u06cc\u062c\u0627\u062f \u0634\u0648\u062f <code>config\/initializers\/stripe.rb<\/code> \u0641\u0627\u06cc\u0644 \u0628\u0631\u0627\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc Stripe API:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight ruby\"><code><span class=\"no\">Rails<\/span><span class=\"p\">.<\/span><span class=\"nf\">configuration<\/span><span class=\"p\">.<\/span><span class=\"nf\">stripe<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"ss\">publishable_key: <\/span><span class=\"no\">ENV<\/span><span class=\"p\">[<\/span><span class=\"s1\">'STRIPE_PUBLISHABLE_KEY'<\/span><span class=\"p\">],<\/span>\n  <span class=\"ss\">secret_key: <\/span><span class=\"no\">ENV<\/span><span class=\"p\">[<\/span><span class=\"s1\">'STRIPE_SECRET_KEY'<\/span><span class=\"p\">]<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"no\">Stripe<\/span><span class=\"p\">.<\/span><span class=\"nf\">api_key<\/span> <span class=\"o\">=<\/span> <span class=\"no\">Rails<\/span><span class=\"p\">.<\/span><span class=\"nf\">configuration<\/span><span class=\"p\">.<\/span><span class=\"nf\">stripe<\/span><span class=\"p\">[<\/span><span class=\"ss\">:secret_key<\/span><span class=\"p\">]<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u06cc\u06a9 \u06a9\u0646\u062a\u0631\u0644\u0631 Webhooks \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/strong><br \/>\u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u060c \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u06a9\u0646\u062a\u0631\u0644\u0631 \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u0648\u0628 \u0647\u0648\u06a9 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.  \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>WebhooksController<\/code> \u0628\u0627 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631:<br \/><code>rails generate controller webhooks<\/code><\/p>\n<p>\u062f\u0631 <code>webhooks_controller.rb<\/code> \u0641\u0627\u06cc\u0644\u060c \u06cc\u06a9 \u0631\u0648\u0634 \u062c\u062f\u06cc\u062f \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u0648\u0628 \u0647\u0648\u06a9 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight ruby\"><code><span class=\"k\">class<\/span> <span class=\"nc\">WebhooksController<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ApplicationController<\/span>\n  <span class=\"n\">skip_before_action<\/span> <span class=\"ss\">:verify_authenticity_token<\/span>\n\n  <span class=\"k\">def<\/span> <span class=\"nf\">receive<\/span>\n    <span class=\"n\">event<\/span> <span class=\"o\">=<\/span> <span class=\"no\">Stripe<\/span><span class=\"o\">::<\/span><span class=\"no\">Event<\/span><span class=\"p\">.<\/span><span class=\"nf\">construct_from<\/span><span class=\"p\">(<\/span><span class=\"n\">params<\/span><span class=\"p\">.<\/span><span class=\"nf\">to_unsafe_h<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"c1\"># Handle the event<\/span>\n    <span class=\"k\">begin<\/span>\n      <span class=\"k\">case<\/span> <span class=\"n\">event<\/span><span class=\"p\">.<\/span><span class=\"nf\">type<\/span>\n      <span class=\"k\">when<\/span> <span class=\"s1\">'payment_intent.succeeded'<\/span>\n        <span class=\"n\">handle_payment_succeeded<\/span><span class=\"p\">(<\/span><span class=\"n\">event<\/span><span class=\"p\">.<\/span><span class=\"nf\">data<\/span><span class=\"p\">.<\/span><span class=\"nf\">object<\/span><span class=\"p\">)<\/span>\n      <span class=\"k\">when<\/span> <span class=\"s1\">'payment_intent.payment_failed'<\/span>\n        <span class=\"n\">handle_payment_failed<\/span><span class=\"p\">(<\/span><span class=\"n\">event<\/span><span class=\"p\">.<\/span><span class=\"nf\">data<\/span><span class=\"p\">.<\/span><span class=\"nf\">object<\/span><span class=\"p\">)<\/span>\n      <span class=\"k\">else<\/span>\n        <span class=\"k\">raise<\/span> <span class=\"s2\">\"Unhandled event type: <\/span><span class=\"si\">#{<\/span><span class=\"n\">event<\/span><span class=\"p\">.<\/span><span class=\"nf\">type<\/span><span class=\"si\">}<\/span><span class=\"s2\">\"<\/span>\n      <span class=\"k\">end<\/span>\n    <span class=\"k\">rescue<\/span> <span class=\"no\">StandardError<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"n\">e<\/span>\n      <span class=\"n\">render<\/span> <span class=\"ss\">json: <\/span><span class=\"p\">{<\/span> <span class=\"ss\">error: <\/span><span class=\"n\">e<\/span><span class=\"p\">.<\/span><span class=\"nf\">message<\/span> <span class=\"p\">},<\/span> <span class=\"ss\">status: :unprocessable_entity<\/span>\n    <span class=\"k\">end<\/span>\n\n    <span class=\"n\">render<\/span> <span class=\"ss\">json: <\/span><span class=\"p\">{<\/span> <span class=\"ss\">message: <\/span><span class=\"s1\">'Webhook received successfully'<\/span> <span class=\"p\">},<\/span> <span class=\"ss\">status: :ok<\/span>\n  <span class=\"k\">end<\/span>\n\n  <span class=\"kp\">private<\/span>\n\n    <span class=\"k\">def<\/span> <span class=\"nf\">handle_payment_succeeded<\/span><span class=\"p\">(<\/span><span class=\"n\">payment_intent<\/span><span class=\"p\">)<\/span>\n        <span class=\"c1\"># Find the user associated with the payment<\/span>\n        <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"no\">User<\/span><span class=\"p\">.<\/span><span class=\"nf\">find_by<\/span><span class=\"p\">(<\/span><span class=\"ss\">stripe_customer_id: <\/span><span class=\"n\">payment_intent<\/span><span class=\"p\">.<\/span><span class=\"nf\">customer<\/span><span class=\"p\">)<\/span>\n\n        <span class=\"c1\"># Check if the payment covers any outstanding invoices<\/span>\n        <span class=\"n\">invoices<\/span> <span class=\"o\">=<\/span> <span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"nf\">invoices<\/span><span class=\"p\">.<\/span><span class=\"nf\">unpaid<\/span>\n        <span class=\"n\">invoices<\/span><span class=\"p\">.<\/span><span class=\"nf\">each<\/span> <span class=\"k\">do<\/span> <span class=\"o\">|<\/span><span class=\"n\">invoice<\/span><span class=\"o\">|<\/span>\n            <span class=\"k\">if<\/span> <span class=\"n\">invoice<\/span><span class=\"p\">.<\/span><span class=\"nf\">amount_due<\/span> <span class=\"o\">&lt;=<\/span> <span class=\"n\">payment_intent<\/span><span class=\"p\">.<\/span><span class=\"nf\">amount_received<\/span>\n            <span class=\"n\">invoice<\/span><span class=\"p\">.<\/span><span class=\"nf\">update<\/span><span class=\"p\">(<\/span><span class=\"ss\">status: <\/span><span class=\"s1\">'paid'<\/span><span class=\"p\">,<\/span> <span class=\"ss\">paid_at: <\/span><span class=\"no\">Time<\/span><span class=\"p\">.<\/span><span class=\"nf\">now<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">payment_intent<\/span><span class=\"p\">.<\/span><span class=\"nf\">amount_received<\/span> <span class=\"o\">-=<\/span> <span class=\"n\">invoice<\/span><span class=\"p\">.<\/span><span class=\"nf\">amount_due<\/span>\n            <span class=\"k\">end<\/span>\n        <span class=\"k\">end<\/span>\n\n        <span class=\"c1\"># Create a new payment record<\/span>\n        <span class=\"n\">payment<\/span> <span class=\"o\">=<\/span> <span class=\"no\">Payment<\/span><span class=\"p\">.<\/span><span class=\"nf\">create<\/span><span class=\"p\">(<\/span>\n            <span class=\"ss\">user: <\/span><span class=\"n\">user<\/span><span class=\"p\">,<\/span>\n            <span class=\"ss\">amount: <\/span><span class=\"n\">payment_intent<\/span><span class=\"p\">.<\/span><span class=\"nf\">amount_received<\/span><span class=\"p\">,<\/span>\n            <span class=\"ss\">payment_method: <\/span><span class=\"n\">payment_intent<\/span><span class=\"p\">.<\/span><span class=\"nf\">payment_method<\/span><span class=\"p\">,<\/span>\n            <span class=\"ss\">payment_intent_id: <\/span><span class=\"n\">payment_intent<\/span><span class=\"p\">.<\/span><span class=\"nf\">id<\/span><span class=\"p\">,<\/span>\n            <span class=\"ss\">status: <\/span><span class=\"n\">payment_intent<\/span><span class=\"p\">.<\/span><span class=\"nf\">status<\/span><span class=\"p\">,<\/span>\n            <span class=\"ss\">paid_at: <\/span><span class=\"n\">payment_intent<\/span><span class=\"p\">.<\/span><span class=\"nf\">created<\/span>\n        <span class=\"p\">)<\/span>\n\n        <span class=\"c1\"># Send a confirmation email to the user<\/span>\n        <span class=\"no\">UserMailer<\/span><span class=\"p\">.<\/span><span class=\"nf\">payment_received<\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">,<\/span> <span class=\"n\">payment<\/span><span class=\"p\">).<\/span><span class=\"nf\">deliver_later<\/span>\n        <span class=\"k\">rescue<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"n\">e<\/span>\n         <span class=\"no\">Rails<\/span><span class=\"p\">.<\/span><span class=\"nf\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Error handling payment failed webhook: <\/span><span class=\"si\">#{<\/span><span class=\"n\">e<\/span><span class=\"si\">}<\/span><span class=\"s2\">\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">end<\/span>\n\n    <span class=\"k\">def<\/span> <span class=\"nf\">handle_payment_failed<\/span><span class=\"p\">(<\/span><span class=\"n\">payment_intent<\/span><span class=\"p\">)<\/span>\n        <span class=\"c1\"># Find the user associated with the payment<\/span>\n        <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"no\">User<\/span><span class=\"p\">.<\/span><span class=\"nf\">find_by<\/span><span class=\"p\">(<\/span><span class=\"ss\">stripe_customer_id: <\/span><span class=\"n\">payment_intent<\/span><span class=\"p\">.<\/span><span class=\"nf\">customer<\/span><span class=\"p\">)<\/span>\n\n        <span class=\"c1\"># Handle any unpaid invoices<\/span>\n        <span class=\"n\">invoices<\/span> <span class=\"o\">=<\/span> <span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"nf\">invoices<\/span><span class=\"p\">.<\/span><span class=\"nf\">unpaid<\/span>\n        <span class=\"n\">invoices<\/span><span class=\"p\">.<\/span><span class=\"nf\">each<\/span> <span class=\"k\">do<\/span> <span class=\"o\">|<\/span><span class=\"n\">invoice<\/span><span class=\"o\">|<\/span>\n            <span class=\"n\">invoice<\/span><span class=\"p\">.<\/span><span class=\"nf\">update<\/span><span class=\"p\">(<\/span><span class=\"ss\">status: <\/span><span class=\"s1\">'failed'<\/span><span class=\"p\">,<\/span> <span class=\"ss\">failed_at: <\/span><span class=\"no\">Time<\/span><span class=\"p\">.<\/span><span class=\"nf\">now<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">end<\/span>\n\n        <span class=\"c1\"># Create a new payment record<\/span>\n        <span class=\"n\">payment<\/span> <span class=\"o\">=<\/span> <span class=\"no\">Payment<\/span><span class=\"p\">.<\/span><span class=\"nf\">create<\/span><span class=\"p\">(<\/span>\n            <span class=\"ss\">user: <\/span><span class=\"n\">user<\/span><span class=\"p\">,<\/span>\n            <span class=\"ss\">amount: <\/span><span class=\"n\">payment_intent<\/span><span class=\"p\">.<\/span><span class=\"nf\">amount_received<\/span><span class=\"p\">,<\/span>\n            <span class=\"ss\">payment_method: <\/span><span class=\"n\">payment_intent<\/span><span class=\"p\">.<\/span><span class=\"nf\">payment_method<\/span><span class=\"p\">,<\/span>\n            <span class=\"ss\">payment_intent_id: <\/span><span class=\"n\">payment_intent<\/span><span class=\"p\">.<\/span><span class=\"nf\">id<\/span><span class=\"p\">,<\/span>\n            <span class=\"ss\">status: <\/span><span class=\"n\">payment_intent<\/span><span class=\"p\">.<\/span><span class=\"nf\">status<\/span><span class=\"p\">,<\/span>\n            <span class=\"ss\">failed_at: <\/span><span class=\"n\">payment_intent<\/span><span class=\"p\">.<\/span><span class=\"nf\">created<\/span>\n        <span class=\"p\">)<\/span>\n\n        <span class=\"c1\"># Send a notification email to the user<\/span>\n        <span class=\"no\">UserMailer<\/span><span class=\"p\">.<\/span><span class=\"nf\">payment_failed<\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">,<\/span> <span class=\"n\">payment<\/span><span class=\"p\">).<\/span><span class=\"nf\">deliver_later<\/span>\n        <span class=\"k\">rescue<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"n\">e<\/span>\n         <span class=\"no\">Rails<\/span><span class=\"p\">.<\/span><span class=\"nf\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Error handling payment failed webhook: <\/span><span class=\"si\">#{<\/span><span class=\"n\">e<\/span><span class=\"si\">}<\/span><span class=\"s2\">\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">end<\/span>\n<span class=\"k\">end<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0628\u062a\u062f\u0627 \u06a9\u0627\u0631\u0628\u0631 \u0645\u0631\u062a\u0628\u0637 \u0628\u0627 \u067e\u0631\u062f\u0627\u062e\u062a \u0631\u0627 \u0628\u0627 \u062c\u0633\u062a\u062c\u0648\u06cc \u0634\u0646\u0627\u0633\u0647 \u0645\u0634\u062a\u0631\u06cc Stripe \u0622\u0646\u0647\u0627 \u067e\u06cc\u062f\u0627 \u0645\u06cc \u06a9\u0646\u06cc\u0645.  \u0633\u067e\u0633 \u0628\u0627 \u062a\u06a9\u0631\u0627\u0631 \u0635\u0648\u0631\u062a\u200c\u062d\u0633\u0627\u0628\u200c\u0647\u0627\u06cc \u067e\u0631\u062f\u0627\u062e\u062a\u200c\u0646\u0634\u062f\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0648 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u200c\u0647\u0627 \u0628\u0647 \u00ab\u067e\u0631\u062f\u0627\u062e\u062a \u0634\u062f\u0647\u00bb \u062f\u0631 \u0635\u0648\u0631\u062a \u06a9\u0627\u0641\u06cc \u0628\u0648\u062f\u0646 \u0645\u0628\u0644\u063a \u067e\u0631\u062f\u0627\u062e\u062a\u060c \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0622\u06cc\u0627 \u067e\u0631\u062f\u0627\u062e\u062a \u0635\u0648\u0631\u062a\u200c\u062d\u0633\u0627\u0628\u200c\u0647\u0627\u06cc \u0645\u0639\u0648\u0642 \u0631\u0627 \u067e\u0648\u0634\u0634 \u0645\u06cc\u200c\u062f\u0647\u062f \u06cc\u0627 \u062e\u06cc\u0631.<\/p>\n<p>\u0633\u067e\u0633 \u06cc\u06a9 \u0631\u06a9\u0648\u0631\u062f \u067e\u0631\u062f\u0627\u062e\u062a \u062c\u062f\u06cc\u062f \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062e\u0648\u062f \u0628\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u0627\u0632 \u0634\u06cc payment_intent\u060c \u0627\u0632 \u062c\u0645\u0644\u0647 \u06a9\u0627\u0631\u0628\u0631\u060c \u0645\u0628\u0644\u063a \u067e\u0631\u062f\u0627\u062e\u062a\u060c \u0631\u0648\u0634 \u067e\u0631\u062f\u0627\u062e\u062a\u060c \u0634\u0646\u0627\u0633\u0647 \u0642\u0635\u062f \u067e\u0631\u062f\u0627\u062e\u062a \u0648 \u0648\u0636\u0639\u06cc\u062a \u067e\u0631\u062f\u0627\u062e\u062a \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645.  \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u0647\u0631 \u0632\u0645\u0627\u0646\u06cc pay_at \u0631\u0627 \u0631\u0648\u06cc \u0632\u0645\u0627\u0646 \u0627\u06cc\u062c\u0627\u062f \u067e\u0631\u062f\u0627\u062e\u062a \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0631\u062f\u06cc\u0645.<\/p>\n<p>\u0633\u067e\u0633 \u0628\u0627 \u062c\u0633\u062a\u062c\u0648\u06cc \u0634\u0646\u0627\u0633\u0647 \u0645\u0634\u062a\u0631\u06cc Stripe \u06a9\u0627\u0631\u0628\u0631 \u0645\u0631\u062a\u0628\u0637 \u0628\u0627 \u067e\u0631\u062f\u0627\u062e\u062a \u0631\u0627 \u067e\u06cc\u062f\u0627 \u0645\u06cc \u06a9\u0646\u06cc\u0645.  \u0633\u067e\u0633 \u0628\u0627 \u062a\u06a9\u0631\u0627\u0631 \u0635\u0648\u0631\u062a\u200c\u062d\u0633\u0627\u0628\u200c\u0647\u0627\u06cc \u067e\u0631\u062f\u0627\u062e\u062a\u200c\u0646\u0634\u062f\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0648 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u200c\u0647\u0627 \u0628\u0647 \u00ab\u0646\u0627\u0645\u0648\u0641\u0642\u00bb \u0628\u0627 \u0631\u0648\u0634 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc\u060c \u0647\u0631\u06af\u0648\u0646\u0647 \u0641\u0627\u06a9\u062a\u0648\u0631 \u067e\u0631\u062f\u0627\u062e\u062a\u200c\u0646\u0634\u062f\u0647 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0633\u067e\u0633 \u06cc\u06a9 \u0631\u06a9\u0648\u0631\u062f \u067e\u0631\u062f\u0627\u062e\u062a \u062c\u062f\u06cc\u062f \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062e\u0648\u062f \u0628\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u0627\u0632 \u0634\u06cc payment_intent\u060c \u0627\u0632 \u062c\u0645\u0644\u0647 \u06a9\u0627\u0631\u0628\u0631\u060c \u0645\u0628\u0644\u063a \u067e\u0631\u062f\u0627\u062e\u062a\u060c \u0631\u0648\u0634 \u067e\u0631\u062f\u0627\u062e\u062a\u060c \u0634\u0646\u0627\u0633\u0647 \u0642\u0635\u062f \u067e\u0631\u062f\u0627\u062e\u062a \u0648 \u0648\u0636\u0639\u06cc\u062a \u067e\u0631\u062f\u0627\u062e\u062a \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645.  \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 fault_at \u0631\u0627 \u0631\u0648\u06cc \u0632\u0645\u0627\u0646 \u0627\u06cc\u062c\u0627\u062f \u067e\u0631\u062f\u0627\u062e\u062a \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0631\u062f\u06cc\u0645.<\/p>\n<p>\u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0634\u06cc UserMailer \u0648 \u0631\u0648\u0634 deliver_later \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644 \u0628\u0647 \u0635\u0648\u0631\u062a \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646\u060c \u06cc\u06a9 \u0627\u06cc\u0645\u06cc\u0644 \u0627\u0639\u0644\u0627\u0646 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p><strong>Webhooks \u0631\u0627 \u062f\u0631 Stripe \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f<\/strong><br \/>\u0627\u06a9\u0646\u0648\u0646 \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u0648\u0628 \u0647\u0648\u06a9 \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u0628\u0627\u06cc\u062f \u062d\u0633\u0627\u0628 Stripe \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u0648\u0628 \u0647\u0648\u06a9 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f.  \u0648\u0627\u0631\u062f \u062f\u0627\u0634\u0628\u0648\u0631\u062f Stripe \u062e\u0648\u062f \u0634\u0648\u06cc\u062f \u0648 \u0628\u0647 \u062a\u0628 &#8220;Webhooks&#8221; \u0628\u0631\u0648\u06cc\u062f.<\/p>\n<p>\u0631\u0648\u06cc \u062f\u06a9\u0645\u0647 &#8220;\u0627\u0641\u0632\u0648\u062f\u0646 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646&#8221; \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f \u0648 URL \u0631\u0627 \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0648\u0628 \u0647\u0648\u06a9 \u062e\u0648\u062f \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 https:\/\/example.com\/webhooks\/receive).  \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0641\u06cc\u0644\u062f\u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0631\u0627 \u0628\u0627 \u0645\u0642\u0627\u062f\u06cc\u0631 \u067e\u06cc\u0634 \u0641\u0631\u0636 \u062e\u0648\u062f \u0631\u0647\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc\u06cc \u0631\u0627 \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f \u0648 \u0631\u0648\u06cc \u062f\u06a9\u0645\u0647 \u00ab\u0627\u0641\u0632\u0648\u062f\u0646 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc\u00bb \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f.  Stripe \u0627\u06a9\u0646\u0648\u0646 \u0647\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0647 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0627\u0646\u062a\u062e\u0627\u0628 \u0634\u062f\u0647 \u0631\u062e \u062f\u0647\u062f\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc webhook \u0631\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<p><strong>\u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0631\u062f\u0646<\/strong><br \/>\u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u062a\u0631\u0644 \u0648\u0628 \u0647\u0648\u06a9 \u062e\u0648\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 Stripe CLI \u0628\u0631\u0627\u06cc \u0634\u0628\u06cc\u0647 \u0633\u0627\u0632\u06cc \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.  Stripe CLI \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f \u0648 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f: <code>stripe trigger payment_intent.succeeded<\/code><\/p>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0631\u0648\u06cc\u062f\u0627\u062f payment_intent.succeeded \u0631\u0627 \u0634\u0628\u06cc\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a webhook \u0631\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc\u200c\u06a9\u0646\u062f.  \u06af\u0632\u0627\u0631\u0634 \u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u062a\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0648\u0628 \u0647\u0648\u06a9 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u062f\u0631\u06cc\u0627\u0641\u062a \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06cc\u06a9 \u067e\u0631\u062f\u0627\u062e\u062a \u0646\u0627\u0645\u0648\u0641\u0642 \u0631\u0627 \u0628\u0627 \u0627\u062c\u0631\u0627\u06cc:<br \/><code>stripe trigger payment_intent.payment_failed<\/code><\/p>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0631\u0648\u06cc\u062f\u0627\u062f payment_intent.payment_failed \u0631\u0627 \u0634\u0628\u06cc\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a webhook \u0631\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc\u200c\u06a9\u0646\u062f.  \u062f\u0648\u0628\u0627\u0631\u0647\u060c \u06af\u0632\u0627\u0631\u0634 \u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u062a\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0648\u0628 \u0647\u0648\u06a9 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u062f\u0631\u06cc\u0627\u0641\u062a \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0627\u06af\u0631 \u062f\u0631 \u062d\u06cc\u0646 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0628 \u0647\u0648\u06a9 \u062e\u0637\u0627\u06cc\u06cc \u0631\u062e \u062f\u0627\u062f\u060c \u06af\u0632\u0627\u0631\u0634 \u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u067e\u06cc\u0627\u0645 \u0647\u0627\u06cc \u062e\u0637\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u06a9\u062f \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062e\u0637\u0627 \u0628\u0647 \u062f\u0631\u0633\u062a\u06cc \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0647\u0645\u0686\u0646\u06cc\u0646 \u0627\u06cc\u062f\u0647 \u062e\u0648\u0628\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0628 \u0647\u0648\u06a9 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0633\u0646\u0627\u0631\u06cc\u0648\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641\u06cc \u0627\u0632 \u062c\u0645\u0644\u0647 \u067e\u0631\u062f\u0627\u062e\u062a \u0647\u0627\u06cc \u0645\u0648\u0641\u0642 \u0648 \u0646\u0627\u0645\u0648\u0641\u0642\u060c \u062e\u0637\u0627\u0647\u0627\u06cc \u0634\u0628\u06a9\u0647 \u0648 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u063a\u06cc\u0631\u0645\u0646\u062a\u0638\u0631\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0648 \u0628\u0633!  \u0627\u06a9\u0646\u0648\u0646 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 Ruby on Rails \u062e\u0648\u062f \u062f\u0627\u0631\u0627\u06cc \u06cc\u06a9 \u0633\u06cc\u0633\u062a\u0645 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0628 \u0647\u0648\u06a9 \u0642\u0648\u06cc \u0648 \u06a9\u0627\u0631\u0622\u0645\u062f \u0647\u0633\u062a\u06cc\u062f.  \u0628\u0627 \u06a9\u0646\u062a\u0631\u0644 \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0635\u062d\u06cc\u062d \u062e\u0637\u0627\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062d\u062c\u0645 \u0632\u06cc\u0627\u062f\u06cc \u0627\u0632 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u0648\u0628 \u0647\u0648\u06a9 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u062f \u0648 \u0627\u0632 \u062e\u0637\u0627\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0631\u062e \u062f\u0647\u062f \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u062f.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Webhooks \u0631\u0627\u0647\u06cc \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u062e\u0627\u0631\u062c\u06cc \u0627\u0633\u062a \u062a\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u0645\u0648\u0631\u062f \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u0633\u0631\u0648\u06cc\u0633 \u0631\u062e \u0645\u06cc \u062f\u0647\u062f \u0645\u0637\u0644\u0639 \u06a9\u0646\u062f. \u0628\u0647 \u0639\u0628\u0627\u0631\u062a \u062f\u06cc\u06af\u0631\u060c \u0627\u06cc\u0646 \u0631\u0648\u0634\u06cc \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0628\u0631\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0627\u0639\u0644\u0627\u0646 \u0647\u0627\u06cc \u0628\u0644\u0627\u062f\u0631\u0646\u06af \u0627\u0632 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062e\u0627\u0631\u062c \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0627\u062a\u0641\u0627\u0642 \u0645\u06cc \u0627\u0641\u062a\u062f. \u062f\u0631 \u0632\u0645\u06cc\u0646\u0647 Ruby on Rails\u060c \u0648\u0628 \u0647\u0648\u06a9 \u0647\u0627 \u0645\u0639\u0645\u0648\u0644\u0627\u064b &hellip;<\/p>\n","protected":false},"author":2,"featured_media":12852,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-12851","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/12851","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=12851"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/12851\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/12852"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=12851"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=12851"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=12851"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}