エンジニア転職日記

エンジニア転職に向けての日記です

サブスクリプションの導入

概要

オリジナルアプリの作成にて、サブスクリプション型の決済を導入したのでアウトプットします。

一回きり決済の導入方法はPAY.JPの記事にまとめてあります。

今回はその続きです。

 

shangang7321.hatenablog.com

 

PAY.JPでのサブスクリプション課金の流れ 

まずはPAY.JPでのサブスクリプションの流れについて簡単に解説します。

PAY.JPとクライアント、サーバーでは以下のように処理が行われます。

 

①クライアント側でJavaScriptを用いてPAY.JPにカード情報をリクエス

②PAY.JPはそれに対しレスポンスを返し、JavaScriptトークンを生成(公開鍵)

JavaScriptからサーバー側へトークンと決済情報をパラメーターとして送信

④サーバー側はトークンと決済情報をもとにPAY.JPと通信し、決済を行う(秘密鍵

 

基本的な流れは、一回きりの決済と同じです。異なる点は、④の決済情報が少し複雑になる点です。

単発決済の場合はChargeオブジェクトを生成して決済するだけでしたが、サブスクリプションの場合は、

トークンをもとに、Customerオブジェクトを生成

②金額、課金周期などの情報をもつPlanオブジェクトを生成

③どの顧客がどのプランを契約しているのか、という情報をもつSubscriptionオブジェクトを生成

という流れになります。

SubscriptionオブジェクトがPAY.JP上でONになっている時(正確には、statusがactive)になっている時に一定の周期でクレジットカードへの請求が行われます。

実装

 

今回実装したコードの全体像です。

# orders_controller.rb
 
def pay_order
Payjp.api_key = ENV["PAYJP_SECRET_KEY"]
customer = Payjp::Customer.create(card: params[:token])
plan = Payjp::Plan.create(
amount: @order.profile.price,
interval: 'month',
currency: 'jpy'
)
subscription = Payjp::Subscription.create(
customer: customer.id,
plan: plan.id
)
end

 

一行ずつ解説します。

 

Payjp.api_key = ENV["PAYJP_SECRET_KEY"]
ここで、環境変数に保存してある秘密鍵を使ってPAY.JPとのやりとりを可能にします。
 
customer = Payjp::Customer.create(card: params[:token])
 JavaScriptを用いて生成したトークンがパラメーターを通して送られてくるので、それを利用して顧客情報を生成します。すると、PAY.JPの顧客情報に顧客が追加されます。

f:id:shangang7321:20200826091113p:plain

 
plan = Payjp::Plan.create(
amount: @order.profile.price,
interval: 'month',
currency: 'jpy'
)

金額、課金周期、通貨の情報を持ったPlanオブジェクトを生成します。すると、このようにプランが生成されます。

f:id:shangang7321:20200826091344p:plain

 

Payjp::Subscription.create(
customer: customer.id,
plan: plan.id
)

最後に、先ほど生成した顧客情報とプラン情報のIDを用いてSubscriptionオブジェクトを生成します。するとこのようにPAY.JP上でサブスクリプション情報が生成されます。

f:id:shangang7321:20200826091653p:plain

詳細情報には、どの顧客がどのプランで登録しているのか、いつ請求なのか、といった情報が記載されています。

f:id:shangang7321:20200826091813p:plain

これで、実装が完了しました。

参考

https://shingo-sasaki-0529.hatenablog.com/entry/how_to_use_payjp_by_ruby

https://pay.jp/docs/api/?ruby#%E5%AE%9A%E6%9C%9F%E8%AA%B2%E9%87%91%E3%82%92%E5%89%8A%E9%99%A4