Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

Stripe Checkout के साथ Rails में सहज वन-टाइम खरीद एकीकरण

लाखों कंपनियों द्वारा उपयोग किया जाने वाला, Stripe सब्सक्रिप्शन और वन-टाइम खरीद को संभालने के लिए एप्लिकेशन को भुगतान अवसंरचना प्रदान करता है। Stripe Checkout हमें एक होस्टेड भुगतान पृष्ठ के माध्यम से कार्ड भुगतान आसानी से स्वीकार करने की अनुमति देता है, जिसे रूपांतरण बढ़ाने के लिए तैयार किया गया है। इसे वेबहुक के साथ जोड़कर डेवलपर्स उत्पादों और सब्सक्रिप्शन को बेच सकते हैं और फिर उन्हें डिजिटली वितरित कर सकते हैं।

हालांकि तकनीकी रूप से किसी मौजूदा प्रदाता का उपयोग करके भुगतान को स्वयं संभालना संभव है, Stripe कई लाभ प्रदान करता है। शुरुआत के लिए, यह तेज़ है। Stripe के पास भुगतान को यथासंभव सरल, सुरक्षित और सुविधाजनक बनाने पर काम करने वाले 4,000 से अधिक लोग हैं।

इसके अलावा, अपने भुगतान को 'Stripe द्वारा संचालित' कहना ग्राहक विश्वास बनाने और रूपांतरण बढ़ाने का एक आसान तरीका है। ग्राहक आमतौर पर हर वेबसाइट पर अपनी कार्ड या बैंक जानकारी देने में संकोच करते हैं, और सही भी है।

Stripe ऑनलाइन भुगतान क्षेत्र में एकमात्र प्रदाता नहीं है। Paddle ऑनलाइन भुगतान क्षेत्र में एक और बड़ा खिलाड़ी है। Paddle Stripe के समान कई सुविधाएँ प्रदान करता है, लेकिन थोड़े अधिक शुल्क और कथित तौर पर खराब डेवलपर अनुभव के लिए। जबकि कई अन्य प्रतियोगी Stripe के विकल्प हैं, ऑनलाइन भुगतान के लिए उनके उत्पादों की भारी लोकप्रियता उन्हें एक आसान विकल्प बनाती है।

SaaS कंपनियों के लिए आवर्ती सब्सक्रिप्शन को संभालना आम है, लेकिन कई उत्पाद डिजिटल उत्पादों की वन-टाइम बिक्री से लाभान्वित होंगे। यह Stripe के अवसंरचना के साथ समान रूप से आसान है, लेकिन उनका दस्तावेज़ीकरण इस विषय से दूर भागता प्रतीत होता है।

सेटअप

प्रक्रिया को समझाने के लिए, हम एक एप्लिकेशन बनाएंगे जो उपयोगकर्ताओं को क्रेगलिस्ट-स्टाइल बोर्ड पर विज्ञापन पोस्ट करने के लिए भुगतान करने की अनुमति देता है। हमारे विशिष्ट उदाहरण के लिए, हमारा एप्लिकेशन रूममेट्स की तलाश करने वाले लोगों के लिए एक वेबसाइट होगी। उपयोगकर्ता बोर्ड को मुफ्त में ब्राउज़ कर सकते हैं लेकिन अपना विज्ञापन पोस्ट करने के लिए शुल्क का भुगतान करना होगा।

Stripe खाता बनाएं

शुरू करने के लिए, आपको Stripe की वेबसाइट पर जाकर एक खाता बनाना होगा। अपनी जानकारी या यदि लागू हो तो अपने व्यवसाय की जानकारी के साथ साइन अप करें।

Stripe Checkout के साथ Rails में सहज वन-टाइम खरीद एकीकरण Stripe साइन-अप पेज का स्क्रीनशॉट

यह लेख खाता बनाने के सटीक विवरण के माध्यम से आपका मार्गदर्शन नहीं करेगा, लेकिन उनका दस्तावेज़ीकरण आपके किसी भी प्रश्न का उत्तर देगा। हम विशेष रूप से उनके भुगतान और भुगतान उत्पाद में रुचि रखते हैं या, अधिक विशेष रूप से, Stripe Checkout।

बेसिक Rails ऐप बनाएं

एक बार आपका Stripe खाता सेट हो जाने के बाद, एक बेसिक Rails ऐप बनाने का समय आ गया है जिसका हम एकीकरण के लिए उपयोग करेंगे। यदि आप किसी मौजूदा ऐप को एकीकृत कर रहे हैं या केवल ट्यूटोरियल के Stripe भाग में रुचि रखते हैं, तो "बेसिक Stripe एकीकरण" पर आगे बढ़ें।

