簡體   English   中英

php paypal。 在接受付款之前驗證付款的方法

[英]php paypal. A way to validate a payment before accepting the payments

有沒有辦法在paypal進行訂單之前驗證付款?

我用我自己的購物車。 當客戶點擊提交訂單時,我會在另一個頁面調用PayPalRedirect.php上重定向用戶

PayPalRedirect.php

<form name="paypalform" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_cart">
<input type="hidden" name="upload" value="1">
<input type="hidden" name="invoice" value="<? echo $idInvoice; ?>">
<input type="hidden" name="business" value="business_email@example.com">
<input type="hidden" name="notify_url" value="http://mydomain.com/catalog/IPNReceip">


 <? 
    $cpt = 1;
        foreach($ordering as $k => $v)
        {
        ?>
            <input type="hidden" name="item_name_<? echo $cpt?>" value="<? echo$v->Product->ProductNumber; ?>">
            <input type="hidden" name="quantity_<? echo $cpt?>" value="<? echo $v->Qty; ?>">
            <input type="hidden" name="amount_<? echo $cpt?>" value="<? echo $v->Price ?>"> 
            <?
            $cpt++;
        }
    ?>


<input type="hidden" name="currency_code" value="CAD">
<input type="image" src="http://www.paypal.com/en_US/i/btn/x-click-but01.gif" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
</form> 

我在頁面加載時使用此JavaScript提交表單:

<script>
document.forms.paypalform.submit(); 
</script>

這一切都沒問題。 用戶重定向到PayPal頁面,可以登錄PayPal,然后支付訂單。

我現在的問題是。 有沒有辦法讓PayPal在我這邊調用一個Web服務(例如: http//mydomain.com/ValidatePayment.php )並傳遞paypal收到的購物車的所有項目以確認價格是否正確。 如果價格不正確,我想回復PayPal付款無效並取消交易。 客戶點擊PayPow頁面的PayNow之前的所有內容。 如果有可能,我怎么能這樣做?

非常感謝

我認為不可能做你想做的事。 一旦您將客戶端發送到Paypal,他們將處理付款並在最后向您發送確認。

如果您想確保客戶支付了正確的金額,您應該檢查Paypal發送給您的確認。

您可能知道Paypal有兩種付款確認機制--PDT和IPN。

PDT依賴於客戶在付款后返回您的網站。 一旦客戶付款,Paypal將向您發送包含交易詳情的PDT消息。 您可以使用此信息向客戶顯示收據。 問題是客戶在付款后立即關閉瀏覽器。 如果發生這種情況,您可能永遠不會收到PDT消息。

IPN不依賴於客戶回到您的網站。 每次客戶付款時,Paypal都會向您發送一條IPN消息,其中包含交易詳情。

您可以使用其中一個或兩個來確認付款已完成。 您還可以檢查付款是否符合您的預期金額。

請參閱下面我在我的網站上使用的流程:

1 - 客戶按下按鈕以使用Paypal付款

2 - 我的網站將客戶端發送給Paypal,並附上交易詳情

3 - Paypal處理付款

4 - 一旦付款完成,Paypal將通過PDT消息將客戶發回我的網站。

5 - 我的網站向Paypal發送確認消息,檢查PDT消息是否合法並來自Paypal。

6 - Paypal發回一條消息,其中包含交易的所有細節,包括支付的價格。

7 - 我的網站檢查來自Paypal的確認消息,並在屏幕上顯示收據給我的客戶

8 - Paypal還會在我的賣家帳戶付款后發送IPN消息。

9 - 當我的網站收到IPN消息時,它會向Paypal發回一條消息,以確認該消息是合法的,並且源自Paypal。

10 - 我的網站然后檢查從Paypal發回的確認消息並確認付款是正確的。

請注意,在大多數情況下,我將收到來自Paypal的兩條消息(一個PDT和一個IPN)。 沒關系,因為我跟蹤每筆交易,如果我收到了已經標記為付費的交易的IPN,我只需丟棄IPN消息。

請注意,如果您收到PDT消息,則不需要IPN消息。 但是,我建議你實施這兩個,以防萬一客戶關閉他的瀏覽器,之后Paypal有機會將他送回你的網站。

在這兩條消息(PDT和IPN)中,Paypal會告訴您付款是否已清除。 您可能知道,有些付款類型在提交給Paypal后幾天才會清除。 Paypal建議您在付款清算之前不要發貨。 付款清算后,Paypal會向您發送另一條IPN消息。

我的網站上有兩個腳本 - 一個用於處理PDT消息,另一個用於處理IPN消息。 處理付款確認時,它們非常相似。 見下面的例子:

$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
    }
}

我希望這有幫助。 請隨時詢問后續問題。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM