代码之家  ›  专栏  ›  技术社区  ›  devlock

PayPal Express DoExpressCheckoutPayment收费金额

  •  0
  • devlock  · 技术社区  · 10 年前

    这不是一个编码问题,但我想了解发生了什么。这是我第一次必须集成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
        }
    

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

    1 回复  |  直到 10 年前
        1
  •  1
  •   Drew Angell    10 年前

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

    有了这些信息和额外的计算,您将在通过DECP运行新的总额以完成付款之前显示最终审核,供买家查看。

    显然,如果你以任何方式利用了这一点,你的应用程序都不会持续太久。

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