Paypal接続

一般的に、彼らは私にPaypalを通して私たちのプロジェクトへの支払いの受け入れを組織するタスクを設定しました。 アカウントの設定に必要なすべてのデータ(アカウント自体は別の人が設定したもの)を提供し、実際には、PayPalからデータを受け取り、ユーザーにお金を請求するスクリプトを作成する必要がありました。



Habréでこのトピックに関して賢明なものは見つかりませんでした。 私はすべて自分で対処しなければなりませんでした。 以下は、これらの手続きの結果です:)



支払いの種類





Paypalでは、いくつかのタイプの支払いを受け入れることができます。 それらのいくつかを次に示します。

1. [今すぐ購入]ボタン-1つ以上の商品(サービス)を支払うための1回限りの支払い。 支払い金額、商品の説明(サービス)、商品の数量、住所、配達、購入重量などを設定できます。 支払い金額が設定されていない可能性があります。この場合、Paypalはユーザーが支払いたい金額を個別に示す機会をユーザーに与えます。

2.寄付ボタン-原則として、機能は「今すぐ購入」に似ており、1回限りの支払いでもあり、金額は強制的に設定でき、ユーザーの裁量に任されます。 違いは、配送先住所とそれに関連するすべてのものを指定できないことです(配信)。

3. [カートに追加]ボタン-Paypalの側面に商品のバスケットを作成できます。 あなたのサイトでは、ユーザーはバスケットにのみ製品を追加できます。 バスケットの内容を表示したり、そこからアイテムを削除したりするには、Paypalにログインする必要があります。

4.購読ボタン-アカウント、サービスなどの定期的な支払いの受領を整理できます。

5.私はまだギフト券を持っていますが、それを理解しようとさえしませんでした。



私の場合、理想的な解決策は「今すぐ購入」の支払いを使用することでした。これについては後で説明します。



ウェブサイトで「今すぐ購入」する方法は2つあります。

1. Paypalツールを使用してボタンを作成します。

2.独自のフォームを作成します。



個人的には、独自のデザインを使用できるという理由だけで、2番目のオプションを使用しました。 さらにいくつかの利点がありますが、それらについては後で説明します。



支払いフォームを作成する





フォームフィールドの名前を自然に厳密に規制するPaypal。 これらのフィールドの完全なリストは、 cms.paypal.com / us / cgi-bin /?&cmd = _render-content&content_ID = developer / e_howto_html_Appx_websitestandard_htmlvariablesにあります。 当社で使用されているもの:

-cmd = _xclick-「今すぐ購入」という支払い方法を指定します。

-ビジネス-ここでは、支払いが受け入れられるメール、アカウントを示します。 アドレス自体を確認する必要があります(アカウント設定のどこかで確認)。

-item_name-ここでは、製品/サービスの説明を設定します。 支払い時にPaypalに表示されます。

-カスタム-ここにサービス情報があり、ユーザーを識別するために後で必要になります。

-金額-支払い金額。

-通貨-支払い通貨。 ここで可能なオプション。

-no_shipping = 1-配信が実行されないことを示します。



アカウント設定





さらに、アカウントへの支払いを受け入れるには、それに応じてこの同じアカウントを設定する必要があります。



Paypalは、トランザクションデータをスクリプトに転送する2つの方法をサポートしています。PDT(支払いデータ転送)とIPN(即時支払い通知)です。 私が理解しているように、PaypalからPDPを使用する場合、ユーザーが支払いを行った後(つまり、ユーザーからのお金が既にアカウントに送金されている場合)、1つのメッセージが届きます。 IPNを使用すると、Paypalは複数のメッセージを生成し、支払いの個々の段階を通知します。 私の問題を解決するには、私が取り入れたPDTで十分でした。



PDTイネーブルプロセスについては、 ここで説明します 。 以下にPDTの有効化セクションがあります。



PDTの本質は、支払いが完了すると、Paypalが指定されたGET給与を指定されたスクリプトに送信し、そこでトランザクション番号、ステータス、金額などを転送することです。 Paypal自体にはトランザクション認証メカニズムがあります。特定のタイプのPOSTリクエストを、受信したトランザクション番号とともにアドレスに送信します。 応答として、エラーコードまたはトランザクションの説明(ステータス、金額、さらにはあらゆる種類のサービスデータ)が表示されます。



スクリプト操作アルゴリズム





実際、スクリプトに必要なもの:

1.このデータを取得します。

2.トランザクションのタイプを確認します-通常の支払いが使用されている場合(今すぐ購入)。 トランザクションタイプはweb_acceptでなければなりません。

3.受信者のメールアドレスと受信者のアカウントIDを確認します。 (フィールドbussiness、receiver_email、receiver_id);

4.カスタムフィールドには、たとえば、当社から受け取ったサービス情報が含まれます

ユーザーID-それをチェックしてください。

5. paypalシステムのトランザクション番号は、txn_idフィールドに含まれています。 確認する

繰り返し支払いがないように。

6.その後、フィールドpayment_status = Completeの場合、つまり お支払い

通常完了したら、他の人と一緒にすでに自宅で支払いを行います

ステータス-いくつかのトラブル。

金額と通貨はmc_grossおよびmc_currencyフィールドにあります。

