برنامه نویسی

نصب Stripe Connect با Ruby on Rails

Stripe Connect مجموعه ای از ابزارها و API ها را ارائه می دهد که به شما امکان می دهد پلتفرم یا بازار خود را ایجاد، مدیریت و مقیاس دهید و پرداخت ها و پرداخت ها را برای کاربران خود تسهیل کنید. اگر با Stripe Connect تازه کار هستید، به چند مقاله اول این مجموعه نگاهی بیندازید. در این مقاله یاد خواهید گرفت که چگونه Stripe Connect Onboarding را با Ruby on Rails ادغام کنید تا بتوانید حرکت پول را برای کاربران خود تسهیل کنید.

ما بر روی یک مورد استفاده از پلت فرم خبرنامه ایمیل تمرکز خواهیم کرد، جایی که خوانندگان با پرداخت هزینه ماهانه برای دریافت ایمیل های دوره ای از نویسندگان مورد علاقه خود حمایت می کنند. نحوه ایجاد حساب‌های Stripe و جمع‌آوری جزئیات کسب‌وکار با استفاده از Stripe Connect میزبانی شده را یاد خواهید گرفت. ما همچنین راه‌اندازی محیط Rails و برخی از بهترین روش‌ها را برای یکپارچه‌سازی روان پوشش خواهیم داد.

بیا شروع کنیم!

ما کارها را با ایجاد یک برنامه جدید Rails آغاز خواهیم کرد که از Tailwind CSS برای سبک ها و Postgres برای پایگاه داده استفاده می کند. -T به این معنی است که از افزودن زیرساخت آزمایشی پیش فرض صرف نظر کنید و --main نام شاخه git را تنظیم می کند.

rails new newsletter-platform -c tailwind -j esbuild -d postgresql -T --main
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما هر شماره خبرنامه را در پایگاه داده ذخیره می کنیم تا نویسندگان بتوانند در صورت تمایل کاربران را به کاتالوگ پشتی خود هدایت کنند. قبل از ارسال شماره خبرنامه برای خواننده، بررسی می‌کنیم تا مطمئن شویم خوانندگان اشتراک پرداخت فعال دارند.

بیایید با راه اندازی این مدل های پایگاه داده شروع کنیم.

راه اندازی پایگاه داده

برای راه‌اندازی مدل‌های پایگاه داده لازم برای این پلتفرم خبرنامه، مدل‌های اصلی را ایجاد می‌کنیم: User، Newsletter، NewsletterIssue، و Subscription. مدل کاربر نشان دهنده نویسنده است، مدل خبرنامه مربوط به هر مجموعه ای از شماره ها است، مدل NewsletterIssue هر نسخه ماهانه خبرنامه را نشان می دهد، و مدل اشتراک خوانندگان را به خبرنامه هایی که برای آنها اشتراک پرداخت فعال دارند پیوند می دهد. بیایید با تولید این مدل ها شروع کنیم.

تولید مدل کاربر:

از مدل User برای احراز هویت استفاده می شود. هم خوانندگان و هم نویسندگان در پایگاه داده به عنوان کاربران نمایش داده می شوند.

ما ذخیره می کنیم stripe_customer_id برای خوانندگان ما از Stripe API برای ایجاد اشیاء مشتری برای همه کاربران استفاده می‌کنیم تا بتوانیم همه اشتراک‌ها و صورت‌حساب‌هایی را که به یک خواننده معین مرتبط هستند، پیگیری کنیم.

ما ذخیره می کنیم stripe_account_id برای نویسندگان این نشان‌دهنده شناسه حساب Stripe نویسنده است و ما را قادر می‌سازد تا پرداخت‌ها را از خوانندگان به نویسنده هدایت کنیم. ما نیز ذخیره می کنیم charges_enabled و payouts_enabled پرچم‌گذاری می‌کند تا بداند چه زمانی حساب به طور کامل نصب شده است و می‌تواند با موفقیت پول دریافت کند.

rails generate model User name:string email:string stripe_customer_id:string stripe_account_id:string charges_enabled:boolean payouts_enabled:boolean
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تولید مدل خبرنامه:

