【问题标题】:Setting dynamic amounts securely with Paypal payments with a redirection and not button?使用重定向而不是按钮的 Paypal 付款安全地设置动态金额?
【发布时间】:2016-05-25 09:26:27
【问题描述】:

好的,我以前没有使用过托管按钮,但这是有道理的,因为它们更安全。

我环顾四周并一直在阅读文档(这些文档并不是很有帮助),到目前为止我找到的最佳帮助是 here;虽然我仍然对将代码放在哪里感到困惑?

另外,从技术上讲,我不想要一个“按钮”,但它们背后的想法似乎是我想要的。

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

此外,我本身不想要按钮,我更愿意使用适当的数据将用户重定向到贝宝,但不确定如何在设置动态价格的同时执行此操作?

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

【问题讨论】:

  • 使用它,但this reference 应该会有所帮助。似乎您必须发出 服务器端 请求(NVPSOAP)才能“创建按钮”。对该请求的响应将包含 HTML, a link, or an IDHth。
  • 是的,我看过那些页面,但在我看来,它所做的只是为按钮创建 html 输出;我想我总是可以将 html 加载到页面上并通过 JS 或其他方式自动提交页面。希望有一些对用户更友好的东西。
  • 不应该做任何散列/加密客户端(Javascript),因为如果你这样做了,你几乎破坏了你正在寻找的东西 - 保护交易不被篡改。这就是托管按钮的作用——防止被篡改。任何类型的散列/加密都应该在服务器端完成,超出任何浏览器/客户端的范围。只有之后(已经散列/加密)您才应该考虑任何客户端流。
  • 我知道 - 这就是我想使用托管“按钮”的原因;但实际上并没有使用按钮——这就是为什么我说也许我可以将生成的按钮代码加载到页面上并自动提交。虽然不理想。

标签: php paypal paypal-ipn


【解决方案1】:

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

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

这些是:

  • 网站代码

    网页的 HTML 代码

    • 电子邮件链接

这就是我要找的;一个可以将用户重定向到的普通链接

  • 主机按钮ID

按钮的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 是可选的,但如果不包含它,您可能会收到错误消息。

【讨论】:

    【解决方案2】:

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

    https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=yourAccount@email.com&item_name=itemNameTest&item_number=123&amount=1&currency_code=USD&no_shipping=1
    

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

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

    【讨论】:

      【解决方案3】:

      如果您要制作托管按钮,则需要使用他们的按钮设计器。

      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?

      【讨论】:

      • 谢谢,但我知道如何创建按钮 - 我正在努力解决的是如何将正确的数据传递给贝宝,以便我可以通过重定向发送给他们查询变量。因此,与其向我返回 html 以在我的网站上放置一个按钮,我只想返回一个查询字符串或 JSON 或其他更可行的东西。
      猜你喜欢
      • 2020-05-12
      • 1970-01-01
      • 2013-09-27
      • 2020-09-02
      • 2020-03-20
      • 2021-10-23
      • 2014-06-20
      • 2012-06-21
      • 2011-05-26
      相关资源
      最近更新 更多