PayPal快递多特结帐付款收费金额

本文关键字:付款 金额 快递 PayPal | 更新日期: 2023-09-27 18:31:29

这不是

一个编码问题,但我想了解发生了什么。这是我第一次必须集成PayPal,因此我使用了沙盒环境和具有硬编码值的简单示例来开始使用。

对于SetExpressCheckoutRequest,假设付款值x,一切正常(买方同意,令牌返回)。然后我意识到需要DoExpressCheckoutPayment来完成它,所以我使用了更多的示例代码,它也可以正常工作。

在 DoExpressCheckoutPayment 代码示例中,假定付款值为 y。如前所述,我只是想让骨架工作,而懒得将价值观等联系起来。

现在让我感到惊讶的是:PayPal沙盒帐户中显示的实际交易金额不是买方批准的值x,而是DoExpressCheckoutPayment的值y。以下是简化的示例代码:

    public ActionResult RunSample()
    {
        //...
        PaymentDetailsItemType[] pdItem = new PaymentDetailsItemType[1];
        pdItem[0] = new PaymentDetailsItemType()
        {
            Amount = new BasicAmountType() { currencyID = CurrencyCodeType.USD, Value = 1.50},
            //...
        };
        var resp = new PayPalAPIAAInterfaceClient().SetExpressCheckout(ref type, req);
        //...
        return new RedirectResult(string.Format("{0}?cmd=_express-checkout&token={1}",
            "https://www.sandbox.paypal.com/cgi-binwebscr?cmd=_express-checkout&token=EC-xxxxx", resp.Token));
    }
    public ActionResult RunSampleResult(string token, string payerId)
    {
        // result returned, buyer agreed to 1.50
        var NVP = "METHOD=DoExpressCheckoutPayment";
        //NVP += ...;
        NVP += "&PAYMENTREQUEST_0_AMT=100";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api-3t.sandbox.paypal.com/nvp");
        //...
        string sResponse = string.Empty;
        using (StreamWriter sw = new StreamWriter(request.GetRequestStream()))
        {
            sw.Write(NVP);
        }
        HttpWebResponse response = request.GetResponse() as HttpWebResponse;
        // => 100 is charged, not the 1.50 agreed to
    }

这只是沙盒行为吗?当然,推翻买家同意的价值不是那么容易吗?我错过了什么?

PayPal快递多特结帐付款收费金额

是的,在 DECP 中发送的任何内容都是被处理的内容。 原因是当SEC运行时,您可能还不知道用户的送货地址,因此在从PayPal返回并致电GetExpressCheckoutDetails以获取买家信息后,您将计算运费和税款。

有了这些信息和其他计算,您将显示最终评论供买家查看,然后再通过 DECP 运行新的总计以完成付款。

显然,如果您以任何方式利用这一点,您的应用程序将不会持续很长时间。

SEC 中包含一个名为 MAXAMT 的参数,您可以使用该参数,以便 DECP 无法处理高于此处设置的任何内容,但同样,无论如何,这取决于您作为应用程序开发人员来管理它。