デベロッパー向けPayPalおよびIPNの概要


ウェブサイトでクレジットカードによる支払いに対応するためのマーチャントアカウントの申請を求めるスパムのため、受信トレイがいっぱいになっています。どのような場合に、PayPalに加えて、マーチャントアカウントが必要になりますか?

ウェブサイトで電子決済に対応する場合は、PayPalが最良のパートナーとなります。PayPalの営業スタッフに連絡する必要はなく、特別なソフトウェアの購入やインストールも不要です。必要なのはPayPalアカウントと、基本的なHTMLの知識とウェブ作成技術だけです。PayPalを決済ソリューションとして使用し、複雑な決済処理はすべてPayPalに任せることができます。

どのウェブサイトでも、PayPalマーチャントサービスを使って支払いの回収を開始できます。簡単なウェブフォームに情報を入力するだけで、各ウェブサイトに挿入可能なボタンがPayPalから提供されます。このボタンを使って、支払いを回収します。プログラミングは不要です。これは「ウェブ受諾」と呼ばれるPayPalマーチャントサービスのコンポーネントです。

PayPalのウェブ受諾ウィザード

ウェブ受諾は単体で機能しますが、PayPalマーチャントサービスのもう1つのコンポーネント「即時支払い通知」(IPN)と併用することでさらに効果が高まります。IPNを併用すると、ウェブサイトでPayPalを介して資金を回収する際に、処理されたすべての決済がリアルタイムでサーバーに通知されるようになります。マーチャント側で記録、処理、および取引履行をおこなう必要のある決済詳細がすべて、簡単なCGIを介してPayPalから各サーバーに送信されます。

PayPalの即時支払い通知

ウェブ受諾と即時支払い通知を併用することで、PayPalは真に使いやすい価値あるウェブサービスとしての機能を提供します。ユーザーからの支払いは直接お客さまのPayPalアカウントに入金され、資金が仲介業者を経由することはありません。PayPalが、必要に応じてお客さまに代わって発送情報を収集します。また、組織の状況に合わせて決済処理の自動化レベルを調整することができます。最初は簡単な決済プロセスから始めて、ビジネスの成長に合わせて徐々にPayPalの機能とサービスを追加統合していくことができます。

まず、PayPalのウェブ受諾ウィザードを実行して、生成されるHTMLをコピーするのが、最も簡単な方法です。それから、各サイトのニーズに合わせて手動またはプログラムでHTMLを変更します。このプロセスの手順の例を以下に示します。注: この例は、すでにウェブサイトが稼働状態にあり、PayPalアカウントが開設済みであることを前提としています。

ある商品(doodad)を製造していて、個人のウェブサイトでPayPalを使ってこの商品の販売を開始する場合を例とします。最初にPayPalのウェブ受諾フォームを使って,商品の詳細を入力します。その後、PayPalから自分のウェブサイト用に、以下のHTMLコードが提供されます。

<!-- Begin PayPal Logo -->
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="alanb@alanb.com">
<input type="hidden" name="undefined_quantity" value="1">
<input type="hidden" name="item_name" value="doodad from alanb.com">
<input type="hidden" name="item_number" value="dd01">
<input type="hidden" name="amount" value="4.99">
<input type="hidden" name="return" value="http://alanb.com/doodads/thanks.html">
<input type="hidden" name="cancel_return" value="http://alanb.com/doodads/canceled.html">
<input type="image" border="0" name="submit" src="http://images.paypal.com/images/x-click-but5.gif" alt="PayPalを使った支払いは迅速、無料、安全">
</form>
<!-- End PayPal Logo -->

ここで、ビジネス(business)の変数には、各自のPayPalアカウントを示すメールアドレスを指定します。必要に応じて、商品名(item name)、商品番号(item number)、金額(価格)(amount)を変更できます。

このフォームには、returnとcancel_returnという2つのURLも含まれています。これらを使用して、ユーザーがPayPal取引の完了後またはキャンセル後に各ウェブサイトに戻すことができます。この例として、thanks.htmlとcanceled.htmlという2つのウェブページを作成しました。

この時点で、作業を終了し、HTMLをウェブページに追加して商品(doodad)の注文受付を開始できます。ユーザーがPayPalボタンをクリックして商品(doodad)を購入する度に、PayPalから取引詳細と顧客の連絡先情報がメールで配信されます。ここで、顧客データと取引データが自分のデータベースに自動入力されるようにしてみます。上記のHTMLブロックを簡単に拡張して、すべての取引の発生時に自分のウェブサーバーに通知されるように設定できます。HTMLフォームに、下記の非表示入力フィールドを1つ追加するだけです。

<input type="hidden" name="notify_url" value="http://alanb.com/doodads/notify.cgi">

これで、PayPalのサーバーが各CGIスクリプトnotify.cgiを呼び出し、各商品(doodad)の注文時に毎回詳細が送信されるようになります。これが、即時支払い通知です。PayPalはHTTP POSTメソッドを使用して取引詳細をnotify.cgiに送信します。 その後、notify.cgiがその取引データをPayPalにエコーバックし、支払いが有効であることを確認します。このシンプルな例では、その後、notify.cgiにより決済情報をログファイルに記録されます。 PayPalはnotify.cgiからの特定の応答コードを必要としないため、"foo"というテキストを出力してHTTP通信を停止します。

以下は、即時PayPal通知を使用するように変更し、多少の編集を加えたHTML PayPalボタンです。