मैं इस उदाहरण के लिए निम्न वर्जन का उपयोग करूँगा:

  • Rails 6.1
  • Ruby 3.0.0

यह मानते हुए कि आपके पास Ruby और Rails दोनों पहले से इंस्टॉल हैं, आगे बढ़ें और निम्न चलाएँ:

rails new roommate-board

मैंने ऐप के लिए roommate-board नाम चुना है, लेकिन आप दूसरा चुनने के लिए स्वतंत्र हैं। बस उदाहरण कोड में कहीं और उल्लिखित नाम को स्वैप करें।

बनाई गई डायरेक्टरी में निम्न के साथ बदलें:

cd roommate-board

फिर, निम्न के साथ ऐप चलाएँ:

rails s

यदि आप localhost:3000 पर जाकर सामान्य Rails वेलकम पेज देखते हैं, तो बधाई, हम कोडिंग के लिए तैयार हैं!

सबसे पहले, हम उपयोगकर्ता प्रमाणीकरण को संभालने के लिए Devise जोड़ेंगे। बस gem 'devise' को अपने Gemfile में जोड़ें और फिर निम्न चलाएँ:

bundle install

अगला, चीजों को सेट अप करने के लिए Devise जनरेटर का उपयोग करें:

rails generate devise:install

अगला, Devise को User मॉडल से जोड़ें:

rails generate devise User

और अंत में, माइग्रेशन को निम्न के साथ चलाएँ:

rails db:migrate

रूममेट बोर्ड बनाएं

यदि आप इसे पढ़ रहे हैं, तो आप शायद फ्रंट-एंड डिज़ाइन की तुलना में Stripe एकीकरण में अधिक रुचि रखते हैं, इसलिए हम अपने उदाहरण को स्टाइल करने की चिंता नहीं करेंगे।

हमारा अगला कदम पोस्टिंग के लिए मॉडल बनाना है! हम मॉडल, माइग्रेशन, कंट्रोलर, और रूट्स बनाने के लिए Rails के आसान जनरेटर्स का उपयोग करेंगे। बस निम्न चलाएँ:

rails generate scaffold Post address:string rent:integer content:text

इस मॉडल में वह सब कुछ नहीं है जिसकी हमें Stripe एकीकृत करने के लिए आवश्यकता होगी। हम बाद में इसे जोड़ देंगे यदि आप किसी ऐसे प्रोजेक्ट के लिए इस ट्यूटोरियल को संदर्भित कर रहे हैं जिसे आप खरोंच से शुरू करने का सौभाग्य नहीं रखते। निम्न के साथ माइग्रेशन चलाकर डेटाबेस टेबल बनाएँ:

rails db:migrate

अगला, हम पोस्ट के लिए इंडेक्स व्यू को हमारे एप्लिकेशन का रूट बनाएंगे सुविधा के लिए। config/routes.rb में, निम्न लाइन जोड़ें:

root 'posts#index'

यह अभी काफी खाली है, और साइन इन, साइन आउट, या साइन अप करने का कोई स्पष्ट तरीका नहीं है। कार्यक्षमता पहले से ही है, तो आइए हेडर में कुछ लिंक्स जोड़कर इसे उपयोगकर्ता के लिए स्पष्ट करें। app/views/layouts/application.html.erb में, हम आवश्यक लिंक्स जोड़ेंगे। परिवर्तन करने के बाद मेरी फाइल इस तरह दिखती है:




  RoommateBoard
  
  <%= csrf_meta_tags %>
  <%= csp_meta_tag %>
  <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
  <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>


  
<%= yield %>

यह होमपेज का लिंक देता है, और जब उपयोगकर्ता "New Post" पर क्लिक करते हैं, तो उन्हें साइन-अप पेज पर ले जाया जाएगा। यदि वे साइन इन हैं, तो यह "Manage Posts" बटन और "Sign Out" बटन में बदल जाता है। बिना किसी स्टाइलिंग और बिना साइन इन किए, रूट पेज अब ऐसा दिखता है:

Stripe Checkout के साथ Rails में सहज वन-टाइम खरीद एकीकरण बेसिक पोस्ट इंडेक्स पेज का स्क्रीनशॉट