خبرنامه ها یک رابطه کلید خارجی با شناسه نویسنده در جدول کاربران دارند.

rails generate model Newsletter user:references title:string
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد مدل شماره خبرنامه:

مسائل خبرنامه مربوط به خبرنامه ای است که در مورد آن است و برای شروع، با عنوان و بلوک متن برای محتوا ساده می کنیم. را published_at datetime ما را قادر می سازد تا مسائل را برای انتشار در آینده برنامه ریزی کنیم.

rails generate model NewsletterIssue newsletter:references subject:string content:text published_at:datetime
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد مدل اشتراک:

هنگامی که یک خواننده برای اولین بار در یک خبرنامه مشترک می شود، ما او را از طریق یک جریان پرداخت با استفاده از Stripe Checkout ارسال می کنیم تا جزئیات پرداخت خود را جمع آوری کرده و یک اشتراک Stripe را شروع کنیم که پرداخت های مکرر را جمع آوری می کند. ما آن را ذخیره می کنیم stripe_subscription_id در پایگاه داده تا بتوانیم Stripe API را بررسی کنیم تا بدانیم آیا پرداخت فعال است یا خیر.

rails generate model Subscription user:references newsletter:references stripe_subscription_id:string status:string
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مهاجرت های پایگاه داده را اجرا کنید:

rails db:migrate
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالا بیایید روابط بین این مدل ها را تنظیم کنیم:

که در app/models/user.rb:

class User < ApplicationRecord
  has_many :newsletters
  has_many :subscriptions
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

که در app/models/newsletter.rb:

class Newsletter < ApplicationRecord
  belongs_to :user
  has_many :newsletter_issues
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

که در app/models/newsletter_issue.rb:

class NewsletterIssue < ApplicationRecord
  belongs_to :newsletter
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

که در app/models/subscription.rb:

class Subscription < ApplicationRecord
  belongs_to :user
  belongs_to :newsletter
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با وجود این مدل‌ها، اکنون می‌توانیم نویسندگان، خبرنامه‌ها و مسائل مربوط به آنها و اشتراک‌های خوانندگان را در پایگاه داده خود نشان دهیم. در مراحل بعدی، منطق Stripe Connect Onboarding را پیاده سازی می کنیم.

Stripe را راه اندازی کنید

از SDK stripe-ruby برای تعامل با Stripe API استفاده کنید.

bundle add stripe
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کلیدهای API را از dashboard.stripe.com بازیابی کنید و آنها را در اعتبارنامه Rails خود تنظیم کنید.

EDITOR=vi rails credentials:edit
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کلیدها را به این صورت وارد کنید:

stripe:
  secret_key: sk_test_51EceeUCZ6qs...
  publishable_key: pk_test_vAZ3gh1Lc...
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یک مقداردهی اولیه به آن اضافه کنید config/initializers/stripe.rb به منظور تنظیم کلید API سطح پلت فرم. توجه داشته باشید که اکانت Stripe هر نویسنده کلیدهای API مخصوص به خود را خواهد داشت، اما با Stripe Connect، ما هرگز به کلیدهای حساب متصل نیاز نداریم. در عوض، ما درخواست‌های حساب‌های متصل را با ترکیب کلید API سطح پلت فرم و شناسه حساب‌های متصل احراز هویت می‌کنیم. برای جزئیات بیشتر اینجا را ببینید.

Stripe.api_key = Rails.application.credentials.dig(:stripe, :secret_key)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون ما آماده هستیم تا تماس های API به Stripe را از Ruby آغاز کنیم. قبل از شروع استفاده از Stripe API، اجازه دهید احراز هویت را راه‌اندازی کنیم.

احراز هویت را تنظیم کنید

برای این مورد، کاربران به روشی برای احراز هویت در برنامه نیاز دارند. از آنجایی که ما از Ruby on Rails استفاده می کنیم، از احراز هویت برای نویسندگان استفاده خواهیم کرد.

ما deise gem را نصب می‌کنیم، اسکریپت‌های نصب را اجرا می‌کنیم و مسیرها و مهاجرت را برای Authors ایجاد می‌کنیم تا قابل احراز هویت پایگاه داده باشند.

