PHPでPayPalを利用したオンライン決済サービスの実装方法

PHPでPayPal
2014/01/24

PayPalオンライン決済サービス

概要

PayPalとは、世界各地で利用されているオンラインのクレジット決済サービスです。
ショッピングサイトなどのオンライン決済が必要なサイトでよく利用されています。

この記事では、PHPでPayPalのオンライン決済処理を実装する方法を紹介します。
デベロッパーのページでは、C#、VB、VBScript、Coldfusion、Java/JSP、PERL、PHPのサンプルコードが用意されています。
また、その他の言語でも基本的なことは同じなので参考にしてみてください。

テスト環境の構築

PaypalSandboxを利用することで、決済サービスのテスト環境を構築することができます。

テスト環境の構築手順は簡単です。
1. PayPalアカウントの作成
2. Sandbox accountsの画面で、PersonalとBusinessの2つのアカウントを作成
3. 上記のテストアカウントで検証

通常の決済処理では、www.paypal.comを使用しますが、テスト用はwww.sandbox.paypal.comとなります。
本番のプログラムからドメインをテスト用に切り替えるだけです。

実際に決済処理を行うプログラムは下記をご覧ください。

サンプルコード

決済前の画面

フォームを作成し、PayPalに情報を渡します。
※テスト環境の場合は、actionが「https://www.sandbox.paypal.com/cgi-bin/webscr」となる。


<form action="https://www.paypal.com/cgi-bin/webscr" method="post" name="frm1">
	<input type="hidden" name="charset" value="UTF-8" />
	<input type="hidden" name="cmd" value="_ext-enter" />
	<input type="hidden" name="redirect_cmd" value="_xclick" />
	<input type="hidden" name="business" value="[売り手のPayPalに登録されたメールアドレス]" />
	<input type="hidden" name="item_name" value="Deposit in account" />
	<input type="hidden" name="item_number" value="101" />
	<input type="hidden" name="amount" value="[金額]" />
	<input type="hidden" name="invoice"  id="invoice" value="[ユニークID]" />
	<input type="hidden" name="shipping" value="0" />
	<input type="hidden" name="no_shipping" value="2" />
	<input type="hidden" name="currency_code" value="JPY" />
	<input type="hidden" name="lc" value="en" />
	<input name="cancel_return" type="hidden" id="cancel_return" value="[cancel時に戻るページのパス]" />
	<input name="return" type="hidden" id="return" value="[返ってくるページのURL]" />
	<input name="notify_url" type="hidden" id="notify_url" value="[後処理ページのパス]" />

	<input type="hidden" name="first_name" value="firstname" />
	<input type="hidden" name="last_name" value="lastname" />
	<input type="hidden" name="zip" value="xxx-xxxx" />
	<input type="hidden" name="city" value="" />
	<input type="hidden" name="address1" value="" />
	<input type="hidden" name="H_PhoneNumber" value="" />
	<input type="hidden" name="email" value="info@example.jp" />
</form>

notify_urlで指定したURLのファイル

こちらでは、決済後の後処理を行います。
IPNに接続して、処理が正しいかチェックしたり、DBをアップデートしたりします。
※テスト環境の場合は、Hostが「www.sandbox.paypal.com」となる。


$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
	$value = urlencode(stripslashes($value));
	$req .= "&$key=$value";
}

$header .= "POST /cgi-bin/webscr HTTP/1.1¥r¥n";
$header .= "Content-Type: application/x-www-form-urlencoded¥r¥n";
$header .= "Content-Length: " . strlen($req) . "¥r¥n";
$header .= "Host: www.paypal.com¥r¥n";
$header .= "Connection: close¥r¥n";
$header .= "¥r¥n";

$fp = fsockopen ("ssl://www.paypal.com", 443, $errno, $errstr, 30);

//paypalからの情報取得
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$Invoice = isset($_POST['invoice']) ? $_POST['invoice'] : "0";
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];

$fname = $_POST['first_name'];
$lname = $_POST['last_name'];
$memail = $_POST['payer_email'];

if (!$fp) {
	//error
} else {
	
	fputs ($fp, $header . $req);

	while (!feof($fp)) {
		$res = fgets ($fp, 1024);
		if (strcmp(trim($res), "VERIFIED") == 0) {
			//success
		} else if (strcmp(trim($res), "INVALID") == 0) {
			//error
		}
	}
	fclose ($fp);
}
Related

Vagrant+Docker+PHP環境で「session.save_path」指定時に、セッションファイルが空になるエラー

ファイル共有でのフォルダの所有者を設定 結論 PHP5.4.28 からセッションファイルのownerはrootもしくはWebサーバのユーザに限るという制限が...

LINEと連携したテイクアウト事前注文システム徹底比較!

目次 テイクアウト予約・注文受付システムのトレンド LINEと連携したテイクアウト事前注文システムの価格表 L.B.B.Cloud テイクイーツ ...

PHPで動画の撮影日を取得

PHPで動画の撮影日を取得 概要 PHPからffprobeコマンドを実行し、動画の撮影日時を取得します。 コード $posted_at = ...

FullCalendarでGoogleカレンダーのようなUIを実装

jQueryプラグインFullCalendarのサンプル 概要 FullCalendarを使用して、GoogleカレンダーのようなUIを実装する使用例を...

PHP Laravel5.2でmulti-auth(複数テーブルでの認証)を実装

Laravel5.2でマルチ認証 概要 LaravelとはPHPの中で今最も伸びているフレームワークです。 処理速度が遅いなどありますが、かなり使い安く拡...

PHP 正規表現でIPアドレス形式の文字列か判定

正規表現でIPアドレスの入力チェック 概要 フォームで入力されたIPアドレスが正当な文字列か判定するためのバリデーション処理を実装します。 基本的...
トップへ戻る