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>
こちらでは、決済後の後処理を行います。
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);
}