Ruby on Rails PaypalAPI ExpressCheckout のサンプルコード

PaypalAPI ExpressCheckout
2015/06/03

Paypal ExpressCheckout

概要

PaypalAPI の ExpressCheckout を使用することで、ショッピングサイトなどの決済を簡単に実装することができます。
Master card、Viza、American express、JCB などに対応しております。

今回は、Ruby on Rails で実装するためのサンプルコードを記載しています。

処理の流れ

ExpressCheckout を実装するには、以下の3つのAPIを実行する必要があります。

SetExpressCheckout
必要な情報を送り、token を取得します。
その後、 token を付加して paypal.com にリダイレクトします。

GetExpressCheckoutDetails
tokenとpayeridを載せて、このAPIを実行することで、決済内容の詳細を取得します。

DoExpressCheckoutPayment
tokenとpayeridを載せて、このAPIを実行することで、決済を完了します。

実装

事前準備

Paypal の API を使用するために、「APIユーザー名」「APIパスワード」「署名」を取得する必要があります。
取得方法については、エクスプレスチェックアウト を参照ください。

サンプルコード

※sandbox を使用しています。

[Paypal Api 用のClass]


class PaypalApi

  SITE_URL                            = "http://pb-times.jp/"
  PAYPAL_API_USER                     = "[APIユーザー名]"
  PAYPAL_API_PWD                      = "[APIパスワード]"
  PAYPAL_API_SIGNATURE                = "[署名]"
  PAYPAL_API_URL                      = "https://www.sandbox.paypal.com"

  PAYPAL_API_EXPRESS_METHOD           = "SetExpressCheckout"
  PAYPAL_API_EXPRESS_METHOD_VER       = "122"
  PAYPAL_API_EXPRESS_PAYMENT_NAME     = "deposit"
  PAYPAL_API_EXPRESS_PAYMENT_QTY      = "1"
  PAYPAL_API_EXPRESS_NOTIFY_FILE      = "notify"

  PAYPAL_API_GET_EXPRESS_METHOD       = "GetExpressCheckoutDetails"
  PAYPAL_API_GET_EXPRESS_METHOD_VER   = "122"

  PAYPAL_API_DO_EXPRESS_METHOD        = "DoExpressCheckoutPayment"
  PAYPAL_API_DO_EXPRESS_METHOD_VER    = "122"

  PAYPAL_API_PAYMENTACTION            = "Sale"
  PAYPAL_API_CURRENCYCODE             = "JPY"

  attr_accessor :response, :error_code, :error_message

  def initialize(opts = {})
    params = {
      USER: PAYPAL_API_USER,
      PWD: PAYPAL_API_PWD,
      SIGNATURE: PAYPAL_API_SIGNATURE,
    }

    query = URI.parse(params.merge(opts).map {|k,v| "#{k}=#{CGI.escape(v)}" }.join('&')).to_s

    @error_code = ''
    @error_message = ''
    error_msg = ''

    begin
      res = Deposit.http_request(PAYPAL_API_URL, query, 'get')
      @response = URI.decode_www_form(res)
      @response = Hash[*@response.flatten]

      if @response.has_key?('L_SEVERITYCODE0') && @response['L_SEVERITYCODE0'] == 'Error'
        @error_code = @response['L_ERRORCODE0']
        error_msg = @response['L_LONGMESSAGE0']
      end
    rescue
      error_msg = 'bad request'
    end

    if ! error_msg.empty?
      @error_message = 'Paypal error message: ' + error_msg
      @error_message += '[' + error_code + ']' if ! error_code.empty?
    end
  end

  def self.set_express_checkout(amount)
    opts = {
      METHOD: PAYPAL_API_EXPRESS_METHOD,
      VERSION: PAYPAL_API_EXPRESS_METHOD_VER,

      PAYMENTREQUEST_0_PAYMENTACTION: PAYPAL_API_PAYMENTACTION,
      PAYMENTREQUEST_0_AMT: amount.to_s,
      PAYMENTREQUEST_0_CURRENCYCODE: PAYPAL_API_CURRENCYCODE,

      L_PAYMENTREQUEST_0_AMT0: amount.to_s,
      L_PAYMENTREQUEST_0_NAME0: PAYPAL_API_EXPRESS_PAYMENT_NAME,
      L_PAYMENTREQUEST_0_QTY0: PAYPAL_API_EXPRESS_PAYMENT_QTY,

      RETURNURL: SITE_URL + '/' + PAYPAL_API_EXPRESS_NOTIFY_FILE,
      CANCELURL: SITE_URL,
    }

    PaypalApi.new(opts)
  end

  def self.get_express_checkout_details(token)
    opts = {
      METHOD: PAYPAL_API_GET_EXPRESS_METHOD,
      VERSION: PAYPAL_API_GET_EXPRESS_METHOD_VER,

      TOKEN: token
    }

    PaypalApi.new(opts)
  end

  def self.do_express_checkout(token, payerid, amount)
    opts = {
      METHOD: PAYPAL_API_DO_EXPRESS_METHOD,
      VERSION: PAYPAL_API_DO_EXPRESS_METHOD_VER,

      TOKEN: token,
      PAYERID: payerid,

      PAYMENTREQUEST_0_PAYMENTACTION: PAYPAL_API_PAYMENTACTION,
      PAYMENTREQUEST_0_AMT: amount.to_s,
      PAYMENTREQUEST_0_CURRENCYCODE: PAYPAL_API_CURRENCYCODE
    }

    PaypalApi.new(opts)
  end