अगला, हम प्रत्येक पोस्टिंग को एक अद्वितीय उपयोगकर्ता के दायरे में रखना चाहते हैं। अनिवार्य रूप से, हम एक Posting और User के बीच belongs_to एसोसिएशन बनाएंगे, साथ ही कुछ प्रासंगिक तर्क। हम Rails के आसान माइग्रेशन जनरेटर से शुरू करेंगे; बस निम्न चलाएँ:

rails g migration AddUserIdToPosts

अब db/migrate/ में माइग्रेशन फाइल को इस तरह संपादित करें:

class AddUserIdToPosts < ActiveRecord::Migration[6.1]
  def change
    add_column :posts, :user_id, :integer
  end
end

अंत में, निम्न के साथ माइग्रेशन चलाएँ:

rails db migrate

अगला, हम मॉडल्स में एसोसिएशन जोड़ेंगे। app/models/post.rb में, निम्न लाइन जोड़ें:

belongs_to :user

और app/models/user.rb में, निम्न जोड़ें:

has_many :posts

यह द्विदिश एसोसिएशन हमें कुछ आसान Rails मेथड्स देता है, जैसे जिनका हम create और new मेथड्स में उपयोग करने वाले हैं। app/controllers/posts_controller.rb (पोस्ट कंट्रोलर) पर नेविगेट करें और new मेथड को देखें। @post = Post.new के बजाय, @post = current_user.posts.build का उपयोग करें।

create मेथड में, हम कुछ ऐसा ही करेंगे। @post = Post.new(post_params) को @post = current_user.posts.build(post_params) से बदलें। साथ में, new और create मेथड्स को ऐसा दिखना चाहिए:

# GET /posts/new
def new
  @post = current_user.posts.build
end

# POST /posts or /posts.json
def create
  @post = current_user.posts.build(post_params)
  respond_to do |format|
    if @post.save
      format.html { redirect_to @post, notice: "Post was successfully created." }
      format.json { render :show, status: :created, location: @post }
    else
      format.html { render :new, status: :unprocessable_entity }
      format.json { render json: @post.errors, status: :unprocessable_entity }
    end
  end
end

यह सुनिश्चित करता है कि उपयोगकर्ता का id एट्रिब्यूट हर पोस्ट में स्टोर है, लेकिन यह किसी अन्य उपयोगकर्ता को उनके पोस्ट को संपादित या हटाने से नहीं रोकता! उसी PostsController में, आइए एक मेथड लिखें जो हमें इस बात का बूलियन संकेतक देता है कि कोई उपयोगकर्ता पोस्टिंग का मालिक है या नहीं। इसे कंट्रोलर के नीचे जोड़ें:

def user_owns_post?
  @post.user == current_user
end

edit मेथड में, निम्न जोड़ें (यह वहाँ एकमात्र कोड होगा):

unless user_owns_post?
  # उन्हें एक एरर पेज पर रीडायरेक्ट करें
  redirect_to posts_path, flash: { error: "You are not the owner of that post!" }
end

destroy मेथड में, इसे शुरुआत में जोड़ें:

unless user_owns_post?
  # उन्हें एक एरर पेज पर रीडायरेक्ट करें
  redirect_to posts_path, flash: { error: "You are not the owner of that post!" }
end

अगला, हमें उपयोगकर्ता के लिए अपने मौजूदा पोस्ट प्रबंधित करने की कुछ कार्यक्षमता की आवश्यकता होगी। अंतिम लक्ष्य यह है कि एक उपयोगकर्ता एक पोस्ट बना सके और भुगतान करने से पहले यह ड्राफ्ट स्थिति में हो। एक बार भुगतान करने के बाद, यह उनके लिए सक्रिय पर सेट हो जाता है! PostsController में, एक नया मेथड जोड़ें:

def manage
  @posts = current_user.posts
end

अगला, एक रूट जोड़ें ताकि उपयोगकर्ता वहाँ पहुँच सके! config/routes.rb में, निम्न जोड़ें:

get "/manage_posts/" => 'posts#manage'

अंत में, हम पोस्ट प्रबंधन के लिए व्यू बनाएंगे! एक नई फाइल जोड़ें, app/views/posts/manage.html.erb। फिर, app/views/posts/index.html.erb की पूरी सामग्री इसमें कॉपी करें। बस हेडर को "Posts" से "Manage Posts" में बदलें। यह अनिवार्य रूप से एक इंडेक्स पेज है, लेकिन हमारे कंट्रोलर तर्क के कारण केवल एक व्यक्तिगत उपयोगकर्ता के पोस्ट इंडेक्स हो रहे हैं। तकनीकी रूप से, हम इसे व्यक्तिगत इंडेक्स पेज पर कर सकते थे, लेकिन यह अलगाव बाद में अन्य कार्यक्षमताओं को जोड़ना आसान बनाता है। उदाहरण के लिए, हम अब इस प्रबंधन पेज पर नया पोस्ट बनाने के लिए एक लिंक जोड़ेंगे।

