本文へスキップ

知恵のカケラを結ぶ

PayPalを使った決済システムの構築方法SERVICE&PRODUCTS

テキストの詳細

PayPalを使った決済システムの構築方法
  PHP5を使った有料ダウンロード販売サイトの作り方

作成日:2009/5/12  改訂日:2014/7/25
PayPalを使った決済システムの構築方法を、 ダウンロード販売サイトを例にして、説明しています。
開発環境:PHP5、MySQL
詳しくは、下記のサンプルをご覧ください。

実用的なシステムを必要とされる方向けに、別途「PayPalを使った自動販売(ダウンロード)システム」を用意しております。
<-  ご購入は、「PayPal」アイコンをクリックしてください。
2017/11/11現在、販売停止中です。 価格6,000円 1,000円
サンプル
最初の16ページのみです
目次 (大きな見出しのみ)
  • はじめに
  • 決済システムの概要
  • 準備
  • PayPal(Sandbox)の登録、設定
  • 基本的なサイトの作成
  • IPN機能の追加
  • ダウンロードサイトの構築
  • 実践サイト「PostTips DL」
  • サポートなど
(注)PayPalとの通信に絞り必要最小限の説明になっています。実際に、サイトを作られる場合、セキュリティや、管理のための処理などを追加してください。
補足
改訂履歴
2013/8/19
HTTP1.0プロトコルから、HTTP1.1に変更
2014/1/29
2014/1のIPNトラブルへの対応
ipn.phpの訂正 (2014/1/29)
2014/1にIPNが動作しないトラブルが発生しました。下記の修正により解決できます。
ipn.phpの下記を

...
if (strcmp ($res, "VERIFIED") == 0) {
...
else if (strcmp ($res, "INVALID") == 0) {
...

次のように修正してください。

...
if (strcmp (trim($res), "VERIFIED") == 0) {
...
else if (strcmp (trim($res), "INVALID") == 0) {
...

download.phpの訂正
sample3、sample4の10行目
$payer_id = $_GET['payer_id'];
は、不要ですので、削除してください。
sample4の補足
購入の後、ダウンロードページが表示される流れは良いのですが、お客様は、必ずしも、ダウンロードページにたどり着くとは限りません。 お客様がブラウザを閉じたり、ブラウザによっては、移動ができないことも考えられます。
IPNは信頼性の高い手段ですが、PDTは信頼性の低い手段です。
ここでは、PDTを無効にした場合の方法について、補足します。

・success.htmlページを作成します。ここには、「取引が成立しました。メールでダウンロードURLを案内します。」という趣旨のことを記述します。
・PayPalでの購入ボタンを修正します。チェックアウトの完了後、お客様に特定のページを表示しますの項目を、success.htmlに変更します。

これにより、お客様は、支払いの後、success.htmlページの表示を見ることになります。
Q&A
Q. sample3で、ダウンロードできません
A.
問題の切り分けを行います。
・データベースにデータは登録されていますか?
upload.htmlを使って、データを登録してください。すでに、登録されていれば、「同じ商品IDが登録されています」と表示されます。

・success.phpへのアクセスの後、先に進みますか?
success.phpへのアクセスが、長く続くことがあります。5分ほど、待ってみてください。
サンプルプログラムでは、PayPalとの通信を説明しやすくするために、簡単な処理で済ませています。 PayPalの仕様書を確認して、適切に処理することで短くすることもできます。ただし、sample4の実装を試されるほうが良いと思います。
待っても、先に進まない場合は、下記の「IPNが動いているかを確認する方法は?」を参照してください。
IPNによる取引情報の受け取りができていない場合、取引が確認できず、ダウンロードできない可能性が考えられます。
Q. IPNが動作しません
A.
サーバーによっては、IPN機能が正常に動作しないことがあります。無料サーバーでは、おそらく、広告表示処理が影響していると思われます。
Q. IPNが動いているかを確認する方法は?
A.
まず、PayPalで正常に動作しているかを確認します。
PayPalにログインし、「マイアカウント」タブの「取引履歴」メニューから、「IPN取引履歴」を選びます。
ここで、日付の範囲を指定して検索し、履歴を確認します。ステータスが、"送信済み"であれば、PayPalでは正常に処理されていることになります。
履歴がない場合は、PayPalサイトで、IPNの設定を確認します。
購入ボタンに、notify_urlを指定するか、「マイアカウント」タブの「個人設定」から、「販売ツール」を選び、「即時支払い通知」を設定します。
この設定がされていれば、履歴に残るはずです。履歴に残らない場合は、PayPalにお問い合わせください。
履歴に、再送など、不具合が生じている場合は、設定したURLを確認します。URLにファイルが存在しているでしょうか。

次に、サンプルプログラムが正常にIPN通信を受け取っているか、確認する方法を説明します。
サンプルプログラムでは、IPNのアクセス記録を残すようになっています。データベースを開き、logテーブルを確認してください。
「accesslog:xxxx:xxxxx」(xxxxの部分は、PayPalのIPアドレスや、ドメイン名)が残っていれば、PayPalからIPN情報は届いています。
このテーブルには、PayPalからの情報も記録されていますので、エラーの原因を調べることもできます。ただし、ここで得られる情報は、PayPalサイトでのIPN取引履歴で得られる情報と大差ありません。

コンソールから、logテーブルを確認する手順は、次のとおりです。
mysql -u ユーザー名 -pパスワード
データベースにログインした後、
use データベース
select * from log;

logデータがない場合、データベースへのアクセスが正常に行われているか確認してください。
PayPalのIPN取引履歴が正常であり、データベースへのアクセスが正常に行われているにもかかわらず、logテーブルに記録が残っていない場合、サーバーの問題である可能性があります。
無料サーバーで、この症状を確認しており、別のサーバーサービスを利用するしか対策はありませんでした。
Q. データベース内で文字化けします
A.
サーバーによっては、MySQL内の日本語が文字化けすることがあります。
PHP 5.3.6以降であれば、dao.phpを次のように修正して回避できる場合があります。

function __construct(){
	try{
		$this->dbh = new PDO('mysql:host=localhost;dbname=' . $this->dbName . ";charset=utf8",
			$this->userName, $this->userPassword);
	}catch(PDOException $e){								
								
それより、以前のバージョンであれば、次のようにします。「/etc/mysql/my.cnf」の部分は、サーバーに合わせて修正します。

function __construct(){
	try{
		$this->dbh = new PDO('mysql:host=localhost;dbname=' . $this->dbName,
                      $this->userName, $this->userPassword, array(
                          PDO::MYSQL_ATTR_READ_DEFAULT_FILE => '/etc/mysql/my.cnf'
                      ));
	}catch(PDOException $e){								
								

バナースペース

PostTips