end

[API 呼び出し]


    amount = 1000  //決済金額
    paypal = PaypalApi.set_express_checkout(amount)

    if ! paypal.error_message.empty?
      flash[:error] = paypal.error_message
      //エラー処理
    end

    // paypal へリダイレクト
    token = paypal.response['TOKEN']
    url = 'https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=' + token

    return redirect_to(url)

[戻ってきたときの処理(notifyで指定したファイル)]


    amount = 1000  //決済金額
    token = params[:token]
    payerid = params[:PayerID]

    # GetExpressCheckoutDetails
    paypal = PaypalApi.get_express_checkout_details(token)
    details = paypal.response

    # DoExpressCheckoutPayment
    paypal = PaypalApi.do_express_checkout(token, payerid, amount)

    if ! paypal.error_message.empty?
      flash[:error] = paypal.error_message
      //エラー処理
    end

かなり適当にプログラミングしたので、バグがあるかも。。。
いろいろ端折っていますが、参考になればと思います。

  • このエントリーをはてなブックマークに追加
Related

FullCalendarでGoogleカレンダーのようなUIを実装

jQueryプラグインFullCalendarのサンプル 概要 FullCalendarを使用して、GoogleカレンダーのようなUIを実装する使用例を...

PHP Laravel5.2でmulti-auth(複数テーブルでの認証)を実装

Laravel5.2でマルチ認証 概要 LaravelとはPHPの中で今最も伸びているフレームワークです。 処理速度が遅いなどありますが、かなり使い安く拡...

PHP 正規表現でIPアドレス形式の文字列か判定

正規表現でIPアドレスの入力チェック 概要 フォームで入力されたIPアドレスが正当な文字列か判定するためのバリデーション処理を実装します。 基本的...

rbenv環境でRuby on Railsのアプリケーションを一瞬で自動生成

アプリケーション構築時に最初に行う手順 概要 アプリケーションを作成するまでの手順を記載しています。 rbenvなどの環境が設定済と仮定して話を進めま...

Rails devise・authority・rolifyで権限付きの認証機能

devise・authority・rolify 概要 3つのGemを使用して、権限付き認証機能を実装します。 gem インストール Gemfile ...

Rails devise で複数モデルの認証機能を実装

Rails devise で複数モデルを管理 概要 rails のログイン認証 Gem「devise」のインストール・設定方法を紹介します。 よく「d...
トップへ戻る