PayPal



2010 3月30日

Perlモジュール Business::PayPal::API

PayPalのAPIを使う時は Business::PayPal::API というモジュールが便利。

先日のエントリー PayPal利用時の決済フローを考える でLandingPageオプションの事を書いたのですが、Business::PayPal::API で実装するとそのままでは利用出来ないので、Business::PayPal::API::ExpressCheckout のソースを変更する必要があります。

PayPalの英語版APIの解説書(PDF)にはLandingPageの記載が無いようでしたので日本独自の仕様なのでしょうか??変更方法は簡単です。
パスは自分の環境ですと
/usr/lib/perl5/site_perl/5.8.5/Business/PayPal/API/ExpressCheckout.pm でした。

変更方法

Business::PayPal::API::ExpressCheckoutの21行目付近に、

my %types = ( Token                     => 'ebl:ExpressCheckoutTokenType',
		  OrderTotal                => 'cc:BasicAmountType',
		  currencyID                => '',
		  MaxAmount                 => 'cc:BasicAmountType',
		  OrderDescription          => 'xs:string',
		  Custom                    => 'xs:string',
		  InvoiceID                 => 'xs:string',
		  ReturnURL                 => 'xs:string',
		  CancelURL                 => 'xs:string',
		  Address                   => 'ebl:AddressType',
		  ReqConfirmShipping        => 'xs:string',
		  NoShipping                => 'xs:string',
		  AddressOverride           => 'xs:string',
		  LocaleCode                => 'xs:string',
		  PageStyle                 => 'xs:string',
		  'cpp-header-image'        => 'xs:string',
		  'cpp-header-border-color' => 'xs:string',
		  'cpp-header-back-color'   => 'xs:string',
		  'cpp-payflow-color'       => 'xs:string',
		  PaymentAction             => '',
		  BuyerEmail                => 'ebl:EmailAddressType' );

というハッシュの定義があるのでそこに1項目追加するだけです。
以下の様に追記します。

my %types = ( Token                     => 'ebl:ExpressCheckoutTokenType',
		  OrderTotal                => 'cc:BasicAmountType',
		  currencyID                => '',
		  MaxAmount                 => 'cc:BasicAmountType',
		  OrderDescription          => 'xs:string',
		  Custom                    => 'xs:string',
		  InvoiceID                 => 'xs:string',
		  ReturnURL                 => 'xs:string',
		  CancelURL                 => 'xs:string',
		  Address                   => 'ebl:AddressType',
		  ReqConfirmShipping        => 'xs:string',
		  NoShipping                => 'xs:string',
		  AddressOverride           => 'xs:string',
		  LocaleCode                => 'xs:string',
		  PageStyle                 => 'xs:string',
		  'cpp-header-image'        => 'xs:string',
		  'cpp-header-border-color' => 'xs:string',
		  'cpp-header-back-color'   => 'xs:string',
		  'cpp-payflow-color'       => 'xs:string',
		  PaymentAction             => '',
		  BuyerEmail                => 'ebl:EmailAddressType',
		  LandingPage               => '' );

これでLandingPageをBillingにした際にクレジットカード情報入力フォームが最初に表示される様になります。







2010 3月29日

ウェブ ペイメント スタンダードを利用した場合

PayPalで決済する際、ウェブ ペイメント スタンダードを使用し、IPN(即時支払い通知)を受け取って処理しています。
この決済フローの場合、PayPalへ移動した際に表示される画面に若干問題があります。

PayPal決済ページ見本

ウェブペイスタンダードの決済ページの見本

というのも、購入する顧客がPayPalアカウントを持っている場合は問題ないのですが、PayPalアカウントを持っていない場合にはクレジットカード情報を入力する画面にたどり着くまでに「迷う」場合があるためです。

PayPalアカウントを持っていなくて、クレジットカードで決済を希望している顧客は画面左下の「続行」というリンクをクリックして、次の画面へ進まなくてはならない為です。

ネットになれている顧客ならいとも簡単に理解して難なく次ぎ画面へ進むと思いますが、不慣れな顧客にとってはストレスとなると思います。

PayPal APIを使ったエクスプレスチェックアウトの場合

エクスプレスチェックアウトAPIの場合

エクスプレスチェックアウト LandingPageがBillingの場合

そこで、ファーストページにクレジットカード情報の入力フォームを表示したいと考えますが、ウェブ ペイメント スタンダードの場合、そこに誘導するオプションが用意されていません。

調べた結果、PayPal APIを使いエクスプレスチェックアウト(高速チェックアウトAPI)を実装することでこの問題を回避する事が出来ます。

エクスプレスチェックアウトAPIには LandingPage というオプションがあり、表示するPayPal ページのタイプを指定出来ます。

  • Billing: 非PayPal アカウント
  • Login: PayPal アカウントログイン

LandingPage オプションを Billing に指定する事で顧客が最初に表示するページにクレジットカード情報を入力するフォームが含まれたページとなります。

日本ではPayPalアカウントを持つユーザーはまだまだ少数だと思われますので、こういった決済フローを構築する事は大切だと思います。







2009 12月16日

IPN(即時支払い通知)のシステム構築

以前作ったsandboxでのテスト環境を使って、別の事業を構築する為のテストを行ったらエラーに悩まされた。

IPNで通知される状態が

payment_status=Pending
pending_reason=paymentreview

となってしまう。悩んだあげく、受取人のアカウント設定がおかしいのに気付く。
前にいろいろいじったアカウントを受取人に設定したせいかも。
とりあえず変更してみる。

主要通貨を変更

  1. Profile -> Financial InformationのCurrency Balances から
  2. セレクトボックス(Select new currency)から Japanese Yen を選択し、Add Currencyボタンで追加する
  3. 追加された一覧の Japanese Yen のラジオボタンと選択し、Make Primaryボタンを押す。

ウェブ ペイメントの設定

Selling Preferences -> Website Payment Preferences から行う。

各項目は以下の通り。

Auto Return for Website Payments

Auto Return: Off
Return URL: 無し
自動復帰はフォームパラメーターで渡せるのでOff。
事業が1つしか無い場合を除き自動復帰URLをケースによって変えたい場合があるので。

Payment Data Transfer (optional)

Payment Data Transfer: Off
これもフォームで渡せるので。

Encrypted Website Payments

Block Non-encrypted Website Payment: Off
フォームパラメータの暗号化(SSLではない)されていない場合も受け取るようにする。

PayPal Account Optional

PayPal Account Optional: On
これが Off だとPayPalアカウントを持っていないと決済出来ない。
持っていない場合、PayPalへの登録が必須となってしまう。

Contact Telephone Number

Contact Telephone: Off

Express Checkout Settings

Support giropay and bank transfer payments: No

とりあえず設定はしてみたものの、IPNで返されるパラメーターは
payment_status=Pending
pending_reason=paymentreview
のままなので、テストではPendingの場合はエラーとしないで(当然 payment_statusもCompletedにならない)処理するしかないか??