[前提]
GitHub URL https://github.com/nanakobaby/myapp
現在、payjpというgemを使用し、クレジットカード決済機能を実装し、定期課金プランを作成しました。
仕様としては、ユーザーがプレミアム会員登録(定期課金)することで、ブログ投稿機能を使えます。
キャンセルすると、投稿機能が使えなくなります。
[実現したいこと]
クレジットカード決済のキャンセル機能を実現したいのですが、上手くいきません。
キャンセル処理をするためには、ユーザーの定期課金IDをpayjpに送る必要があるので、決済処理時に定期課金IDを取得し、情報を保存するように設定しました。
しかし、決済処理に進むと、以下のエラーが出現してしまいます。
APIレスポンスに含まれる定期課金IDの取得方法で間違っている点等、ご指摘いただけますと幸いです。
宜しくお願い致します。
Could not determine which URL to request: Payjp::Subscription instance has invalid ID: nil
[テーブル・カラム]
usersテーブル: premium(boolean=> trueでプレミアム会員),subscription_id(定期課金idを保存する)
cardsテーブル: customer_id(顧客id),card_id,user_id
定期課金キャンセル処理の流れのイメージを記載しておきます。
-
定期課金の処理(pay)がpayjpに送られると、ユーザーごとの定期課金IDが発行される
-
getメソッドでpayjpから発行された定期課金IDを取得し、usersテーブルのsubsucription_id(定期課金ID)カラムに保存する
-
postメソッドで定期課金ID(subscription_id)を含んだキャンセルリクエストをpayjpに送信する
このようなイメージで、公式APIリファレンスを元に
https://pay.jp/docs/api/#subscription%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88
https://pay.jp/docs/api/#%E5%AE%9A%E6%9C%9F%E8%AA%B2%E9%87%91%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97
以下のようにコードを記述しました。
[該当するコード]
purchases_controller
class PurchasesController < ApplicationController require 'payjp' def plan #定期課金プラン Payjp::Plan.create( :amount => 1000, :interval => 'month', :billing_day => 27, :currency => 'jpy', ) end def pay #支払い処理 card = Card.where(user_id: current_user.id).first #ユーザーのカード情報を取得 Payjp.api_key = ENV['PAYJP_PRIVATE_KEY'] Payjp::Subscription.create( :customer => card.customer_id, :plan => plan, ) user = User.find(current_user.id) user.update(premium: true) redirect_to action: 'done' # 決済が完了したら、遷移する画面 end def done #payjpから定期課金IDを取得するメソッド user = User.find(current_user.id) Payjp.api_key = ENV['PAYJP_PRIVATE_KEY'] subscription_id = Payjp::Subscription.retrieve(user.subscription_id)# この記述で取得しようとしています end def cancel #決済キャンセル処理 Payjp.api_key = ENV['PAYJP_PRIVATE_KEY'] subscription = Payjp::Subscription.retrieve(user.subscription_id) subscription.cancel user = User.find(current_user.id) user.update(premium: false) redirect_to action: 'canceled' end end
doneメソッドに定期課金IDを取得する記述をし、done.html.erb (購入が完了したことを表示するページ)に遷移した際に、doneメソッドの処理が走るように記述しました。
routes.rb
resources :purchases, only: [:index] do collection do post 'pay', to: 'purchases#pay' get 'done', to: 'purchases#done' post 'cancel', to: 'purchases#cancel' end end
回答1件
あなたの回答
tips
プレビュー