プロジェクトでは PHP で PayPal 支払いを使用する必要があります。
まず、Paypal について文句を言いましょう。私は以前にいくつかの国内決済インターフェースを担当したことがあり、ある程度の経験があります。思い浮かぶのは、PayPal カスタマー サービスに直接行って、インターフェイスのドキュメントを要求することです。
Nimajia Paypal カスタマー サービス QQ はオンラインではありません。数日間こんな感じでした。これほど高額な支払いに技術サポートがないというのは本当に不可解です。公式サイトで7と8を検索して文書を見つけました。
テキスト:
まず、サンドボックス環境でメインアカウントを申請する必要があります。接続: https://developer.paypal.com/
お申し込み後、メインアカウントでログインして販売者と購入者のアカウントを申請してください。次に、いくつかの設定を行います。
注: 購入者が海外の場合、購入者アカウントを作成するときに国を設定する必要があります。このようにして、インターフェイスは支払いページにその国の言語で表示されます。
アカウントの申請と設定の問題については、リンク: https://www.paypal-biz.com/development/documentation/PayPal_Sandbox_Guide_CN_V2.0.pdf を参照してください。
支払いプロセスの最初のステップは、もちろん郵送でフォームを PayPal に送信することです。
<span style="color: #0000ff;"><span style="color: #800000;">form </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="form_starPay"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="form_starPay"</span><span style="color: #ff0000;"> action</span><span style="color: #0000ff;">="https://www.sandbox.paypal.com/cgi-bin/webscr"</span><span style="color: #ff0000;"> method</span><span style="color: #0000ff;">="post"</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="hidden"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="cmd"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="_xclick"</span><span style="color: #0000ff;">></span> //告诉paypal该表单是立即购买 <span style="color: #0000ff;"><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="hidden"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="business"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="XXXXXX@XXXXX.com"</span><span style="color: #0000ff;">></span> //卖家帐号 也就是收钱的帐号 <span style="color: #0000ff;"><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="hidden"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="item_name"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="name"</span><span style="color: #0000ff;">></span> //商品名称 <span style="color: #0000ff;"><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="hidden"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="amount"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="10000"</span><span style="color: #0000ff;">></span> //价格 <span style="color: #0000ff;"><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="hidden"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="currency_code"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="JPY"</span><span style="color: #0000ff;">></span> //币种 <span style="color: #0000ff;"><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="hidden"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="return"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="http://localhost/frontend/pay/PDT_order"</span><span style="color: #0000ff;">> //支付成功后网页跳转地址</span> <span style="color: #0000ff;"><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="hidden"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="notify_url"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="http://localhost/frontend/pay/IPN_Order"</span><span style="color: #0000ff;">> </span>//支付成功后paypal后台发送订单通知地址<br><span style="color: #0000ff;"><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="hidden"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="invoice"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">=""</span><span style="color: #0000ff;">> //自定义订单号 paypal原样返回<br></span><span style="color: #0000ff;"><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="hidden"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="custom"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">=""</span><span style="color: #0000ff;">></span><span style="line-height: 1.5;"> // 自定义变量 paypal原样返回<br></span><span style="color: #0000ff;"><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="hidden"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="lc"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="JP"</span><span style="color: #0000ff;">></span><span style="line-height: 1.5;"> //支付页面语言设置<br></span><span style="color: #0000ff;"><span style="color: #800000;">input </span><span style="color: #ff0000;">style</span><span style="color: #0000ff;">="visibility:hidden"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="image"</span><span style="color: #ff0000;"> src</span><span style="color: #0000ff;">=" https://www.paypal.com/en_US/i/btn/btn_buynow_LG.gif "</span><span style="color: #ff0000;"> border</span><span style="color: #0000ff;">="0"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="submit"</span><span style="color: #ff0000;"> alt</span><span style="color: #0000ff;">=" PayPal - The safer, easier way to pay online"</span><span style="color: #0000ff;">>//支付按钮<br><br></span><span style="color: #0000ff;"></span><span style="color: #800000;">form</span><span style="color: #0000ff;">></span></span></span></span></span></span></span></span></span></span></span></span></span>
支払いが成功すると、PayPal は設定した「返送」アドレスにジャンプし、get メソッドを通じてシリアル番号を取得します。シリアル番号キー名「tx」。
シリアル番号を取得し、ID 変数と cmd 変数を追加して PayPal にアクセスし、支払ったばかりの注文の取引内容を要求します。
例: cmd=_notify-synch&tx=123sflsfjlw12&tx_token=fsfljvw3lwejloj43jfvdflf2
cmd=_notify-synch は Paypal に何をしたいかを伝えます。ここでは注文トランザクションをクエリすることです。
tx_token 値は Paypal バックエンドで取得する必要があります。アカウントを登録するときは、pdt 機能を有効にする必要があります。
このプロセスは PayPal によって呼び出されます: PDT (Payment Data Transfer)。
返されたデータの一部を受け取った後、金貨の発行や発送などの後払い操作を実行できます。
pdt 詳細な戻りパラメータは最後に記載されています。
コード:
<span style="color: #000000;">php </span><span style="color: #008000;">//</span><span style="color: #008000;">获取 PayPal 交易流水号 tx </span> <span style="color: #800080;">$tx_token</span> = <span style="color: #800080;">$_GET</span>['tx'<span style="color: #000000;">]; </span><span style="color: #008000;">//</span><span style="color: #008000;">定义您的身份标记 </span> <span style="color: #800080;">$auth_token</span> = "CHANGE-TO-YOUR-TOKEN"<span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;">形成验证字符串 </span> <span style="color: #800080;">$req</span> = " cmd=_notify-synch&tx=<span style="color: #800080;">$tx_token</span>&at=<span style="color: #800080;">$auth_token</span>"<span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;">将交易流水号及身份标记返回 PayPal 验证 </span> <span style="color: #800080;">$header</span> .= "POST /cgi-bin/webscr HTTP/1.0\r\n"<span style="color: #000000;">; </span><span style="color: #800080;">$header</span> .= "Content-Type: application/x-www-form-urlencoded\r\n"<span style="color: #000000;">; </span><span style="color: #800080;">$header</span> .= "Content-Length: " . <span style="color: #008080;">strlen</span>(<span style="color: #800080;">$req</span>) . "\r\n\r\n"<span style="color: #000000;">; </span><span style="color: #800080;">$fp</span> = <span style="color: #008080;">fsockopen</span> ('www.paypal.com', 80, <span style="color: #800080;">$errno</span>, <span style="color: #800080;">$errstr</span>, 30<span style="color: #000000;">); </span><span style="color: #0000ff;">if</span> (!<span style="color: #800080;">$fp</span><span style="color: #000000;">) { </span><span style="color: #008000;">//</span><span style="color: #008000;"> HTTP ERROR </span> } <span style="color: #0000ff;">else</span><span style="color: #000000;"> { </span><span style="color: #008080;">fputs</span> (<span style="color: #800080;">$fp</span>, <span style="color: #800080;">$header</span> . <span style="color: #800080;">$req</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;">获取返回数据 </span> <span style="color: #800080;">$res</span> = ''<span style="color: #000000;">; </span><span style="color: #800080;">$headerdone</span> = <span style="color: #0000ff;">false</span><span style="color: #000000;">; </span><span style="color: #0000ff;">while</span> (!<span style="color: #008080;">feof</span>(<span style="color: #800080;">$fp</span><span style="color: #000000;">)) { </span><span style="color: #800080;">$line</span> = <span style="color: #008080;">fgets</span> (<span style="color: #800080;">$fp</span>, 1024<span style="color: #000000;">); </span><span style="color: #0000ff;">if</span> (<span style="color: #008080;">strcmp</span>(<span style="color: #800080;">$line</span>, "\r\n") == 0<span style="color: #000000;">) { </span><span style="color: #008000;">//</span><span style="color: #008000;">获取头 </span> <span style="color: #800080;">$headerdone</span> = <span style="color: #0000ff;">true</span><span style="color: #000000;">; }</span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> (<span style="color: #800080;">$headerdone</span><span style="color: #000000;">){ </span><span style="color: #008000;">//</span><span style="color: #008000;">获取主体内容 </span> <span style="color: #800080;">$res</span> .= <span style="color: #800080;">$line</span><span style="color: #000000;">; } } </span><span style="color: #008000;">//</span><span style="color: #008000;">解析获取内容 </span> <span style="color: #800080;">$lines</span> = <span style="color: #008080;">explode</span>("\n", <span style="color: #800080;">$res</span><span style="color: #000000;">); </span><span style="color: #800080;">$keyarray</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">(); </span><span style="color: #0000ff;">if</span> (<span style="color: #008080;">strcmp</span> (<span style="color: #800080;">$lines</span>[0], "SUCCESS") == 0<span style="color: #000000;">) { </span><span style="color: #0000ff;">for</span> (<span style="color: #800080;">$i</span>=1; <span style="color: #800080;">$i</span>count(<span style="color: #800080;">$lines</span>);<span style="color: #800080;">$i</span>++<span style="color: #000000;">){ </span><span style="color: #0000ff;">list</span>(<span style="color: #800080;">$key</span>,<span style="color: #800080;">$val</span>) = <span style="color: #008080;">explode</span>("=", <span style="color: #800080;">$lines</span>[<span style="color: #800080;">$i</span><span style="color: #000000;">]); </span><span style="color: #800080;">$keyarray</span>[<span style="color: #008080;">urldecode</span>(<span style="color: #800080;">$key</span>)] = <span style="color: #008080;">urldecode</span>(<span style="color: #800080;">$val</span><span style="color: #000000;">); } </span><span style="color: #008000;">//</span><span style="color: #008000;">检查交易付款状态 payment_status 是否为 „Completed‟ //检查交易流水号 txn_id 是否已经被处理过 //检查接收 EMAIL receiver_email 是否为您的 PayPal 中已经注册的 EMAIL //检查金额 mc_gross 是否正确 //…… //处理此次付款明细 //该付款明细所有变量可参考: //https://www.paypal.com/IntegrationCenter/ic_ipn-pdt-variable-reference.html </span> <span style="color: #800080;">$name</span> = <span style="color: #800080;">$keyarray</span>['first_name'] . ' ' . <span style="color: #800080;">$keyarray</span>['last_name'<span style="color: #000000;">]; </span><span style="color: #800080;">$itemname</span> = <span style="color: #800080;">$keyarray</span>['item_name'<span style="color: #000000;">]; </span><span style="color: #800080;">$amount</span> = <span style="color: #800080;">$keyarray</span>['mc_gross'<span style="color: #000000;">]; </span><span style="color: #0000ff;">echo</span> ("<p></p><h3>Thank you for you purchase!</h3>"<span style="color: #000000;">); </span><span style="color: #0000ff;">echo</span> ("<b>Payment Details:</b><br>\n"<span style="color: #000000;">); </span><span style="color: #0000ff;">echo</span> ("
ユーザーがブラウザを閉じて注文が通知されないことを防ぐため。 PayPal は次の通知方法も提供しています: IPN (インスタント支払い通知インスタント支払い通知);
IPN はバックグラウンドでの HTTP リクエスト通知です。
ipn 機能が有効になって注文ステータスが変化すると、paypal は支払いフォームの変数「notify_url」で指定されたアドレスを積極的に要求します。
PayPal リクエストを受信したら、すべてのデータを取得する必要があります。
次に、「cmd=_notify-validate」を使用してデータを追加し、リクエストの偽造を防ぐために検証のために http を paypal に送信します。
コード:
<span style="color: #000000;">php </span><span style="color: #008000;">//</span><span style="color: #008000;">从 PayPal 出读取 POST 信息同时添加变量„cmd‟ </span> <span style="color: #800080;">$req</span> = 'cmd=_notify-validate'<span style="color: #000000;">; </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$_POST</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$value</span><span style="color: #000000;">) { </span><span style="color: #800080;">$value</span> = <span style="color: #008080;">urlencode</span>(<span style="color: #008080;">stripslashes</span>(<span style="color: #800080;">$value</span><span style="color: #000000;">)); </span><span style="color: #800080;">$req</span> .= "&<span style="color: #800080;">$key</span>=<span style="color: #800080;">$value</span>"<span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;">建议在此将接受到的信息记录到日志文件中以确认是否收到 IPN 信息 //将信息 POST 回给 PayPal 进行验证 </span> <span style="color: #800080;">$header</span> .= "POST /cgi-bin/webscr HTTP/1.0\r\n"<span style="color: #000000;">; </span><span style="color: #800080;">$header</span> .= "Content-Type:application/x-www-form-urlencoded\r\n"<span style="color: #000000;">; </span><span style="color: #800080;">$header</span> .= "Content-Length:" . <span style="color: #008080;">strlen</span>(<span style="color: #800080;">$req</span>) ."\r\n\r\n"<span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;">在 Sandbox 情况下,设置: //$fp = fsockopen(„www.sandbox.paypal.com‟,80,$errno,$errstr,30); </span> <span style="color: #800080;">$fp</span> = <span style="color: #008080;">fsockopen</span> ('www.paypal.com', 80, <span style="color: #800080;">$errno</span>, <span style="color: #800080;">$errstr</span>, 30<span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;">将 POST 变量记录在本地变量中 //该付款明细所有变量可参考: //https://www.paypal.com/IntegrationCenter/ic_ipn-pdt-variable-reference.html </span> <span style="color: #800080;">$item_name</span> = <span style="color: #800080;">$_POST</span>['item_name'<span style="color: #000000;">]; </span><span style="color: #800080;">$item_number</span> = <span style="color: #800080;">$_POST</span>['item_number'<span style="color: #000000;">]; </span><span style="color: #800080;">$payment_status</span> = <span style="color: #800080;">$_POST</span>['payment_status'<span style="color: #000000;">]; </span><span style="color: #800080;">$payment_amount</span> = <span style="color: #800080;">$_POST</span>['mc_gross'<span style="color: #000000;">]; </span><span style="color: #800080;">$payment_currency</span> = <span style="color: #800080;">$_POST</span>['mc_currency'<span style="color: #000000;">]; </span><span style="color: #800080;">$txn_id</span> = <span style="color: #800080;">$_POST</span>['txn_id'<span style="color: #000000;">]; </span><span style="color: #800080;">$receiver_email</span> = <span style="color: #800080;">$_POST</span>['receiver_email'<span style="color: #000000;">]; </span><span style="color: #800080;">$payer_email</span> = <span style="color: #800080;">$_POST</span>['payer_email'<span style="color: #000000;">]; </span><span style="color: #008000;">//</span><span style="color: #008000;">… //判断回复 POST 是否创建成功 </span> <span style="color: #0000ff;">if</span> (!<span style="color: #800080;">$fp</span><span style="color: #000000;">) { </span><span style="color: #008000;">//</span><span style="color: #008000;">HTTP 错误 </span> }<span style="color: #0000ff;">else</span><span style="color: #000000;"> { </span><span style="color: #008000;">//</span><span style="color: #008000;">将回复 POST 信息写入 SOCKET 端口 </span> <span style="color: #008080;">fputs</span> (<span style="color: #800080;">$fp</span>, <span style="color: #800080;">$header</span> .<span style="color: #800080;">$req</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;">开始接受 PayPal 对回复 POST 信息的认证信息 </span> <span style="color: #0000ff;">while</span> (!<span style="color: #008080;">feof</span>(<span style="color: #800080;">$fp</span><span style="color: #000000;">)) { </span><span style="color: #800080;">$res</span> = <span style="color: #008080;">fgets</span> (<span style="color: #800080;">$fp</span>, 1024<span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;">已经通过认证 </span> <span style="color: #0000ff;">if</span> (<span style="color: #008080;">strcmp</span> (<span style="color: #800080;">$res</span>, "VERIFIED") == 0<span style="color: #000000;">) { </span><span style="color: #008000;">//</span><span style="color: #008000;">检查付款状态 //检查 txn_id 是否已经处理过 //检查 receiver_email 是否是您的 PayPal 账户中的 EMAIL 地址 //检查付款金额和货币单位是否正确 //处理这次付款,包括写数据库 </span> }<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> (<span style="color: #008080;">strcmp</span> (<span style="color: #800080;">$res</span>, "INVALID") == 0<span style="color: #000000;">) { </span><span style="color: #008000;">//</span><span style="color: #008000;">未通过认证,有可能是编码错误或非法的 POST 信息 </span> <span style="color: #000000;">} } </span><span style="color: #008080;">fclose</span> (<span style="color: #800080;">$fp</span><span style="color: #000000;">); } </span>?>
インターフェイスのドッキングはこのようなもので、理解すればプロセスは非常に簡単です。
通貨が PayPal のデフォルトではない場合、注文の支払い後、注文ステータスは常に保留中になります。販売者アカウントでログインし、注文ステータスで [受信] をクリックすると、PayPal が自動的に通貨を受け取る機能を設定します。
技術文書のアドレス: https://www.paypal-biz.com/developer/documentation/2134.html