c# - PayPal Express DoExpressCheckoutPayment 收费金额

标签 c# paypal paypal-sandbox

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

对于 SetExpressCheckoutRequest,假定支付值 x,一切正常(买家同意, token 已返回)。然后我意识到需要 DoExpressCheckoutPayment 来完成它,所以我使用了更多示例代码,它也运行良好。

在 DoExpressCheckoutPayment 代码示例中,假定支付值 y。如前所述,我只是想让最基本的系统正常工作,而懒得去绑定(bind)值等。

让我吃惊的是:PayPal 沙盒账户中显示的实际交易金额不是买家批准的值(value) x,而是来自 DoExpressCheckoutPayment 的值(value) 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
    }

这只是沙盒行为吗?覆盖买家同意的值(value)肯定不会那么容易吧?我错过了什么?

最佳答案

是的,无论在 DECP 中发送什么,都会得到处理。这是因为当 SEC 运行时您可能还不知道用户的送货地址,因此您需要在从 PayPal 返回并调用 GetExpressCheckoutDetails 获取买家信息后计算运费和税金。

通过该信息和额外的计算,您可以显示最终评论供买家查看,然后再通过 DECP 运行新的总数以完成付款。

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

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

关于c# - PayPal Express DoExpressCheckoutPayment 收费金额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34960922/

相关文章:

react-native - 如何在 React Native 中通过 Paypal 实现汇款?

jsp - Paypal不返回实际总金额

c# - 如何将 SqlHierarchyId 序列化为字符串

c# - Linq to objects 多语句与单语句

c# - 为代码设置 ASP.NET 结构

c# - WPF RadioButton InverseBooleanConverter 不工作

php - Paypal IPN 发送 'pending',原因是 'multi-currency'?

ruby-on-rails - 如何从复杂的模块(paypal_permissions gem)中包含类?

android - 在 Android 中使用 paypal 快速结帐

php - Paypal 沙盒不返回任何变量