使用 Paypal IPN 在 notify_url 接收自定义帖子变量

Posted

技术标签:

【中文标题】使用 Paypal IPN 在 notify_url 接收自定义帖子变量【英文标题】:Receive a Custom Post Variable at notify_url with Paypal IPN 【发布时间】:2014-01-16 19:36:54 【问题描述】:

我有一个非托管按钮来进行 Paypal 付款,其中一个变量是:

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

这会正确完成 Paypal 付款,但我没有在我的 POST 数据中获取“金额”变量,以便使用我在 notify_url 设置的函数进行处理

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

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

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

是否可以修改 processIPN 函数以将“金额”(或任何其他)变量发送到我在 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】:

我已经有一段时间没有做这个了,但这里有一些我从脚本中获取的代码。这是我制作的 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" >';
echo '</form>';

我有一个名为“自定义”的字段,用于传递我需要进行验证的任何数据。我使用该字段传递进行购买的客户的用户名,当我的侦听器脚本 (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.

    

希望这可以让您了解如何进行设置。

【讨论】:

以上是关于使用 Paypal IPN 在 notify_url 接收自定义帖子变量的主要内容,如果未能解决你的问题,请参考以下文章

使用 IPN 模拟器测试 PayPal IPN SHA-256 合规性

在 PayPal 沙盒中使用 IPN 测试拒付/争议

未使用发票 API 接收 PayPal IPN

如何使用 sandbox.paypal 获取 IPN 进行支付

没有 IPN 的 Paypal 集成

PayPal 难以捉摸的 IPN 历史在哪里?