PayPalでダウンロード販売する方法
PayPalのPayPalの「今すぐ購入」や「ショッピングカート」の決済後にダウンロードページなど、任意のページにリダイレクトする方法を紹介します。この方法を使えば、PayPalでダウンロード販売が行えます。
ここではPayPalの公式テストサイト「Sandbox」と「今すぐ購入」ボタンを使って紹介します。本番環境でも一部のURLを書き換えることで利用可能です。
1.ウェブペイメントの設定
決済後に任意のページにリダイレクトさせるには、管理画面の「ウェブペイメントの設定」を変更します。
「今すぐ購入」ボタンや「ショッピングカート」を提供するユーザーのPayPal管理画面で「個人設定」をクリック。マウスをポイントするとサブメニューが表示されますが無視してください。

「販売の設定」にある「ウェブペイメントの設定」をクリック。

移動先の画面で次の項目を設定します。
- 自動復帰:オン
- 復帰URL:リダイレクトするページのURLを設定します。この復帰URLはデフォルトのURLとなり、「今すぐ購入」ボタンや「ショッピングカート」作成時にSTEP3の「顧客がチェックアウト完了すると、このURLにリダイレクトされます」のテキストフィールドにURLを指定すれば、そちらが優先され、「復帰URL」は適用されません。つまり、作成したボタンごとにリダイレクトのページを指定可能です。逆に、「復帰URL」を複数のボタンに対応させるには、「復帰URL」のページで支払いデータを読み込んで、処理を振り分けることで可能になると思います。
- 支払いデータ転送:オン
![]()
保存すると「IDトークン」が表示されます。
![]()
この「IDトークン」は一度保存すると「支払いデータ転送」の項目に常に表示されるようです。

2.文字コードの変更
決済後にリダイレクト先のページに転送する情報の文字コードを、リダイレクト先のページを提供するブログなどの文字コードに合わせます。
「個人設定」をクリック。

「言語のエンコード」をクリック。

「詳細オプション」をクリック。

今回ウェブサイトで使用している文字エンコーディングは「UTF-8」なので「エンコード方式」から「UTF-8」を選択します。また、「PayPalから送信されたデータと同じエンコード方式を使用しますか」は「いいえ」を選択して、さきほどと同様「UTF-8」を選択し、「保存」をクリック。