हेडर के नीचे, बस निम्न जोड़ें:

<%= link_to "New Post", new_post_url%>

यह वह सभी सेटअप है जिसकी हमें आवश्यकता थी! यह सुनिश्चित करने के लिए इसके माध्यम से जाना एक अच्छा विचार है कि सब कुछ ठीक से काम कर रहा है। अब आप निम्न करने में सक्षम होना चाहिए:

  • एक उपयोगकर्ता खाता बनाएं
  • साइन इन करें
  • साइन आउट करें
  • मौजूदा पोस्टिंग का इंडेक्स देखें
  • एक नई पोस्टिंग बनाएं

यदि यह सब आपकी अपेक्षा के अनुरूप काम कर रहा है, तो Stripe एकीकरण पर आगे बढ़ने का समय है!

Stripe एकीकरण

Stripe Ruby जेम जोड़ना

शुरू करने के लिए, हम बस Stripe Ruby जेम जोड़ेंगे। अपने Gemfile में, निम्न लाइन जोड़ें:

gem 'stripe'

इसके बाद चलाएँ:

bundle install

अगले भाग के लिए, आपको अपनी Stripe API कुंजी की आवश्यकता होगी। Stripe कंसोल पर, साइडबार पर "Developers" पर क्लिक करें। "API Keys" का एक विकल्प सामने आएगा, तो आगे बढ़ें और उस पर क्लिक करें। अपने "Secret Key" पर ध्यान दें, क्योंकि हमें इसकी शीघ्र ही आवश्यकता होगी।

लेकिन पहले, config/initializers में एक इनिशियलाइज़र बनाएँ। stripe.rb नामक एक बनाएँ। इस फाइल में, एक सिंगल लाइन जोड़ें जो इस तरह दिखे (लेकिन आपके सीक्रेट कुंजी के साथ):

Stripe.api_key = 

Stripe क्रेडेंशियल स्टोर करना

हालांकि, हमारे क्रेडेंशियल को स्टोर करने का यह तरीका असुरक्षित है। हमें प्रोडक्शन सीक्रेट्स को प्लेनटेक्स्ट में स्टोर नहीं करना चाहिए, जहां वे git द्वारा ट्रैक किए जाते हैं और कोडबेस पढ़ने वाले किसी भी व्यक्ति के लिए सुलभ होते हैं। सौभाग्य से, Rails क्रेडेंशियल्स को सुरक्षित रूप से स्टोर करने का एक तरीका प्रदान करता है।

अपने शेल में, क्रेडेंशियल फाइल को vim में अनएन्क्रिप्ट और खोलने के लिए EDITOR=vim bin/rails credentials:edit चलाएँ। अपने कीबोर्ड पर 'i' कुंजी दबाकर इन्सर्ट मोड पर स्विच करें। एक नया सेक्शन जोड़ें जो ऐसा दिखे:

stripe:
  secret: your-secret-key
  public: your-public-key

अगला, फाइल को सेव करें और vim से बाहर निकलें। ऐसा करने के कुछ तरीके हैं, लेकिन मेरा पसंदीदा एस्केप कुंजी दबाकर (इन्सर्ट मोड छोड़ने के लिए) और फिर :wq टाइप करके, उसके बाद एंटर कुंजी दबाकर है। यदि आप जानना चाहते हैं कि Rails एन्क्रिप्टेड क्रेडेंशियल्स को कैसे संभालता है, तो यह एक अच्छा संसाधन है।

अब जब क्रेडेंशियल सुरक्षित रूप से स्टोर हैं, असुरक्षित इनिशियलाइज़र कोड को इसके साथ बदलें:

Stripe.api_key = Rails.application.credentials[:stripe][:secret]

उत्पाद से Stripe Checkout से लिंक करना

