使用Paypal IPN在notify_url接收自定义发布变量

时间:2013-12-29 22:18:13

标签: php post paypal paypal-ipn paypal-sandbox

我有一个非托管按钮来支付Paypal Payments,其中一个变量是:

 <input type="hidden" name="amount" value="<?php echo $payment->amount;?>"> 

这样就完成了Paypal支付,但是我没有在我的POST数据中获得“amount”变量来使用我在notify_url设置的函数进行处理

我正在使用Micah Carrick出色的IPN听众

http://www.micahcarrick.com/paypal-ipn-with-php.html

https://github.com/Quixotix/PHP-PayPal-IPN

是否可以修改processIPN函数以将“amount”(或任何其他)变量发送到我在notify_url设置的函数?我基本上试图确保mc_gross等于最初发送的金额。我可以使用数据库查询来检查mc_gross与预期的数量,但如果我可以将该数量作为POST变量返回,则效率似乎很低。只是不确定更改IPN侦听器是否可行,如果可以,则如何操作!

process_IPN函数供参考:

public function processIpn($post_data=null) {

    $encoded_data = 'cmd=_notify-validate';

    if ($post_data === null) { 
        // use raw POST data 
        if (!empty($_POST)) {
            $this->post_data = $_POST;
            $encoded_data .= '&'.file_get_contents('php://input');
        } else {
            throw new Exception("No POST data found.");
        }
    } else { 
        // use provided data array
        $this->post_data = $post_data;

        foreach ($this->post_data as $key => $value) {
            $encoded_data .= "&$key=".urlencode($value);
        }
    }

    if ($this->use_curl) $this->curlPost($encoded_data); 
    else $this->fsockPost($encoded_data);

    if (strpos($this->response_status, '200') === false) {
        throw new Exception("Invalid response status: ".$this->response_status);
    }

    if (strpos($this->response, "VERIFIED") !== false) {
        return true;
    } elseif (strpos($this->response, "INVALID") !== false) {
        return false;
    } else {
        throw new Exception("Unexpected response from PayPal.");
    }
}

谢谢你的任何帮助!

1 个答案:

答案 0 :(得分:3)

我已经有一段时间了,但是我从脚本中获取了一些代码。这是我制作的Paypal购买按钮的代码。

echo '<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">';
echo '<input type="hidden" name="cmd" value="_xclick">';
echo '<input type="hidden" name="business" value="seller_38292821_biz@email.com">';
echo '<input type="hidden" name="item_name" value="Ebook">';
echo '<input type="hidden" name="item_number" value="'.$booknumber.'">';
echo '<input type="hidden" name="amount" value="9.00">';
echo '<input type="hidden" name="custom" value='.$custom.'>';
echo '<input type="hidden" name="quantity" value="'.$quantity.'">';
echo '<input type="hidden" name="currency_code" value="USD">';
echo '<input type="hidden" name="no_shipping" value="1">';
echo '<input type="hidden" name="no_note" value="1">';
echo '<input type="hidden" name="notify_url" value="http://www.mywebsite.com/ipn.php">';
echo '<input type="hidden" name="return" value="http://www.mywebsite.com/support.php?clearcart=1">';
echo '<input type="hidden" name="cancel_return" value="http://www.mywebsite.com/ipncancel.php?status=cancel">';
echo '<input type="image" name="submit" border="0" src="paypal.gif" alt="PayPal - The safer, easier way to pay online">';
echo '</form>';

我有一个名为“custom”的字段,用于传递我需要进行验证的任何数据。我使用该字段传递进行购买的客户的用户名,当我的监听器脚本(ipn.php)收到POST时,它接受用户名并查询数据库并根据POST的金额检查交易金额如果它们匹配,我会运行另一个查询来更新数据库,以使用该用户名为该帐户提供数字产品。在将数字产品提供给用户帐户之前,必须满足以下条件。

    if($quantity == $pendingquantity && $payment_amount == $pendingamount && $payment_currency == "USD" && $payment_status == "Completed"){

    //Update database to make the product available for download for the specified account.

    }

希望这可能会让你知道如何进行设置。