PDT(およびIPNも使用)を使用するときにPaypalによって送信されるすべてのパラメーターの完全なリストはこちら



さて、先ほど約束したパンについて。 これらは、私たち自身がPaypal'yに送信するカスタムフィールドに関連しています。 もちろん、入浴せずにユーザーIDを書き込むだけでかまいませんが、簡単な方法は探していません。 このフィールドでは、システムの支払いの説明とともにレコードのIDを書き込むことができます。ユーザーはそこに保存され、ユーザーが購入したサービスの種類、金額などを覚えておいてください。 これにより、たとえば、支払われていない購入を追跡することができます。また、Paypalからデータを受信するときに、保存されているデータで確認できます。



そして最後に、小さなコード



  1. < php
  2. //この関数は、Paypal'aからトランザクションデータを受信するために使用されます
  3. //関数自体のコードはPaypalのサイトから取得されます;どこかにさまざまな言語の例があります
  4. function get_paypal_data $ tx_token、$ auth_token {
  5. $ req = 'cmd = _notify-synch' ;
  6. $必須 = "&tx = $ tx_token&at = $ auth_token" ;
  7. // PayPalシステムにポストバックして検証する
  8. $ヘッダー。 = "POST / cgi-bin / webscr HTTP / 1.0 \ r \ n " ;
  9. $ヘッダー。 = "Content-Type:application / x-www-form-urlencoded \ r \ n " ;
  10. $ヘッダー。 = "Content-Length:"strlen $ req " \ r \ n \ r \ n " ;
  11. $ fp = fsockopen 'www.paypal.com'80 、$ errno、$ errstr、 30 ;
  12. if $ fp {
  13. // HTTPエラー
  14. falseを 返し ます
  15. } else {
  16. fputs $ fp、$ header。$ req ;
  17. //本体データを読み取ります
  18. $ res = '' ;
  19. $ headerdone = false ;
  20. while feof $ fp {
  21. $ line = fgets $ fp、 1024 ;
  22. if strcmp $ line、 " \ r \ n " == 0 {
  23. //ヘッダーを読み取ります
  24. $ headerdone = true ;
  25. } elseif $ headerdone {
  26. //ヘッダーが読み込まれました。 今内容を読んで
  27. $ res。 = $行;
  28. }
  29. }
  30. }
  31. $ resを返し ます。
  32. }
  33. // GETからはトランザクションIDのみを取得します。他のすべては興味がありません。リクエストに応じてこのデータをPaypalから受け取ります
  34. $ tx = @ $ _ GET [ 'tx' ] ;
  35. if $ tx {
  36. error_log '[paypal] ERROR:Tx are absent !!!' ;
  37. falseを 返し ます
  38. }
  39. // Paypal'yリクエストを送信してトランザクションデータを受信します
  40. // PAYPAL_IDENTITY_TOKEN-PDTアクティベーション中に受け取ったトークンの定数
  41. $ res = get_paypal_data $ tx、PAYPAL_IDENTITY_TOKEN ;
  42. $履歴。 = '[paypal]リクエスト結果の投稿' 。$ tx。 " \ n " 。$ res ;
  43. if $ res {
  44. $履歴。 = '[paypal] http error for' 。$ tx ;
  45. exit ;
  46. }
  47. //パーシム応答
  48. $ strs = explode " \ n " 、$ res ;
  49. if $ strs [ 0 ] == 'FAIL' {
  50. //最初の行がFAIlの場合、何らかのトラブルを意味します
  51. //必要に応じてエラーを処理し、終了します
  52. exit ;
  53. } elseif $ strs [ 0 ] == 'SUCCESS' {
  54. //すべて問題ないようです-他のパラメータを解析します
  55. $ res_vars = array ;
  56. //キーがvarnameである配列に対するPayPalの回答を解析します
  57. for $ i = 1 ; $ i < count $ strs ; $ i ++ {
  58. $ strs [ $ i ] = trim $ strs [ $ i ] ;
  59. if $ strs [ $ i ] )が 続く ;
  60. $ vars = explode '=' 、$ strs [ $ i ] ;
  61. if $ vars || count $ vars = 2 {
  62. //何らかのトラブル-次のパラメーターに進みます
  63. 続ける ;
  64. }
  65. $ res_vars [ $ vars [ 0 ] ] = $ vars [ 1 ] ;
  66. }
  67. //結果として、res_vars配列にすべてのトランザクションパラメータがあります
  68. // txn_typeフィールド-トランザクションのタイプが含まれます。 興味があるのはweb_acceptのみです
  69. switch $ res_vars [ 'txn_type' ] {
  70. ケース 'web_accept'
  71. //ここで、他のすべてのフィールドをチェックします:bussiness、receiver_id ...
  72. //必要に応じて、カスタムフィールドを解析します
  73. //すべてが正常であれば、支払いステータスを確認します
  74. switch @ $ res_vars [ 'payment_status' ] {
  75. ケース 「完了」
  76. //すべては問題ありません-ユーザーに商品を送り、仮想アカウントにお金を請求します。
  77. 休憩 ;
  78. }
  79. 休憩 ;
  80. }
  81. }
  82. >



All Articles