हम भुगतान के लिए Stripe का लाभ उठाने के कुछ अलग तरीके हैं, लेकिन एक बढ़िया विकल्प Stripe Checkout है। Stripe Checkout एक होस्टेड भुगतान पृष्ठ है, जिसका अर्थ है कि आप वास्तविक लेनदेन के लिए यूजर इंटरफेस का कोई भी निर्माण नहीं करते हैं। एक उपयोगकर्ता एक बटन पर क्लिक करेगा, Stripe पर रीडायरेक्ट होगा, और भुगतान होने के बाद आपके एप्लिकेशन पर वापस रीडायरेक्ट होगा। यह संदर्भ प्रबंधन को थोड़ा चुनौतीपूर्ण बनाता है, लेकिन भुगतान फॉर्म बनाने का बोझ हटा देता है और Stripe को रूपांतरण को अधिकतम करने के लिए बहुत काम करने देता है। आप कार्ड से परे भुगतान प्रकारों को आसानी से स्वीकार कर सकते हैं, जिसमें ACH लेनदेन या कई अंतरराष्ट्रीय भुगतान विधियाँ शामिल हैं।

शुरू करने के लिए, चेकआउट प्रक्रिया को संभालने के लिए एक कंट्रोलर बनाएं। app/controllers/checkout_controller.rb बनाएँ। इसमें, हम चेकआउट सत्र बनाने को संभालने के लिए एक मेथड लिखेंगे।

def create
  @session = Stripe::Checkout::Session.create({
    success_url: root_url,
    cancel_url: manage_posts_url,
    payment_method_types: ['card'],
    line_items: [{
      name: "Roommate Posting",
      amount: 2000,
      currency: "usd",
      quantity: 1
    }],
    mode: 'payment',
    metadata: {post_id: params[:post_id]},
    customer_email: current_user.email,
    success_url: manage_posts_url,
    cancel_url: manage_posts_url
  })
  respond_to do |format|
    format.js
  end
end

यह आवश्यक संदर्भ के साथ एक चेकआउट सत्र बनाता है ताकि Stripe अपना जादू कर सके। हम एक सिंगल लाइन आइटम पास करते हैं, जिसे हमने यहाँ हार्डकोड किया है क्योंकि हमारे एप्लिकेशन में केवल एक उत्पाद है। लेकिन यह किसी विशेष उत्पाद के लिए चेकआउट को अनुकूलित करने के लिए एक पास पैरामीटर का उपयोग करने के लिए एक आसान जगह होगी। "Amount" वेरिएबल उत्पाद की लागत सेंट में है। यह उल्लेखनीय है कि हम वर्तमान उपयोगकर्ता के ईमेल को सरलता के लिए पास करते हैं। अंतिम महत्वपूर्ण बात यह है कि हम पोस्ट की id को मेटाडेटा के रूप में पास करते हैं। इससे हमारे लिए वेबहुक अनुभाग में अपने उपयोगकर्ता की खरीदारी को पूरा करना आसान हो जाएगा!

अगला, हमें स्पष्ट रूप से मेथड को कॉल करने का एक तरीका चाहिए।

config/routes.rb में, कंट्रोलर के लिए एक रूट बनाने के लिए निम्न लाइन जोड़ें।

post 'checkout/create' => 'checkout#create', as: "checkout_create"

अगला, हम भुगतान जमा करने के लिए एक बटन जोड़ेंगे मैनेज पोस्ट व्यू में किसी भी पोस्ट के लिए। app/views/manage.html.erb में, इसे अंतिम के रूप में जोड़कर हेडर में एक अतिरिक्त कॉलम जोड़ें:

Payment

साथ ही, को पर स्विच करें।

अगला, भुगतान बटन के लिए टेबल बॉडी में एक और आइटम जोड़ें। बॉडी में चौथे आइटम के रूप में, निम्न जोड़ें:

<%= button_to "Submit Payment", checkout_create_path, params: {:post_id => post.id }, remote: true %>

कुल मिलाकर, मैनेज पोस्ट व्यू अब ऐसा दिखता है:

<%= notice %>

Manage Posts

<%= link_to "New Post", new_post_url%> <% @posts.each do |post| %> <% end %>
Address Rent Content Payment
<%= post.address %> <%= post.rent %> <%= post.content %> <%= button_to "Submit Payment", checkout_create_path, params: {:post_id => post.id }, remote: true %> <%= link_to 'Show', post %> <%= link_to 'Edit', edit_post_path(post) %> <%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %>

<%= link_to 'New Post', new_post_path %>

JavaScript

app/views/application.html.erb में इस लाइन के साथ Stripe JavaScript पैकेज शामिल करना न भूलें:

