3

これまでペイパルの統合を行ったことはありませんが、他のゲートウェイを使用したことがあります。

他のゲートウェイでは、フォーム ポストでも送信されるハッシュがあります。これにより、データの改ざん、つまり金額の変更が防止されます。

この改ざんはペイパルでどのように停止されますか。ハッシュはないようです。

<form method="post" action="https://www.sandbox.paypal.com/cgi-bin/webscr">
  <input type="hidden" value="_xclick" name="cmd">
  <input type="hidden" value="online****@theg*****.com" name="business">
  <!-- <input type="hidden" name="undefined_quantity" value="1" /> -->
  <input type="hidden" value="Order" name="item_name">
  <input type="hidden" value="NA" name="item_number">
  <input type="hidden" value="22.16" name="amount">
  <input type="hidden" value="5.17" name="shipping">
  <input type="hidden" value="0" name="discount_amount">        
  <input type="hidden" value="0" name="no_shipping">
  <input type="hidden" value="No comments" name="cn">
  <input type="hidden" value="USD" name="currency_code">
  <input type="hidden" value="http://XXX/XXX/XXX/paypal/return" name="return">
  <input type="hidden" value="2" name="rm">      
  <input type="hidden" value="11255XXX" name="invoice">
  <input type="hidden" value="US" name="lc">
  <input type="hidden" value="PP-BuyNowBF" name="bn">
  <input type="submit" value="Place Order!" name="finalizeOrder" id="finalizeOrder" class="submitButton">
</form>

では、ペイパルに投稿する前に金額を修正する人を止めるにはどうすればよいでしょうか? つまり、金額は100である必要がありますが、人々はそれを1に変更しています。

4

2 に答える 2

0

あなたがする必要があるのは、単純な請求書システムを実装することです。データベースにinvoices (ID, User_Id, Invoice_Value, Payment_Status)(example) という名前のテーブルを用意します。

ユーザーがチェックアウト ページに到達すると、そのユーザーの db テーブルに、支払う必要のある合計金額と「保留中」の最初の支払いステータスのエントリが挿入されているはずです。請求表の行を挿入した後、最後の挿入 ID を取得し、変数$invoice_id.

ここで、html ペイパル チェックアウト ボタン フォームを出力すると、非表示の入力フィールドの 1 つが次のようになります。

<input type="hidden" value="<?php echo $invoice_id; ?>" name="custom">

ここで、paypal がリターン URL に IPN で応答すると、IPN ハンドラーは次のように動作する必要があります。

<?php

// read the post from PayPal system and add 'cmd'  
$req = 'cmd=_notify-validate';  
foreach ($_POST as $key => $value) {  
    $value = urlencode(stripslashes($value));  
    $req .= "&$key=$value";  
}

// 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 ('ssl://sandbox.www.paypal.com', 443, $errno, $errstr, 30);  
if (!$fp) {  
    // HTTP ERROR  
}
else
{
    // Make Request To PayPal
    fputs ($fp, $header . $req);  
    while (!feof($fp))
    { 
        // Read Response 
        $res = fgets ($fp, 1024);

        // Check Response  
        if (strcmp ($res, "VERIFIED") == 0)
        {  
            // PAYMENT VALIDATED & VERIFIED!

            // Load the Invoice_Value from invoices table for $_POST['custom']
            // and compare it with paypal posted amount held in $_POST['mc_gross']
            // if it matches, paypal has authenticated the payment and the value has not been tampered with
            // update the invoice table and set the payment status
        }  
        else if (strcmp ($res, "INVALID") == 0)
        {  
            // PAYMENT INVALID & INVESTIGATE MANUALY!  
        }
    }  
    fclose ($fp);  
}  

?>
于 2013-11-01T14:54:52.807 に答える