私はあなたがやりたいことが可能であるとは思いません。クライアントをPaypalに送ると、支払いを処理し、最後に確認を送信します。
お客様が正しい金額を支払っていることを確認したい場合は、Paypalから送付された確認を確認する必要があります。
おそらくあなたが知っているように、ペイパルは2つの決済確認メカニズム、PDTとIPNを持っています。
PDTは支払い後にお客様のウェブサイトに戻ってくるクライアントに依存しています。クライアントが支払いを行うと、Paypalは取引の詳細を含むPDTメッセージを送信します。この情報は、クライアントに領収書を表示するために使用できる情報です。問題は、支払いを行った直後にクライアントがブラウザを閉じる場合です。その場合は、PDTメッセージを受け取ることはできません。
IPNはお客様のウェブサイトに戻ってくるクライアントに依存しません。クライアントが支払いを行うたびに、Paypalは取引の詳細を含むIPNメッセージをお客様に送信します。
いずれかまたは両方を使用して、支払いが完了したことを確認できます。また、あなたが期待していた金額に対して支払いが行われたことを確認することもできます。
私は私のウェブサイト上で使用する流れの下を参照してください:
1 - クライアントがペイパル
2で支払いを行うためにボタンを押す - 私のウェブサイトは、トランザクション
の詳細をPayPalにクライアントを送信3 - Paypalがお支払いを処理します
4 - 支払いが完了すると、PaypalはPDTメッセージでクライアントを私のウェブサイトに送り返します。
5 - 私のウェブサイトは、PDTメッセージが正当であり、Paypalから来たことを確認するために、Paypalに確認メッセージを送信します。
6 - Paypalは、支払われた価格を含む取引のすべての詳細を含むメッセージを送り返します。
7 - 私のウェブサイトはPaypalからの確認メッセージをチェックし、私のクライアントに
8を画面上に領収書を示して - 支払いは私の売り手の口座に行われた後ペイパルはまた、IPNメッセージを送信します。
9 - 私のウェブサイトがIPNメッセージを受信すると、メッセージがPaypalに送信され、メッセージが正当であり、Paypalから発信されたことを確認します。
10 - 私のウェブサイトは、Paypalから返送された確認メッセージを確認し、支払いが正しいことを確認します。
ほとんどの場合、私はPaypalから2つのメッセージ(1つのPDTと1つのIPN)を受け取ることに注意してください。私は各取引を追跡し、すでに支払済としてマークされている取引のためにIPNを受け取った場合は、単にIPNメッセージを破棄するだけでOKです。
PDTメッセージを受信した場合、実際にはIPNメッセージは必要ありません。しかし、私はあなたがPaypalがあなたのウェブサイトに彼を送り返す機会を得る前にクライアントが彼のブラウザを閉じる場合にのみ両方を実装することをお勧めします。
両方のメッセージ(PDTとIPN)で、支払いがクリアされたかどうかは、Paypalから通知されます。あなたが知っているように、Paypalに提出されてから数日後までは、支払い方法の一部がクリアされません。 Paypalは支払いが完了するまで商品を発送しないことを推奨しています。支払いがクリアされると、Paypalから別のIPNメッセージを送信します。
自分のウェブサイトには、PDTメッセージを処理するスクリプトとIPNメッセージを処理するスクリプトの2つのスクリプトがあります。支払い確認を処理する際には非常に似ています。下記の例を参照してください。
$req = 'cmd=_notify-synch';
$tx_token = $_GET['tx'];
$auth_token = "enter your own authorization token";
$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 ('http://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
// replace www.sandbox.paypal.com with www.paypal.com when you go live
$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);
}
$firstname = $keyarray['first_name'];
$lastname = $keyarray['last_name'];
$itemname = $keyarray['item_name'];
$amount = $keyarray['payment_gross'];
$invoiceid = $keyarray['invoice'];
$profileid = $keyarray['subscr_id'];
// 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
// show receipt to client
}
}
私はこれが役立つことを望みます。フォローアップの質問をしてください。
幸運を祈る!
あなたのロジックがエスケープすると、私はトランザクションを実行してトランザクションを検証しますか? –
私の英語はVErrry verry悪いです、それは問題かもしれません。再開。私はちょうど誰もpaypalに掲示する前に項目価格の価値を変えることができないようにしたいと思う。私がそれを防ぐ方法は、顧客がPayPal側でPayNowをクリックしたとき、Paypalが私のウェブサイトに電話して、受け取った商品を私に渡して、「はい、すべての商品価格または「価格が正しくない」と表示されます。私が否定的な意見を送った場合、私は取引を停止したいと思います。 –
Paypalは、Paypalから支払い確認を受け取ったときに正しい金額が支払われたことを確認することをお勧めします。下の私の答えを見てください。また、お支払い金額を確認するだけでなく、お支払いがクリアされているかどうかも確認する必要があります。ペイパルはまた、支払いが決済されたか保留中であるかの情報をお客様に送信します。 – jdias