अगला, आपको app/views/checkout/create.js.erb में एक नई फाइल (और डायरेक्टरी!) जोड़ने की आवश्यकता होगी। इस फाइल में, बस कंट्रोलर की मदद से बटन पर क्लिक करने पर चेकआउट सत्र बनाने की अनुमति देने के लिए निम्न जोड़ें।

var stripe = Stripe("<%= Rails.application.credentials[:stripe][:public] %>")
stripe.redirectToCheckout({
  sessionId: '<%= @session.id %>'
}).then(function (result) {
  console.log(result.error_message)
});

वेबहुक सेट अप करना

अब, हमारे पास उपयोगकर्ताओं के लिए पोस्ट के लिए भुगतान करने का एक तरीका है! हालांकि, हमारे पास एप्लिकेशन के लिए यह जानने का कोई तरीका नहीं है कि कोई पोस्ट भुगतान किया गया है या नहीं और जब यह होता है तो इसे सक्रिय करें। शुरू करने के लिए, पोस्ट मॉडल में एक बूलियन जोड़ें ताकि यह इंगित किया जा सके कि कोई पोस्ट भुगतान किया गया है या नहीं। Rails माइग्रेशन जनरेटर का उपयोग करने के लिए, निम्न चलाएँ:

rails g migration AddPaymentDetailsToPost

इस माइग्रेशन को खोलें और इसमें निम्न लाइन जोड़ें:

add_column :posts, :is_paid, :boolean, :default => false

यह पोस्ट टेबल/मॉडल में is_paid नामक एक एट्रिब्यूट/कॉलम जोड़ता है। यह एट्रिब्यूट एक बूलियन है जो डिफ़ॉल्ट रूप से false है, जिसका अर्थ है कि जब भी कोई पोस्ट बनाई जाती है, तो इसे भुगतान नहीं किया गया के रूप में चिह्नित किया जाता है। जब कोई पोस्ट भुगतान की जाती है, तो हम मैन्युअली बूलियन को फ्लिप करेंगे। लेकिन पहले, आपके द्वारा लिखी गई माइग्रेशन को इसके साथ चलाएँ:

rails db:migrate

क्योंकि भुगतान तुरंत प्रोसेस नहीं होते, हम Stripe से एक सफल API प्रतिक्रिया पर भरोसा नहीं कर सकते कि कोई काम भुगतान किया गया है। इसके बजाय, हम अपने एप्लिकेशन पर एक एंडपॉइंट इंगित कर सकते हैं जिसके लिए Stripe भुगतान समाप्त होने पर पोस्ट रिक्वेस्ट करेगा। इस प्रक्रिया को आमतौर पर वेबहुक कहा जाता है और यह वास्तव में जितना लगता है उससे सरल है!

शुरू करने के लिए, app/controllers/ में WebhooksController नामक एक नया कंट्रोलर बनाएँ। इस app/controllers/webhooks_controller.rb में, निम्न लिखें:

class WebhooksController < ApplicationController
  skip_before_action :verify_authenticity_token
  def create
    payload = request.body.read
    sig_header = request.env['HTTP_STRIPE_SIGNATURE']
    event = nil
    begin
      event = Stripe::Webhook.construct_event(
        payload,
        sig_header,
        Rails.application.credentials[:stripe][:webhook]
      )
    rescue JSON::ParserError => e
      status 400
      return
    rescue Stripe::SignatureVerificationError => e
      # अमान्य हस्ताक्षर
      puts "Signature error"
      p e
      return
    end
    # इवेंट को संभालें
    case event.type
    when 'checkout.session.completed'
      session = event.data.object
      post = Post.find_by(id: session.metadata.post_id)
      post.is_paid = true
      post.save!
    end
    render json: { message: 'success' }
  end
end

आवश्यक बॉयलरप्लेट के अलावा, यह मेथड एक विशिष्ट इवेंट प्रकार को संभालेगा, जिसे checkout.session.completed कहा जाता है। Rails की तरफ जो कुछ बचा है वह है config/routes.rb में रूट जोड़ना:

resources :webhooks, only: [:create]

अंत में, आपको अपने Stripe खाते को इस एंडपॉइंट से Stripe डैशबोर्ड में ही जोड़ना होगा। क्योंकि आप Stripe डैशबोर्ड को एक URL प्रदान करेंगे, यह स्थानीय रूप से काम नहीं करेगा! वेबहुक को ठीक से काम करने के लिए आपको इसे इंटरनेट-एक्सेसिबल एंडपॉइंट पर तैनात करना होगा।