bundle add devise
rails generate devise:install
rails g devise:views
rails g devise Author
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دوباره پایگاه داده را مهاجرت می کنیم.

rails db:migrate
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در حال دویدن bin/dev سرور را روشن می کند تا بتوانیم جریان ثبت نام خود را در localhost:3000/authors/sign_up آزمایش کنیم.

این نمای ورود بدون استایل به ما ارائه شده است که بعداً آن را پاک خواهیم کرد.

اکنون که کاربران می توانند برای برنامه ثبت نام کنند، می خواهیم آنها را به Stripe Connect وارد کنیم تا بتوانیم از طرف آنها با Stripe API تعامل داشته باشیم.

نصب اتصال را تنظیم کنید

Connect از 3 نوع حساب مختلف پشتیبانی می کند: استاندارد، اکسپرس و سفارشی. از آنجایی که نویسندگان ممکن است تجربه بازپرداخت و بازپرداخت وجه در این مورد استفاده را نداشته باشند، منطقی است که برای آنها یکپارچه سازی شود که در آن به داشبورد Stripe ساده تر با یک نوع اکسپرس حساب متصل در اینجا درباره مبادلات بین انواع حساب های مختلف بیشتر بیاموزید. نکته جانبی: ما امیدواریم که مفهوم نوع حساب را حذف کنیم، بنابراین منتظر رویکردی کمتر گیج کننده برای متمایز کردن عملکرد اتصال برای کاربران خود باشید.

برای ورود، صفحه‌ای خواهیم داشت که در آن یا جزئیات حساب مربوط به حساب متصل را نشان می‌دهیم، یا دکمه‌ای برای کاربر برای ایجاد یک حساب جدید و انجام فرآیند ورود. این توابع توسط یک StripeAccountsController جدید مدیریت خواهند شد.

rails g controller StripeAccounts show
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با به‌روزرسانی config/routes.rb، مسیرهای منبع منفرد را برای /stripe_account اضافه می‌کنیم.

Rails.application.routes.draw do
  resource :stripe_account
  devise_for :users
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در مرحله بعد، ماکرو قبل از عمل را از device اضافه می کنیم که برای دسترسی به این مسیرها به نویسنده احراز هویت شده نیاز دارد.

class StripeAccountsController < ApplicationController
  before_action :authenticate_author!
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نمای مسیر نمایش در حال حاضر بسیار ساده است.

<% if current_user.stripe_account_id.present? %>
  <%= current_user.stripe_account.to_json %>
<% else %>
  <p>No Stripe account found</p>
  <%= button_to "Create a Stripe Account", stripe_account_path, method: :post, data: { turbo: false } %>
<% end %>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگامی که کاربر روی “ایجاد یک حساب Stripe” کلیک می کند، ابتدا یک تماس API با Stripe برای ایجاد یک حساب Express جدید برقرار می کنیم، سپس پایگاه داده را با شناسه حساب به روز می کنیم و در نهایت از طریق جریان ورود به حساب با یک لینک حساب.

هدف در اینجا به حداقل رساندن مقدار اطلاعاتی است که نویسنده باید دوباره وارد کند. به عنوان مثال، ما از قبل آدرس ایمیل نویسنده را داریم، بنابراین می‌توانیم آن را در سطح حساب و فردی از قبل پر کنیم. ما همچنین فرض می کنیم که همه نویسندگان به جای کسب و کار، افراد هستند. می‌توانیم mcc نمایه کسب‌وکار (کد طبقه‌بندی تاجر) را به‌عنوان کالاهای دیجیتال از قبل پر کنیم تا هر نویسنده مجبور نباشد فهرست انواع خدمات را برای یافتن کالاهای دیجیتال جستجو کند.

  def create
    account = Stripe::Account.create(
      type: 'standard',
      email: current_user.email,
      business_type: 'individual',
      business_profile: {
        mcc: '5818',
      },      
      individual: {
        email: current_user.email,
      },
      metadata: {
        author_id: current_user.id,
      }
    )
    current_user.update(stripe_account_id: account.id)

    account_link = Stripe::AccountLink.create(
      account: account.id,
      refresh_url: stripe_account_url,
      return_url: stripe_account_url,
      type: 'account_onboarding'
    )

    redirect_to account_link.url, status: :see_other, allow_other_host: true
  end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

