PayPalとの連携

出典: Wiki | CodeIgniter Users Group in Japan

世の中には数多くあるクレジットカード決済システムがありますが、PayPalには以下の様なメリットがあります。

  • 決済用のライブラリ周りが充実、APIもある
  • 日本語、英語はもちろん他の言語にも対応
  • 毎月の維持費なし、手数料も他の決済サービスに比べて安いらしい
  • アカウント作成の際の審査がほとんどなし
  • 数銭単位の決済も使えるマイクロペイメントにも対応

ここではCodeIgniter用にまとめたPayPalのライブラリの実装の仕方を紹介します。 このライブラリにはPayPalのIPNとPDTという決済機能を使った実装を紹介します。 まず最初にIPNを使ったものを紹介して、後ほどPDTの方も追記します。

PayPalのIPNとPDTについての詳細はグーグルさんに聞いて見てください。

目次

PayPal IPNとの連携

1. PayPalデベロッパーアカウントを作る

テスト中に本物のクレジットカードやPayPalのアカウントを使うと、余計な支払いが発生してしまうので、PayPalのテストにはデベロッパーアカウントを所得しsandboxでテストを行います。

https://developer.paypal.com/

このURLからアカウントを所得し、ログイン後以下のリンクから支払いを受け取るSellerと支払いを行うBuyerのアカウントを1つずつ作成します。

https://developer.paypal.com/cgi-bin/devscr?cmd=_create-account-session

パスワードはPayPalが勝手に決めますが、覚え易いものに変更する事をお勧めします。

2. PayPalパッケージの解凍とファイルの配置

http://paypal.betal.jp/ci_paypal.zip

このURLからzipファイルをダウンロードします。

ファイルを解凍するとPayPal決済の機能を実装するファイルがCodeIgniterのディレクトリ構成(controllers, views, models, config)の中に展開されます。これらのファイルをCodeIgniterの各ディレクトリに置いてください。このライブラリはCodeIgniterのバージョンは1.7を使って作りましたが、特に変なことはしていないので、他のバージョンでも動くはずです。

またsqlディレクトリに入っているschema.sqlはpaypal決済を保存しておくテーブルの入ったMySQL用のスキーマファイルです。このschema.sqlをMySQLにロードしてテーブルを用意してください。またdatabase.phpへのデータベースの設定もお忘れなく。

config/constants.phpはCodeIgniterに既に存在するファイルなので、以下の行を加えてもらうだけでも構いません。

//paypal
define('PAYPAL_IPN', 'ipn');
define('PAYPAL_PDT', 'pdt');

注意!!
PayPal IPNはインターネット上で見えるサーバーに対してリクエストを飛ばす必要があるので、インターネット上にあるサーバーを使うようにしてください。

4. パラメーターを修正

  • views/paypal_view.php内の15行目、39行目

PayPalデベロッパーアカウントのSellerアカウントのアカウント名(メールアドレス)に修正します。
moksah_1248273171_biz@gmail.com の様に_bizで終わっている物がSellerのメールアドレスになります。

3. PayPalページのロード

ファイルを配置するとpaypalコントローラ以下にpaypal支払い用のボタンのあるページをロードしてみます。

http://paypal.betal.jp/paypal

にある様にボタンが表示されればokです。

4. IPNリクエストの確認のための準備

IPNの詳細の説明はグーグルさんに任せるとして、IPNを使った支払い完了までのフローは以下の様になります。

a. 顧客がPayPalで支払いを行う
b. PayPalがあなたのサーバーに対し支払い情報を含んだリクエストを飛ばす
c. あなたのサーバーで受けたリクエストをPayPalに戻す
d. PayPalが戻ってきたデータをチェックして、正しいかどうかを判断し、結果をあなたのサーバーに戻す
e. データが認証された場合支払いが正常に完了する

b. で飛んでくるPayPalからのリクエストを確認するためサーバー内のシェルから以下のコマンドを発行します

tail -f /var/log/apache2/access.log

当然access.logの位置は各サーバーの設定に合わせてください。

5. PayPalで支払い

/paypal コントローラをロードして、ページ内にある「2000円購入」ボタンをクリックしてPayPalにリクエストが飛ばされるのを確認します。

To access the PayPal Sandbox, please log in to PayPal Developer Central.

と表示される場合はリンクをクリックしてPayPalデベロッパーアカウントにログインします。

PayPalのアカウントを使って支払いを進める様に促されるので、先ほど作ったBuyerアカウントを使ってPayPalにログインします。
amano_1222333444_per@codeigniter.jp の様に_perで終わっている物がBuyerのメールアドレスになります。

ログイン後注文の詳細の画面と共に「Pay Now」ボタンが表示されるので、「Pay Now」ボタンをクリックして支払いを終了します。

注意!! この際の支払い画面は英語で出てきますが、デベロッパー環境は英語しか用意されていないようです。この後の8.の設定で本番環境に変更後は支払い画面も日本語で表示されます。

6. IPNリクエストの確認

支払い後数秒後にIPNリクエストがPayPalから飛んできます。リクエストが以下の様にaccess.logの中に出てくればPayPalがきちんとIPNを送ってくれたと確認できます。

111.222.222.111 - - [13/Nov/2008:16:25:19 +0900] "POST /paypal_ipn HTTP/1.0" 200 - "-" "-"

7. DBにデータが保存されているかどうかの確認

支払いが認証されると/paypal_ipnコントローラがDB内のpaypal_paymentテーブルに対して書き込みを行います。

+----+--------+---------------+-------------------+------+---------------------+
| id | amount | currency_code | txn_id            | type | ctime               |
+----+--------+---------------+-------------------+------+---------------------+
|  1 |   2000 | JPY           | 1VT55951UL1165239 | ipn  | 2008-11-23 14:40:00 | 

この様な列がDBに入っていれば成功です。認証に失敗した場合は何も書き込みは行われません。

8. 本番環境に設定を変更

デベロッパー環境で動作確認後本番環境に設定を変更します。事前に本番環境用のPayPalのビジネスアカウントを作成しておいてください。

  • controllers/paypal_ipn.php内の48行目
  • views/paypal_view.php内の12行目、36行目

これらの行をコメントアウトして、上にあるsandboxの付いているデベロッパー環境の部分をコメントアウトします。

  • views/paypal_view.php内の15行目、39行目

Sellerアカウントのアカウント名(メールアドレス)を本番のものに変更
これで一般のPayPalアカウントやクレジットカードでの支払いが受けれるようになります。