"Developers" पर Stripe डैशबोर्ड पर वापस जाएँ, लेकिन इस बार, बाएं पैनल पर "Webhooks" चुनें। "Endpoints" सेक्शन में, "Add Endpoint" पर क्लिक करें। अपने एप्लिकेशन का URL /webhooks के साथ जोड़कर प्रदान करें और इसे इवेंट "checkout.session.completed" असाइन करें।

और यह Stripe एकीकरण के लिए है! हमारे मॉक एप्लिकेशन के लिए अंतिम व्यावहारिक कदम इंडेक्स पेज को केवल उन पोस्ट्स को प्रदर्शित करना है जिनका भुगतान किया गया है। यह app/controllers/posts_controller.rb के इंडेक्स मेथड में आसानी से किया जा सकता है। मेथड को इस में बदलें:

def index
  @posts = Post.where(:is_paid => true)
end

अब, उपयोगकर्ता एक पोस्ट बना सकते हैं, Stripe checkout के साथ इसके लिए भुगतान कर सकते हैं, और इसे एप्लिकेशन के होमपेज पर स्वचालित रूप से प्रदर्शित किया जा सकता है!

प्रोडक्शन पर स्विच करना

क्योंकि आपके वेबहुक केवल लाइव साइट पर तैनात होने पर काम करते हैं, तैनाती के लिए आवश्यक परिवर्तनों पर चर्चा करना सार्थक है। शुरुआत के लिए, आपका संचार Stripe checkout के काम करने के लिए अवश्य HTTPS होना चाहिए। यदि आप किसी समस्या का सामना कर रहे हैं, तो Stripe से कुछ संकेतों के लिए JavaScript कंसोल की जांच करें।

इस बात की अच्छी संभावना है कि आपके प्रारंभिक सेटअप में, आपने Stripe के टेस्ट कुंजियों का उपयोग किया था। यदि आपने किया, तो Stripe डैशबोर्ड के API Keys सेक्शन में ऐसा कुछ दिखेगा।

Stripe Checkout के साथ Rails में सहज वन-टाइम खरीद एकीकरण Stripe डैशबोर्ड API Keys का स्क्रीनशॉट

"viewing test data" के बगल में टॉगल पर क्लिक करके अपने प्रोडक्शन सीक्रेट और पब्लिक कुंजियों को प्रकट करें। आपको उसी तरह Rails क्रेडेंशियल मैनेजर खोलना होगा और टेस्ट कुंजियों को इसके साथ बदलना होगा ताकि आपका एप्लिकेशन लाइव डेटा प्रोसेस कर सके। टेस्ट वातावरण नकली क्रेडिट कार्ड नंबरों के साथ टेस्ट लेनदेन चलाने के लिए सहायक है। यदि आपके पास एक से अधिक वातावरण हैं या आप इसे अक्सर स्विच करने की योजना बना रहे हैं, तो क्रेडेंशियल मैनेजर में एक और कुंजी/मान जोड़ी बनाना और इसे अपने कोड में डायनामिक रूप से उपयोग करना सार्थक है।

निष्कर्ष

हमने अपना उदाहरण एप्लिकेशन बनाने में बहुत समय बिताया और Stripe को एकीकृत करने में ज्यादा नहीं। Stripe checkout के लिए धन्यवाद, हम यूजर इंटरफेस सहित बहुत सारी जिम्मेदारी सौंप देते हैं, जिससे हमें बहुत सारा कोड बच जाता है। यह उपयोगकर्ताओं के लिए एक सुसंगत अनुभव बनाता है, ऑनलाइन मार्केटप्लेस में Stripe के व्यापक अपनाने को देखते हुए। Stripe का मिशन इंटरनेट के GDP को बढ़ाना है, और उन्हें ऐसा करने के लिए आपके जैसे एप्लिकेशन की आवश्यकता है। इस वजह से, वे आपके लिए भुगतान प्रोसेस करने के लिए और भी आसान तरीके खोज रहे हैं। जबकि Stripe Checkout लागू करना काफी आसान है, उन्होंने हाल ही में एक और भी तेज़ तरीका सोचा है।

