2010-11-09

[perl] PayPal の ExpressCheckout を使ってみる

PerlからPayPalのExpressCheckoutを使う方法についての記事です。これからはPayPalの時代が来るという記事を読んで自分でもやってみたくなったので、Sandboxアカウントで実際にやってみました。まだ実際にお金を動かしたりはしていないので、至らない点が多々あると思います。

ExpressCheckoutとは、決済手続きの途中でPayPalにリダイレクトして、その後こちら側のサイトに戻ってから最終決断のボタンを押してもらう方式で、決済完了の情報がきちんと伝わらないみたいな中途半端な状態にはならない方式です。

モジュールの選定
PayPal APIは二種類の形式で使うことができて、NVP(Name Value Pair)とSOAPです。

このうち、SOAPを使う、Business::PayPal::API はPayPal APIの更新に追従できていないので良くないです。SOAPを直接いじろうとして、SOAP::Lite を検討しましたが、面倒な感じなのでやめました。

a=b&c=d..のような形式でフォーマットされている素朴極まりないNVPを利用するライブラリ、Business::PayPal::NVP がAPIが更新されても利用できるので良いと思います。

Sandboxアカウントの取得
こちら PayPal Sandbox で誰でも取得できます。Sandboxの中ではお金が使い放題です。

実際のコード

use Business::PayPal::NVP;

# branchでsandbox, 本番サーバーを切り替える
my $paypal = Business::PayPal::NVP->new(
    test => {
        user    => 'info_1287414775_biz_api1.hidekiy.com',
        pwd => 'xxxxxxxxxxx',
        sig => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        version => 65, # 新しいのをたのむ
    },
    branch => 'test',
);

# 請求金額が確定していて、PayPalでの支払いを希望しているとする。
my %res = $paypal->SetExpressCheckout(
    PAYMENTREQUEST_0_PAYMENTACTION => 'Sale',
    PAYMENTREQUEST_0_AMT => '1000.00',
    PAYMENTREQUEST_0_CURRENCYCODE => 'JPY',
    LOCALECODE => 'JP',             # Sandboxでは効いてないけど、本番ではたぶんOK
    LANDINGPAGE => 'Billing', # ログインだけのページになると寂しいのでBilling
    SOLUTIONTYPE => 'Sole',     # PayPalアカウントを作る必要はなしとする
    RETURNURL => 'http://example.com/return',
    CANCELURL => 'http://example.com/cancel',
);

# $res{ACK}を確認後、
# https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=$res{TOKEN}
# にリダイレクトして、支払い手続きをしてもらう。

# http://example.com/returnにPayerIDとtokenを付けて戻ってくる
# 最終決断をしてもらったあと、以下を実行する
my %res = $paypal->DoExpressCheckoutPayment(
    PAYMENTREQUEST_0_PAYMENTACTION => 'Sale',
    PAYMENTREQUEST_0_AMT => '1000.00',
    PAYMENTREQUEST_0_CURRENCYCODE => 'JPY',
    TOKEN => scalar $req->param('token'),
    PAYERID => scalar $req->param('PayerID'),
);
# $res{ACK}を確認して完了

参考資料
Introducing Express Checkout
SetExpressCheckout API Operation
DoExpressCheckoutPayment API Operation