PayPal Express DoExpressCheckoutPayment 收费金额
PayPal Express DoExpressCheckoutPayment Charged Amount
这不是一个编码问题,但我想了解发生了什么。这是我第一次不得不集成 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
}
这只是沙盒行为吗?推翻买家同意的价值肯定不会那么容易吧?我错过了什么?
是的,在 DECP 中发送的就是要处理的。这是因为当SEC获取运行时你可能还不知道用户的送货地址,所以你会在从PayPal返回并调用GetExpressCheckoutDetails获取买家信息后计算运费和税金。
有了这些信息和额外的计算,您可以显示最终评论供买家查看,然后运行通过 DECP 计算新的总数以完成付款。
显然,如果您以任何方式利用它,您的应用程序都不会持续很长时间。
SEC 中包含一个名为 MAXAMT 的参数,您可以使用该参数,这样 DECP 就无法处理高于此处设置的任何内容,但同样,无论如何,这都取决于您作为应用程序开发人员来管理它。
这不是一个编码问题,但我想了解发生了什么。这是我第一次不得不集成 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
}
这只是沙盒行为吗?推翻买家同意的价值肯定不会那么容易吧?我错过了什么?
是的,在 DECP 中发送的就是要处理的。这是因为当SEC获取运行时你可能还不知道用户的送货地址,所以你会在从PayPal返回并调用GetExpressCheckoutDetails获取买家信息后计算运费和税金。
有了这些信息和额外的计算,您可以显示最终评论供买家查看,然后运行通过 DECP 计算新的总数以完成付款。
显然,如果您以任何方式利用它,您的应用程序都不会持续很长时间。
SEC 中包含一个名为 MAXAMT 的参数,您可以使用该参数,这样 DECP 就无法处理高于此处设置的任何内容,但同样,无论如何,这都取决于您作为应用程序开发人员来管理它。