ActiveMerchant を使ってPayPal Express Checkout の与信取得と回収機能を導入する

どうも、shibuso です。前回「PayPal のSandbox に挑んでみた」を書きましたが、今回はRuby のライブラリ「ActiveMerchant」を用いてPayPal Express Checkout に対応した大まかな流れをまとめてみたいと思います。GitHub にあるActiveMerchant のWiki からリンクが張られているCody Fauser – PayPal Express Payments with ActiveMerchant (以降Cody Fauser と呼びます)を参考にしました。順番も基本はこれと同じです。 注: Cody Fauserはその後閉鎖しました。 この記事を読むにあたって、前提条件としてある程度Rails が使えることと、PayPal Sandbox 環境が整っていることが求められます。また、今回の実装は即時課金を行うのとは少し違う「与信取得→後日回収」という実装を行なっていますが、こうしたPayPal の最低限の仕様理解も必要です。なお、PayPal の解説ページも所々説明で活用します。また、実装環境はRails 3.2.12, ActiveMerchant 1.31.1 です。 では始めましょう。まずActiveMerchant のgem を入れます、ここはActiveMerchant のReadme と同じです。続いてCody Fauser と同じくconfig/environments/development.rb にSandbox を使用するように指定します。 # config/environments/development.rb config.after_initialize do ActiveMerchant::Billing::Base.mode = :test end 更に日本円を扱う場合は、通貨を設定します。config/environment.rbに下記を記述しました。 # config/environment.rb ActiveMerchant::Billing::PaypalExpressGateway.default_currency = “JPY” 続いてgateway の準備をします。Cody Fauser では使用するクラス内に記述していましたが、私は複数箇所で使用する想定だったのでモデルに書きました。ここで必要な情報は全てPayPal のSandbox で取得出来ます。 # app/models/paypal_transaction.rb class PaypalTransaction < ActiveRecord::Base include ActiveMerchant::Billing # 省略 def self.gateway @gateway ||= PaypalExpressGateway.new( :login => username, :password => password, :signature => signature ) end end ここまでで準備完了です。以降の実装はPayPal とのやり取りが発生します。PayPal の解説ページの「STEP 2. 導入・ご利用方法(導入イメージ)」の図が大まかな動作順を表しています。ユーザから見たら以下の図ような流れになります。 それではこれからA. SetExpressCheckout にあたる部分を実装します。この後は基本的にコントローラでの実装です。 # app/controllers/payment_controller.rb def checkout # 省略 setup_response = PaypalTransaction.gateway.setup_authorization( price, :ip => request.remote_ip, :return_url => url_for(:action => ‘confirm’, :only_path => false), :cancel_return_url => url_for(:action => ‘cancel’, :only_path => false), :items => items ) paypal_transaction.token = setup_response.token paypal_transaction.save! redirect_to PaypalTransaction.gateway.redirect_url_for(setup_response.token) end 上記でprice は日本円を指定した場合、数値を100 倍する必要があるようです。return_url とcancel_return_url はそれぞれ用意して下さい。items には様々な情報が入ります。gem の中身を見ると確認できます、場所はactive_merchant/billing/gateways/paypal/paypal_common_api.rb のadd_payment_details_items_xml メソッドです。 redirect されるとユーザはしばらくPayPal の画面での処理になります。次にこちらに返ってくるのはPayPal 上でログインしたり支払いの意思を明確にした後です。呼ばれるのは先程return_url で指定したページなので、次はその実装についてです。 # app/controllers/payment_controller.rb def confirm if params[:token].blank? # エラー処理 end details_response = PaypalTransaction.gateway.details_for(params[:token]) if !details_response.success? # エラー処理 end # 省略 # params[:token] と同じtoken を持つレコードを探す(先程token を保存したレコード)、無い場合はエラー処理 paypal_transaction.payer_id = params[:PayerID] paypal_transaction.save! … Continue reading ActiveMerchant を使ってPayPal Express Checkout の与信取得と回収機能を導入する