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