وقتی رویدادهای مربوط به حساب‌های Stripe در Stripe اتفاق می‌افتد، می‌توان با استفاده از webhook به برنامه اطلاع داد. ما باید به آن گوش دهیم account.updated نوع رویداد webhook به طوری که ما بدانیم چه زمانی یک حساب با موفقیت وارد شده است.

وب هوک ها را راه اندازی کنید

ما به یک کنترلر برای رسیدگی به درخواست های POST دریافتی از Stripe نیاز داریم.

rails g controller Webhooks
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما یک مسیر ساده از /webhooks برای رسیدگی به درخواست‌های POST اضافه می‌کنیم.

resources :webhooks, only: [:create]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از آنجایی که درخواست‌ها از Stripe می‌آیند، ما نمی‌توانیم هیچ کد CSRF را تأیید کنیم، بنابراین از آن بررسی در بالای کنترلر صرفنظر می‌کنیم.

class WebhooksController < ApplicationController
  skip_before_action :verify_authenticity_token
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس یک متد ایجاد برای رسیدگی به درخواست‌های پست از Stripe اضافه می‌کنیم تا بدنه رویداد و سوئیچ را بر اساس نوع اعلان رویداد تغییر دهید.

  def create
    payload = request.body.read
    event = nil

    begin
      event = Stripe::Event.construct_from(
        JSON.parse(payload, symbolize_names: true)
      )
    rescue JSON::ParserError => e
      # Invalid payload
      puts "⚠️  Webhook error while parsing basic request. #{e.message})"
      render json: { message: 'failed' }, status: 400
      return
    end

    case event.type
    when 'account.updated'
      account = event.data.object # contains a Stripe::Account
      # TODO: Handle account updates
    else
      puts "Unhandled event type: #{event.type}"
    end

    render json: { message: 'success' }
  end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هر بار که رویداد account.updated را دریافت می‌کنیم، می‌خواهیم پرچم‌های نویسنده محلی خود را برای فعال بودن هزینه‌ها و پرداخت‌ها به‌روزرسانی کنیم.

    when 'account.updated'
      account = event.data.object # contains a Stripe::Account
      author = User.find_by(stripe_account_id: account.id)
      author.update(
        charges_enabled: account.charges_enabled,
        payouts_enabled: account.payouts_enabled
      )
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای ساخت و آزمایش وبکهک ها به صورت محلی، از Stripe CLI استفاده می کنیم. را listen دستور ما را قادر می سازد تا هم حساب را فوروارد کنیم و هم رویدادهای webhook را متصل کنیم. رویدادهای مستقیم حساب مستعار رویدادهایی هستند که در حساب ما فعال می شوند، رویدادهای اتصال رویدادهایی هستند که در حساب های متصل رخ می دهند.

شنونده را با:

stripe listen --forward-to localhost:3000/webhooks --forward-connect-to localhost:3000/webhooks
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به عنوان یک میانبر با Rails، من یک فرآیند جدید به Procfile.dev اضافه می کنم تا هر بار که bin/dev را اجرا می کنیم این کار شروع شود. Profile.dev من به شکل زیر است:

web: bin/rails server -p 3000
js: yarn build --watch
css: yarn build:css --watch
stripe: stripe listen --forward-to localhost:3000/webhooks --forward-connect-to localhost:3000/webhooks
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون می‌توانیم جریان ورود را طی کنیم و جزئیات تست را وارد کنیم. از رشته‌های تست جادویی این سند برای اطمینان از یک حساب آزمایشی تأیید شده استفاده کنید. توجه داشته باشید که برای فعال کردن حساب، باید ایمیل خود را نیز تأیید کنید، بنابراین از یک آدرس ایمیل واقعی که هنگام ایجاد حساب اتصال جدید به آن دسترسی دارید استفاده کنید.

اگر همه چیز طبق برنامه پیش برود، JSON را برای حساب Stripe در مرورگر می‌بینید، نویسنده شما یک شناسه حساب Stripe دارد، هزینه‌های فعال شده درست است، و پرداخت‌های فعال شده در پایگاه داده درست است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا