質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1281閲覧

payjpのレスポンスから定期課金IDを取得できない

mofuko

総合スコア13

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/07/29 06:29

編集2020/10/20 23:37

[前提]
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

定期課金キャンセル処理の流れのイメージを記載しておきます。

  1. 定期課金の処理(pay)がpayjpに送られると、ユーザーごとの定期課金IDが発行される

  2. getメソッドでpayjpから発行された定期課金IDを取得し、usersテーブルのsubsucription_id(定期課金ID)カラムに保存する

  3. 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yastinbieber

2020/10/20 13:59 編集

こんばんは。 現在僕自身もwebアプリケーションにPayjpを用いて定期課金を実装しようとしております。 その際本ページが実装したい内容に非常に近かったので参考にさせていただいております。 もし可能でしたら定期課金を実装した際のコードをご教示いただけますと幸いです。 Githubなどでコードを共有しておりましたら助かります。。 こんなところにこのようなご依頼をしていいのかはわかりませんが、 なかなか定期課金に関しての解説が少なく実装に非常に困っております。。 もし可能でしたらで構いません。 何卒宜しくお願い致します。
mofuko

2020/10/20 23:36

こんにちは。 GitHub URLを共有させていただきますので、不明点ございましたら教えていただければと思います。 https://github.com/nanakobaby/myapp
yastinbieber

2020/10/21 12:12

ご親切にありがとうございます! 参考にさせていただきます!
guest

回答1

0

自己解決

すみません、単純にデータベースに保存する記述が抜けていました????‍♀️????????
payアクションで、payjpからのレスポンスをユーザーデーブルに保存する記述をしたら解決しました。
したがって、doneアクションは必要なかったです。

def pay card = Card.where(user_id: current_user.id).first Payjp.api_key = ENV['PAYJP_PRIVATE_KEY'] subscription = Payjp::Subscription.create( :customer => card.customer_id, :plan => plan, metadata: {user_id: current_user.id} ) current_user.update(subscription_id: subscription.id, premium: true) #この記述 redirect_to action: 'done' end

投稿2020/07/29 23:10

mofuko

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問