使用重定向而非按钮的Paypal付款安全地设置动态金额?

时间:2016-02-14 14:35:18

标签: php paypal paypal-ipn

好吧,我之前没有使用托管按钮,但它更有意义,因为它们更安全。

我环顾四周,一直在阅读文档(这些都没有帮助),到目前为止我找到的最佳帮助是here;虽然我仍然对确切放置代码的地方感到困惑?

另外,我在技术上并不想要一个"按钮",但它背后的想法似乎是我想要的。

我想要做的就是每次都使用相同的查询变量,但只想更改价格 - 价格是动态的,具体取决于用户在表单中选择的内容。

此外,我本身并不想要一个按钮,我更倾向于使用适当的数据将用户重定向到paypal但不确定如何在设置动态价格时这样做?

如果我没有设置动态价格,我知道我可以将查询变量附加到URL上的托管按钮,然后重定向到该URL,但我需要更改价格,因此我的问题...

3 个答案:

答案 0 :(得分:2)

好的,我终于发现,BMUpdateButton API的响应不仅会返回HTML来创建表单,还会在返回的数组中返回其他数据。

根据上面链接的API页面上的 BMUpdateButton响应部分,一旦您发出请求,它将返回一个包含三个键的数组。

这些是:

  • WEBSITECODE

    网页的HTML代码

    • EMAILLINK

这就是我要找的;您可以将用户重定向到的简单链接

  • HOSTEDBUTTONID

按钮的ID。

在更改托管按钮的内容时,建议您在创建按钮时将所有按钮的详细信息传递给它;举例来说,如果你遗漏了一个项目名称,项目名称将为空白,Paypal将允许用户进行设置。

此外,重要提示是指当您更新按钮详细信息时,它不会针对该用户会话进行更新,而是在您的paypal中更新它帐户 - 因此新名称/价格等会影响尝试使用它的所有用户。

如果想要更新按钮的详细信息,可以使用以下内容执行此操作:

我个人从这门课开始:

<?php

class Paypal
{
    /**
     * Last error message(s)
     * @var array
     */
    protected $_errors = array();

    /**
     * API Credentials
     * Use the correct credentials for the environment in use (Live / Sandbox)
     * @var array
     */
    protected $_credentials = array(
        'USER' => 'seller_1297608781_biz_api1.lionite.com',
        'PWD' => '1297608792',
        'SIGNATURE' => 'A3g66.FS3NAf4mkHn3BDQdpo6JD.ACcPc4wMrInvUEqO3Uapovity47p',
    );

    /**
     * API endpoint
     * Live - https://api-3t.paypal.com/nvp
     * Sandbox - https://api-3t.sandbox.paypal.com/nvp
     * @var string
     */
    protected $_endPoint = 'https://api-3t.sandbox.paypal.com/nvp';

    /**
     * API Version
     * @var string
     */
    protected $_version = '74.0';

    /**
     * Make API request
     *
     * @param string $method string API method to request
     * @param array $params Additional request parameters
     * @return array / boolean Response array / boolean false on failure
     */
    public function request($method, $params = array())
    {
        $this->_errors = array();
        if (empty($method)) { //Check if API method is not empty
            $this->_errors = array('API method is missing');
            return false;
        }

        //Our request parameters
        $requestParams = array(
                'METHOD' => $method,
                'VERSION' => $this->_version
            ) + $this->_credentials;

        //Building our NVP string
        $request = http_build_query($requestParams + $params);

        //cURL settings
        $curlOptions = array(
            CURLOPT_URL => $this->_endPoint,
            CURLOPT_VERBOSE => 1,
            CURLOPT_SSL_VERIFYPEER => true,
            CURLOPT_SSL_VERIFYHOST => 2,
            CURLOPT_CAINFO => dirname(__FILE__) . '/cacert.pem', //CA cert file
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_POST => 1,
            CURLOPT_POSTFIELDS => $request
        );

        $ch = curl_init();
        curl_setopt_array($ch, $curlOptions);

        //Sending our request - $response will hold the API response
        $response = curl_exec($ch);

        //Checking for cURL errors
        if (curl_errno($ch)) {
            $this->_errors = curl_error($ch);
            curl_close($ch);
            return false;
            //Handle errors
        } else {
            curl_close($ch);
            $responseArray = array();
            parse_str($response, $responseArray); // Break the NVP string to an array
            return $responseArray;
        }
    }
}

?>

信用: https://www.smashingmagazine.com/2011/09/getting-started-with-the-paypal-api/

然后我做了以下事情:

include(dirname(__FILE__) . '/includes/paypal.class.php');

$paypal = new Paypal();

// Set our method
$method = 'BMUpdateButton';

// Set our params
$params = array(
    'HOSTEDBUTTONID' => 'your_button_id',
    'BUTTONTYPE' => 'BUYNOW',
    'BUTTONSUBTYPE' => 'SERVICES',
    'L_BUTTONVAR0' => 'item_name=Your Description',
    'L_BUTTONVAR1' => 'amount=999.00',
    'L_BUTTONVAR2' => 'currency_code=AUD',
    'L_BUTTONVAR3' => 'cancel_return=http://www.example.com/cancel.html',
    'L_BUTTONVAR4' => 'return=http://www.example.com/success.html'
);

// Make request to change button details
$result = $paypal->request($method, $params);

请注意,虽然Paypal表示BUTTONSUBTYPE是可选的,但如果您不加错,则可能会收到错误。

答案 1 :(得分:0)

如果你要做托管按钮,你需要使用他们的按钮设计器。

https://www.paypal.com/us/cgi-bin/webscr?cmd=_button-designer

安全性来自交易后的IPN验证。

请参阅:

https://www.paypal.com/us/cgi-bin/webscr?cmd=p/acc/ipn-info-outside

Validate that IPN call is from PayPal?

这篇文章的答案是更好的方法:

Dynamic PayPal button generation - isn't it very insecure?

答案 2 :(得分:0)

按钮代码是基于HTML表单的标签,因此您可以轻松地将其转换为字符串查询并使用以下格式组合动态有效负载:

this

自定义它并根据列出的变量HERE附加变量,并将其与重定向方法一起使用。

按钮管理器API更全面,但它不会返回这样的查询字符串URL,尽管背后的想法与HTML表单代码段相同