<!-- Begin PayPal Button -->
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="alanb@alanb.com">
<input type="hidden" name="undefined_quantity" value="1">
<input type="hidden" name="item_name" value="doodad from alanb.com">
<input type="hidden" name="item_number" value="dd01">
<input type="hidden" name="amount" value="1.99">
<input type="hidden" name="return">
value="http://alanb.com/doodads/thanks.cgi">
<input type="hidden" name="cancel_return">
value="http://alanb.com/doodads/canceled.html">
<input type="hidden" name="notify_url" value="http://alanb.com/doodads/notify.cgi">
<input type="image" border="0" name="submit" src="http://images.paypal.com/images/x-click-but5.gif" alt="PayPalで小物を購入する">
</form>
<!-- End PayPal Button -->

And here is a simple Python script, notify.cgi:

#!/usr/local/bin/python

# notify.cgi -- CGI script that receives PayPal instant payment notifications
# Alan Braverman
# 2001/11/27

import sys, time, urllib

def confirmPayment():
"Ask PayPal to confirm this payment, return status and detail strings"
paymentDetails = sys.stdin.read() # formatted as a CGI query
confirmPostData = paymentDetails + '&cmd=_notify-validate'
confirmPostRequest = urllib.urlopen(
'http://www.paypal.com/cgi-bin/webscr', confirmPostData)
paymentStatus = confirmPostRequest.read() # either VERIFIED or INVALID
return paymentStatus, paymentDetails

def logPayment(paymentStatus, paymentDetails):
"Write payment status and details to a log file"
logFile = open('payments.log', 'a')
logFile.write('%s %s %s\n' % (
time.ctime(time.time()), paymentStatus, paymentDetails))
logFile.close()

def sendResponse():
"Send a simple HTTP response back to PayPal"
print 'Content-type: text/plain\n\nfoo'

def main(argc, argv):
"Process PayPal Instant Payment Notification CGI call"
paymentStatus, paymentDetails = confirmPayment()
logPayment(paymentStatus, paymentDetails)
sendResponse()

if __name__ == "__main__":
main(len(sys.argv), sys.argv)

もちろん、ログファイルへの記録だけでなく、データベースへの書き込みや、注文の自動処理と製品・サービスの発送など、この概念をさまざまな方法で拡張できます。 PayPalインターフェイスのルーチンはシンプルなものとし、注文の集荷とフルフィルメントには別のプロセスを使用することを推奨します。CGIスクリプトにバグがある場合は、取引が失われることがあります。ただし、スクリプトが各決済を確認するまでは、PayPalが引き続き通知を試行します。簡単な例を試して、アクセスログでPayPalからのアクセスを確認できます。同様に、スクリプトで一意の取引を繰り返しの取引と区別できるようにすると、より適切な方法でエラーから回復できるようになります。

ユーザーが取引を完了すると、PayPalが各リターンURLに取引詳細を送信します。ここで、thanks.htmlをthanks.cgiスクリプトに置き換えてみました。この例では、thanks.cgiは単にユーザーをthanks.htmlにリダイレクトします。 これを拡張して、"thanks"ページの注文詳細を使用してオンライン受領書やその他の情報を生成するようにもできます。

次に、もう1つ簡単なPythonスクリプトのthanks.cgiを示します。

#!/usr/local/bin/python

def main():
print 'Content-type: text/plain'
print 'Status: 302'
print 'Location: http://alanb.com/doodads/thanks.html'
print

if __name__ == "__main__":
main()

このトピックでは、取引データの詳細については説明しません。PayPalのウェブサイトの即時支払い通知の変数の表を参照してください。

PayPalから支払いの完了またはキャンセルの通知があった場合は、各自適切な方法で対処してください。 ただし、PayPalから支払いのステータスが「未決済」であるという通知を受けることがあります。未決済の場合、対処が多少複雑になり、PayPalからも限られたサポートしか提供されません。未決済の支払いに関するPayPalのIPNドキュメントによると、支払い処理の開始時に一度マーチャントのサーバーに通知があり、支払いのステータスが「未決済」から「完了」に変わった時点で2度目の通知があります。

CGIスクリプトのデバッグが難しいことは、プログラマの間では周知の事実です。あいにく、PayPalでは本人宛に支払いを処理することを許可していません。エンドツーエンドの製品フローを検証するには、テスト用の商品を作成し、友人や知り合いの協力を得てデバッグを試すことが必要となることがあります。協力してくれるデベロッパーとチームを組んでPayPalテストをおこなってください。

例証用のdoodadのサイトはhttp://alanb.com/doodadsで稼働していますので、ここで商品(doodad)を購入してみることで、買い手側の動作を確認できます。 実際には何も発送しませんが、このdoodadはお得な価格に設定してあります。


免責:次の各記事の内容はそれぞれの筆者が提供したものであり、PayPal, Inc.およびそのアフィリエイトまたは子会社によるものではありません。記事の内容に誤りがある場合がありますが、PayPal は記事の内容に関して保証も支持も行いません。質問、テクニカルサポート情報、保証やライセンスなどについては、必要に応じて記事の筆者にお問い合わせいただくようお願いします。記事の内容の信頼性については、ご自身の責任で判断してください。記事の内容を信頼した結果、エラー、被害、その他の損害(偶発的、例外的、間接的、または必然的な損害を含む)が発生した場合、PayPal はいっさい責任を負いません。PayPal は、この記事内容およびその利用について、一切の保証を否認いたします。