3.リダイレクトページの作成
PayPalでは次のようなサンプルが公開されています(若干修正しています)。他にもPerl/ASP/VBScript/ColdFusion版があります。
- PayPal - 即時支払い通知のコードサンプル(要ログイン)
<?php
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-synch';
$tx_token = $_GET['tx'];
$auth_token = "IDトークン";
$req .= "&tx=$tx_token&at=$auth_token";
// post back to PayPal system to validate
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);
// If possible, securely post back to paypal using HTTPS
// Your PHP server will need to be SSL enabled
// $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
// read the body data
$res = '';
$headerdone = false;
while (!feof($fp)) {
$line = fgets ($fp, 1024);
if (strcmp($line, "\r\n") == 0) {
// read the header
$headerdone = true;
} else if ($headerdone) {
// header has been read. now read the contents
$res .= $line;
}
}
// parse the data
$lines = explode("\n", $res);
$keyarray = array();
if (strcmp ($lines[0], "SUCCESS") == 0) {
for ($i=1; $i<count($lines);$i++){
list($key,$val) = explode("=", $lines[$i]);
$keyarray[urldecode($key)] = urldecode($val);
}
// check the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your Primary PayPal email
// check that payment_amount/payment_currency are correct
// process payment
$firstname = $keyarray['first_name'];
$lastname = $keyarray['last_name'];
$itemname = $keyarray['item_name'];
$amount = $keyarray['payment_gross'];
echo ("<p><h3>Thank you for your purchase!</h3></p>");
echo ("<b>Payment Details</b><br>\n");
echo ("<li>Name: $firstname $lastname</li>\n");
echo ("<li>Item: $itemname</li>\n");
echo ("<li>Amount: $amount</li>\n");
echo ("");
} else if (strcmp ($lines[0], "FAIL") == 0) {
// log for manual investigation
}
}
fclose ($fp);
?>
取引が完了しましたので、購入商品の受領書をメールでお送りしました。<br> <a href='https://www.paypal.com'>www.paypal.com</a> からアカウントにログインし、取引の詳細を見ることができます。<br>
2項で表示されたIDトークンを、赤色で示している$auth_tokenの右辺に設定します(下に表示しているのはデタラメに入力した文字列ですが、設定イメージはこんな感じです)。
$auth_token = "fasf9ajafBsp9jasFa9w873thLgqa09gauSWghjwtqoj3r0ugaOjQ309ufa";
fsockopenは、Sandboxで接続する場合の設定にしています。
$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);
本番環境で利用する場合は、青色の内容に修正してください。
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);
SSLで接続する場合は、前述のfsockopenの行をコメントアウトして、コメントアウトされている次の行を利用します(行頭の//を削除)。
// $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
この部分も、本番環境で使用する場合は「www.sandbox.paypal.com」を「www.paypal.com」に直してください。
キモになる「支払いデータ」は次の部分で処理しています。
if (strcmp ($lines[0], "SUCCESS") == 0) {
for ($i=1; $i<count($lines);$i++){
list($key,$val) = explode("=", $lines[$i]);
$keyarray[urldecode($key)] = urldecode($val);
}
// check the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your Primary PayPal email
// check that payment_amount/payment_currency are correct
// process payment
$firstname = $keyarray['first_name'];
$lastname = $keyarray['last_name'];
$itemname = $keyarray['item_name'];
$amount = $keyarray['payment_gross'];
このサンプルコードを、2項で指定した文字エンコーディングで保存し、「復帰URL」で指定したファイル名で保存・アップロードします。アップロード先と「復帰URL」が一致するようにしてください。
4.購入のテスト
この設定状態で、購入者のテストアカウントを使って「今すぐ購入」をクリック。

購入確認画面で「今すぐ支払う」をクリック。
自動復帰を「オン」に設定していれば次の画面に遷移します。

サンプルコードの画面に自動的にリダイレクトします。あとはサンプルページにダウンロードのリンクを追加すれば完了です。
PayPalから転送される文字エンコーディングとページのエンコーディングが一致していないと、商品名「ほげほげ」の部分が文字化けします(確認済み)。
ウェブペイメントの「支払いデータ転送」をオフにして購入すると、サンプルでは「取引が完了しました~」の部分しか表示されませんでした。つまり、「支払いデータ」はName/Item/Amountの部分が対応しているということです。
5.その他
これまでの設定で、ダウンロードページまでのリダイレクトは完了です。サンプルページの(X)HTMLマークアップやスタイルをきちんと直せば、ある程度使い物になると思います。
これ以外に、リダイレクトページに遷移する前に購入ユーザーがブラウザを終了させた場合に対応する「即時支払い通知(IPN)」の設定が必要ですが、それは別途エントリーしたいと思います。
PayPalの公式テスト環境「Sandbox」について(その2:「今すぐ購入」のテスト)
「PayPalの公式テスト環境「Sandbox」について(その1:アカウント作成)」の続きで、今回はテストアカウントを使って「今すぐ購入」のテストを行ってみました。
1.テストアカウントでのログイン
テストアカウントでのログインは、次の手順になります。
テストアカウントを作成した元のアカウントで「Sandboxのページ」にログイン

「Test Accounts」をクリック。

ログインしたいユーザーを選択して、「Enter Sandbox Test Site」をクリック。

ログイン用のウィンドウが開くので、同じテストアカウントでログイン。

ログインできました。
管理画面が日本語になっていない場合は、右側のドロップダウンより「日本語(Japanese)」を選択。日本語にするには、テストアカウント作成時(preconfigured accountで作成)に、「Country」から「Japan」を選択している必要があります。

テストアカウント画面は、「PayPal Sandbox」というSandboxの画面の中に本来の「PayPal」という管理画面が表示されています。

2.テストアカウントの切り替え
PayPalのテストアカウント画面右上には、右上にある元のアカウントのログアウトボタンと、その左下にテストアカウント用のログアウトボタンが表示されています。

右上の「ログアウト」をクリックすると、元アカウントのログアウトを行ってしまい、テストアカウントを切り替えるにはSandboxのログインからやり直す必要があります。テストアカウントの切り替えるには、その左下にある(テストアカウントの)「ログアウト」をクリックすると良いでしょう。
3.販売者テストアカウントで「今すぐ購入」ボタンの作成
販売者テストアカウントでログインし、管理画面で「今すぐ購入」ボタンを作ります。セッションが短いので、操作中にログアウトしてしまったら再度ログインしてください。
「決済サービス」をクリック。

「PayPal ウェブ ペイメント スタンダード」の「[今すぐ購入]ボタン」をクリック。

ステップ1で次の項目を設定します。
- ボタンタイプ:今すぐ購入
- 商品名:任意の商品名
- 商品ID:任意の商品ID
- 価格:任意の価格(税抜き)
- 通貨:JPY
- 税金:5%
ステップ2はとりあえず「PayPalにボタンを保存する」だけチェックします。保存したボタンは、ステップ1の「ボタンタイプの選択」のすぐ下にある「[保存したボタン] に移動」のリンクから選択できます。
ステップ3ではキャンセル時の遷移ページのURL、チェックアウト時の移動ページのURLを設定します。ステップ3は設定しなくても大丈夫ですが、動作確認のために設定しています。
コードが生成されました。ブログまたは手作業でテストページなどを作り、生成されたコードを貼り付けます。

4.購入者テストアカウントで「今すぐ購入」ボタンを使った購入
3項とは別のブラウザで購入ページを表示し、購入ボタンをクリック(同じブラウザでも大丈夫だと思いますが念のため)。

購入ページが表示されました。購入者テストアカウントでログインします。
購入内容を確認して「今すぐ支払う」をクリックします。STEP3でうっかり設定していたメッセージボックス「売り手への特別な指示を追加:」は赤枠部分に表示されています。
購入が完了しました。「勇次郎 荒木's Test Storeに戻る」に、STEP3で入力したチェックアウト時のリンクが設定されていました。
5.取引の確認
取引が正常に行われたことを確認します。まず、販売者の「マイアカウント」をクリックすると取引が行われたことが分かります。
次に、購入者の「マイアカウント」をクリックすると取引が行われたことが分かります。
メール送信内容を確認するには、Sandboxの「Test Email」をクリック。

販売者へのメールと購入者へのメールが送信されています。リンクをクリックすればメールの内容も確認できます。
6.チェックアウト時の移動ページ
チェックアウト時の移動ページ(「勇次郎 荒木's Test Storeに戻る」をクリック)は次のようになります。
このページはPayPalで提供されている以下のURLにあるPHPのサンプルを利用しています。このページはPayPalにログインしていないと表示されません。あしからず。
なお今回の動作確認では、このサンプルは正常に動作していません。
管理画面の設定変更とこのサンプルを組み合わせることで、ダウンロードページにリダイレクトできるようです。それについては別途エントリーしたいと思います。
PayPalの公式テスト環境「Sandbox」について(その1:アカウント作成)
PayPalを使って購入や支払いなどの動作確認を行いたいケースがあると思いますが、テストのために金銭のやり取りを実際に行うのは好ましくありません。
ということで、PayPalのSandboxの利用方法について紹介します。Sandboxは、実際には金銭のやり取りが行われない点を除き、運用サイトと同じ動作確認が行えるテスト環境です。Facebookの「テストユーザー」を使ったことがある人であればイメージがつかみやすいのではないかと思います。
Sandboxの利用にあたって、大きく次の3つの作業があります。本エントリーでは1と2について紹介します(2のアカウント作成の説明がかなり長いです)。3については別途エントリーしたいと思います。
- Sandboxへのアカウント登録
- テストアカウントの作成
- 購入ボタンを使ったテスト
1.Sandboxへのアカウント登録
Sandboxのページにアクセスして「Sign Up Now」をクリック。
全ての項目を入力して「Agree and Submit」をクリック。「Do not use your PayPal account login email.」とあり、PayPalの本来のアカウントのメールアドレスは使用できません。
「Sandbox Signup Complete」という画面になり、入力したメールアドレスに確認用のメールが送信されます。
受信した確認用メール本文に掲載されているURLをクリックし、「You have successfully comfirmed your account. Enter your username and your password to log in.」というメッセージが表示がされればアカウント作成完了です。なお、クリックした直後はこのメッセージが表示されなかったように記憶しているので、表示されない場合は少し待ってみてください。
これでSandboxが利用できる状態になりました。次にテストアカウントを作成します。テストアカウントは250まで作れます。
2.テストアカウントの作成(半自動)
まず、テストアカウントを簡単に作成する方法を紹介します。登録したアカウントでSandboxにログインし、「Test Accounts」の「preconfigured account」をクリック。
次の各項目を入力して「Create Account」をクリック。
- Country:国を選択
- Account Type:Buyer/Seller/Website Payments Proの3種類から選択。ここでは「Seller」を選択
- Login Email:テストアカウントのメールアドレス。登録後、ここに入力したメールアドレスの後方に任意の数字が付与されます
- Password:パスワード。初期値が設定されていますが、適宜変更して構いません
- Add Credit Card:クレジットカードの種類を選択
- Add Bank Account:銀行アカウント追加を選択。ここでは「Yes」を選択
- Account Balance:任意の残高を設定。最大9999まで設定できるようです
登録が完了すると、「Test Accoounts」の一覧に追加されます。メールアドレスはPayPalの画面にログインするためだけのダミーデータです。クレジットカード情報もすべてダミーです。
3.テストアカウントの作成(手動)
2項の方法では日本語アカウント名など設定ができないので、手動でテストアカウントを作成する方法を紹介します。
登録したアカウントでSandboxにログインし、「manually」をクリック。
ウィンドウが開くので、「Your country or region」から「Japan」を選択したあと、セレクトボックス以外の部分をクリック(カーソルがセレクトボックスにあたりっぱなしだと日本語画面に切り替わらないため)。
表示が日本語に切り替わります。切り替わったら、販売者となるアカウントの種別を選択します。ここでは「プレミア」の「開始」をクリックします。
販売者となるテストアカウントの項目を入力して「同意して、アカウントを作成」をクリックします。メールアドレス含め、すべての項目はダミーの内容で構いません。生年月日は18歳以上になるように指定しないとエラーになります。
他のユーザーが使っているメールアドレスを指定すると、次の画面で「お客様はこのメールアドレスを登録したPayPalアカウントをすでにお持ちです。」というメッセージが表示されます。メッセージではパスワード入力を促していますが、入力してもエラーになるだけなので、ひとつ前の画面に戻って別のメールアドレスで作り直してください。
次にクレジットカード情報を入力しますが、この画面ではダミーデータを受け付けてくれないようです。試しに正式なデータを入力したところ認証されました。ただし、販売者と購入者という複数のアカウントに同じクレジットカード情報は設定できない(エラーになる)ので、2項のようにダミーの情報を設定したいところです。
色々調べたところ、画面左下の「マイアカウントに移動」のリンクをクリックして作業を続けることで、ダミーのクレジットカードデータが登録可能なことがわかりましたので、そのリンクをクリックしてください。その他のデータの登録はひとつ前の画面ですべて終わっているので、手順から横にそれても問題ありません。
「個人設定」の「クレジットカードの登録または編集」をクリック。
クレジットカード情報にすでにダミーの値が入っているので、有効期限のみを先の年月に変更し、他はそのままの状態で「カードの登録」をクリック。
クレジットカード情報が追加されました。
同様の手順で、今度は購入者のアカウントを作成してください。
4.テストアカウント一覧
Sandmoxの左メニューにある「Test Accounts」をクリックすればテストアカウント一覧が表示されます。
「Log-in Email」欄には、作成時に選択したタイプによって「Personal(Buyerを選択)」「Business(Seller/Website Payments Proを選択)」「Premier」などになります。Personalでは「Negative Test Mode」欄がN/Aになります。「Negative Test Mode」はエラーを発生する場合にenableにするので、購入者には不要という意味だと思います。
3項の手順で作成したテストアカウント(下の2つ)は「Unverified」となるようです。また、「Negative Test Mode」欄と「Reset」欄もN/Aとなっているため、設定が完全でないのかもしれません。
なお、Sandboxのヘルプページ(アカウント登録しないと参照不可)には、クレジットと銀行口座の設定がないと認証されないような記載もあるのでその辺りが問題なのかもしれません。