Stripe Payment Links, Stripe का एक बिल्कुल नया उत्पाद है, जिसमें हमारे Checkout एकीकरण को लगभग अनावश्यक बनाने की क्षमता है। हमने वास्तव में उपयोगकर्ता को एक होस्टेड चेकआउट पेज पर रीडायरेक्ट किया, और एक सरल लिंक में इसे और भी आसान बनाने की क्षमता है। भुगतान लिंक एक नो-कोड समाधान है जो खुदरा विक्रेताओं पर निर्देशित प्रतीत होता है लेकिन संभावित रूप से इस उपयोग के मामले के लिए काम कर सकता है। भले ही, Stripe Checkout अभी भी बाजार में थोड़ा अधिक लचीलापन और अपनाने का दावा करता है, इसलिए इसे पूरी तरह से समझना महत्वपूर्ण है।

एक चीज जिससे कई व्यवसाय संघर्ष करते हैं वह है करों को संभालना, विशेष रूप से अंतरराष्ट्रीय स्तर पर। Stripe ने हाल ही में व्यवसायों के लिए इसे स्वचालित रूप से संभालने के लिए एक नई सुविधा पेश की, लेकिन यह अभी भी बीटा में है। एक बार उपलब्ध होने पर, यह Stripe का उपयोग करने वाले किसी भी व्यक्ति के लेखांकन बोझ को काफी कम कर देगा!

Ruby on Rails पर निर्देशित Stripe के दस्तावेज़ीकरण और मौजूदा लेख सब्सक्रिप्शन की ओर झुकते हैं न कि वन-टाइम खरीद की ओर। सब्सक्रिप्शन एक उपयोगकर्ता और एक उत्पाद से जुड़े आवर्ती शुल्क हैं। Stripe के अंत पर, कार्यान्वयन वन-टाइम खरीद की तरह दिखता है। एप्लिकेशन की तरफ, हालांकि, हमें सब्सक्रिप्शन प्रबंधन को एकीकृत करना होगा, उपयोगकर्ता को अपनी सब्सक्रिप्शन प्रबंधित करने की अनुमति देनी होगी, और समय-समय पर सब्सक्रिप्शन स्थिति की जांच करनी होगी। इस लेख ने वन-टाइम खरीद पर ध्यान केंद्रित किया, लेकिन समुदाय में बहुत सारे संसाधन हैं यदि आपको सब्सक्रिप्शन प्रबंधित करने की आवश्यकता है।

  1. शक्तिशाली रूबी CLI टूल्स बनाएं: चरण-दर-चरण गाइड शक्तिशाली रूबी CLI टूल्स बनाएं: चरण-दर-चरण गाइड

    बहुत से लोग भूल जाते हैं कि रूबी वेब एप्लिकेशन के अलावा भी चीजें कर सकता है। इस लेख में, मैं आपको दिखाना चाहता हूं कि इस कमी को दूर करने के लिए कमांड-लाइन एप्लिकेशन कैसे बनाया जाए! यहाँ कुछ कमांड-लाइन एप्लिकेशन हैं जिनसे आप परिचित हो सकते हैं: psql rails bundler gem git कमांड-लाइन एप्लिकेशन बनाने

  1. रूबी पार्सिंग में मास्टर करें: स्क्रैच से अपना खुद का पार्सर बनाएं रूबी पार्सिंग में मास्टर करें: स्क्रैच से अपना खुद का पार्सर बनाएं

    पार्सिंग स्ट्रिंग्स के एक समूह को समझने और उन्हें किसी ऐसी चीज़ में बदलने की कला है जिसे हम समझ सकें। आप रेगुलर एक्सप्रेशन्स का उपयोग कर सकते हैं, लेकिन वे हमेशा इस काम के लिए उपयुक्त नहीं होते। उदाहरण के लिए, यह सामान्य ज्ञान है कि HTML को रेगुलर एक्सप्रेशन्स से पार्स करना शायद एक अच्छा विचार नहीं

  1. OmniAuth-Twitter के साथ Rails में ट्विटर लॉगिन एकीकृत करें: चरण-दर-चरण मार्गदर्शिका OmniAuth-Twitter के साथ Rails में ट्विटर लॉगिन एकीकृत करें: चरण-दर-चरण मार्गदर्शिका

    इस ट्यूटोरियल में, आप सीखेंगे कि अपने एप्लिकेशन के उपयोगकर्ताओं को उनके ट्विटर खाते का उपयोग करके लॉग इन करने की अनुमति कैसे दें। OAuth जैसे टूल के साथ ऐसा करना आसान हो गया है। आप OmniAuth-Twitter का उपयोग करेंगे, जिसमें OmniAuth के लिए ट्विटर रणनीति शामिल है। चलिए शुरू करते हैं! शुरुआत करना अपना R