PayPalでダウンロード販売する方法

PayPalでダウンロード販売する方法

Posted at September 6,2011 1:55 AM
Tag:[PayPal]

PayPalのPayPalの「今すぐ購入」や「ショッピングカート」の決済後にダウンロードページなど、任意のページにリダイレクトする方法を紹介します。この方法を使えば、PayPalでダウンロード販売が行えます。

ここではPayPalの公式テストサイト「Sandbox」と「今すぐ購入」ボタンを使って紹介します。本番環境でも一部のURLを書き換えることで利用可能です。

1.ウェブサイトの設定

決済後に任意のページにリダイレクトさせるには、管理画面の「ウェブサイトの設定」を変更します。

「今すぐ購入」ボタンや「ショッピングカート」を提供するユーザーのPayPal管理画面で「個人設定」をクリック。マウスをポイントするとサブメニューが表示されますが無視してください。

PayPal管理画面

「販売ツール」→「ウェブサイトの設定」の右側にある「更新」をクリック。

ウェブサイトの設定

移動先の画面で次の項目を設定します。

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

個人設定

保存すると「IDトークン」が表示されます。

個人設定(保存後)

この「IDトークン」は一度保存すると「支払いデータ転送」の項目に常に表示されるようです。

個人設定(保存後)

2.文字コードの変更

決済後にリダイレクト先のページに転送する情報の文字コードを、リダイレクト先のページを提供するブログなどの文字コードに合わせます。

「個人設定」をクリック。

PayPal管理画面

ページ下にある「PayPalボタンの言語コード化」をクリック。

PayPalボタンの言語コード化

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

言語のエンコード

今回ウェブサイトで使用している文字エンコーディングは「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&lt;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)」の設定が必要ですが、それは別途エントリーしたいと思います。

2013.12.21
PayPalのレイアウト変更により本文の説明を修正しました。

関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)