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

Vagrant+Docker+PHP環境で「session.save_path」指定時に、セッションファイルが空になるエラー

ファイル共有でのフォルダの所有者を設定 結論 PHP5.4.28 からセッションファイルのownerはrootもしくはWebサーバのユーザに限るという制限が...

LINEと連携したテイクアウト事前注文システム徹底比較!

目次 テイクアウト予約・注文受付システムのトレンド LINEと連携したテイクアウト事前注文システムの価格表 L.B.B.Cloud テイクイーツ ...

PHPで動画の撮影日を取得

PHPで動画の撮影日を取得 概要 PHPからffprobeコマンドを実行し、動画の撮影日時を取得します。 コード $posted_at = ...

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

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

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

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

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

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