Pay.jpで定期課金実装
WebPayが提供終了らしいですね残念です。 stripe、webpayの同様の記事は何個かあるにもかかわらずpay.jpは皆無!? でも手数料はvisa3.0%(2.59%のプランもあり詳しくは料金体系)と激安。導入せずにはいられない!
環境
- Ruby on Rails 4
- Ruby 2.4
- deviseなどでユーザ登録を実装済み
注意
私は綺麗なコードはかけません. あくまで参考程度にしてください.
実装
まず、pay.jpで登録しましょう。
仕組み的には、
顧客(idを持っていて、カードをもたせて、顧客idを利用して決済につけるようにしたりする)&プラン(値段月払などをまとめて設定したもの)を作成->subscription関数に顧客&プランを渡す->完成
という流れです。
まず,userモデルにcustomer_idというカラムを追加します。(String型でお願いします.これを用いて、ユーザーに顧客idを紐つけます。 )その次に、pay.jpの管理画面でplanを作成してください。
//user.rb
class User < ActiveRecord::Base
def making_customer(email)
if customer_id==nil
Payjp.api_key = '入力してください'
customer=Payjp::Customer.create(
email:email,
description: 'test',
:card=>{
:number=>'4242424242424242',
:cvc => '123',
:exp_month => '2',
:exp_year => '2020'
}
)
update(customer_id:customer.id)
else
customer_id_check
end
end
- ifでその都度顧客idを発行できないよう制御
- api_keyはシークレットキーを入力してください
- emailはお好みで
- descriptionもお好みで
- cardはテストカードです
- updateでuserのcustomer_idカラムにcustomer.idでpay.jpからのレスポンスの顧客idを代入
- elseでnilでない場合をチェック
cardはテストカードなので、自分のカードを入力すると決済されるかもしれませんのでお気をつけください。
//user.rb
class User < ActiveRecord::Base
def customer_id_check
begin
Payjp.api_key = '入力してください'
check = Payjp::Customer.retrieve("#{customer_id}")
rescue Payjp::InvalidRequestError=> e
update(customer_id:nil)
end
end
なんらかの理由で顧客idはないのに、ユーザーには残されている場合があるかもしれませんのでそれを防いでいます。
- Payjp::Customer.retrieve("#{customer_id}")でpay.jpに顧客idがあるのか確認
- 当然ないとエラーなので、その場合はユーザーのカラムもnilにupdate
class User < ActiveRecord::Base
def subscription(current_user)
Payjp.api_key = '入力してください'
Payjp::Subscription.create(
plan: 'pln_5d740c96c6c5d0b1cf9f68ac7824',
customer: "#{current_user.customer_id}"
)
end
- plan: 'pln5d740c96c6c5d0b1cf9f68ac7824' は先ほど管理画面で作成したplanのidを"pln5d740c96c6c5d0b1cf9f68ac7824"はapi_keyと同様ご自分のものを。
- customer は定期購読したユーザーの顧客idが代入されます
//users_controller.rb
def show
current_user.making_customer(current_user.email)
current_user.subscription(current_user)
end
この部分の説明は省きます。 showメソッドから読んでいるのはテストです。お好みの場所から呼び出してください。
最後に
驚くほど簡単に実装できましたよね? progateとが使用しているようなので、webpayのようにサービス終了はないと思われますし、手数料も安いので是非導入しましょう!!!
更新、及び購読期間の判定処理は未実装なので、近いうちにアップします。
動かない等あればコメントお願いします。