نصب 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 دارد، هزینههای فعال شده درست است، و پرداختهای فعال شده در پایگاه داده درست است.