PayPal API 混淆 - ExpressCheckout 使用哪一个
Posted
技术标签:
【中文标题】PayPal API 混淆 - ExpressCheckout 使用哪一个【英文标题】:PayPal API Confusion - Which one to use for ExpressCheckout 【发布时间】:2015-04-10 03:57:58 【问题描述】:我正在研究 PayPal 提供的各种集成,因为我只想提供 PayPal 作为付款选项,所以我将使用 Express Checkout。话虽如此,似乎可以通过多种方式进行集成:
-
名称值对
经典 API (SDK)
Restful API。
我遇到的问题是 .NET SDK 是显然已被弃用的经典 API 集的一部分(来源:https://github.com/paypal/merchant-sdk-dotnet)。 RESTful API 没有提到任何关于 ExpressCheckout 的内容,所以我假设 NVP 是要走的路。
有人可以澄清最好的路线,因为如果事情被弃用,我宁愿不必重写它。
关于信息:我正在使用带有 C# 的 ASP.NET MVC。
【问题讨论】:
只是为了进一步澄清/补充下面的答案,Github 上提供了用于 REST 的“.Net SDK”,也通过Nuget 分发。 Hth. 【参考方案1】:首先,只有两个 API:
-
Classic API
请求和响应负载的格式为
NVP and SOAP
。
适用于 .NET 的 PayPal Merchant SDK 提供了对 Express Checkout 的官方 PayPal SDK 支持(GitHub | NuGet)
REST API
请求和响应负载的格式为JSON
PayPal .NET SDK (GitHub | NuGet) 提供官方 PayPal SDK 支持
PayPal Name-Value Pair API (NVP API) 使您能够通过简单地向 PayPal 发送 HTTP 请求并使用名称-值对指定请求参数来利用 PayPal API 的功能。 NVP API 是 PayPal SOAP API 的轻量级替代方案,提供对与 SOAP API 相同的功能集的访问。
关于 Classic API 与 REST API 的几点考虑:
Classic API 不会很快被弃用。您可以使用经典 API。 此外,REST API 不支持在 Classic API 中工作的许多变量/参数。 REST API 可用于信用卡和 PayPal 付款(快速结账架构)。由于您使用的是 .NET SDK,因此您可以继续使用它,因为它使用的是 Classic API+NVP。
【讨论】:
对,很好。非常感谢您抽出宝贵时间(并为我解惑)。 @Vimalnath - Classical API 是否不支持 PayPal 支付而只支持信用卡支付?从您发布的最后一个要点看来,这可能是真的。【参考方案2】:我更喜欢 SOAP,因为它是一个干净的代码,带有类。
看看改编的 C# 代码:
private paypalProxy.CustomSecurityHeaderType getCredentials()
paypalProxy.CustomSecurityHeaderType header = new paypalProxy.CustomSecurityHeaderType();
header.Credentials = new paypalProxy.UserIdPasswordType();
header.Credentials.Username = "";
header.Credentials.Password = "";
header.Credentials.Signature = "";
header.Credentials.Subject = "";
return header;
private paypalProxy.BasicAmountType getAmountValue(Decimal valor)
paypalProxy.BasicAmountType amt = new paypalProxy.BasicAmountType();
amt.currencyID = paypalProxy.CurrencyCodeType.BRL;
amt.Value = valor.ToString("N2").Replace(",", ".");
return amt;
public paypalProxy.SetExpressCheckoutResponseType ExpressCheckout(Venda venda, string emailComprador, Decimal valor, Decimal valorFrete, string shipToName, string shipToStreet, string shipToStreet2, string shipToCity, string shipToState, string shipToZip, string shipToCountryCode, string billingToName, string billingToStreet, string billingToStreet2, string billingToCity, string billingToState, string billingToZip, string billingToCountryCode)
#region Header/Identification
paypalProxy.CustomSecurityHeaderType header = getCredentials();
#endregion
#region Body
paypalProxy.SetExpressCheckoutReq requisicao = new paypalProxy.SetExpressCheckoutReq();
#region Body configuration
requisicao.SetExpressCheckoutRequest = new paypalProxy.SetExpressCheckoutRequestType();
requisicao.SetExpressCheckoutRequest.Version = "109.0";
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails = new paypalProxy.SetExpressCheckoutRequestDetailsType();
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.OrderTotal = getAmountValue(valor + valorFrete - venda.valorFreteDesconto);
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.BuyerEmail = emailComprador;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.ReturnURL = ""
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.CancelURL = ""
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.PaymentAction = paypalProxy.PaymentActionCodeType.Sale;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.ReqConfirmShipping = "0";
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.AddressOverride = "0";
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.AllowNote = "0";
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.BrandName = ""
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.ShippingMethod = ShippingServiceCodeType.CustomCode;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.cppheaderimage = "http://.../logo.jpg"
#endregion
#region Shipping Details
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.Address = new paypalProxy.AddressType();
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.Address.Name = shipToName;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.Address.Street1 = shipToStreet;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.Address.Street2 = shipToStreet2;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.Address.CityName = shipToCity;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.Address.StateOrProvince = shipToState;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.Address.PostalCode = shipToZip;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.Address.Country = paypalProxy.CountryCodeType.BR;
#endregion
#region Billing Address
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.BillingAddress = new paypalProxy.AddressType();
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.BillingAddress.Name = billingToName;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.BillingAddress.Street1 = billingToStreet;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.BillingAddress.Street2 = billingToStreet2;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.BillingAddress.CityName = billingToCity;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.BillingAddress.StateOrProvince = billingToState;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.BillingAddress.PostalCode = billingToZip;
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.BillingAddress.Country = paypalProxy.CountryCodeType.BR;
#endregion
#region Payment detail
PaymentDetailsType paymentDetail = new PaymentDetailsType();
#region ITEMS
List<PaymentDetailsItemType> paymentItems = new List<PaymentDetailsItemType>();
foreach (var item in venda.Product)
PaymentDetailsItemType itemPaypal = new PaymentDetailsItemType();
itemPaypal.Name = item.Produto;
//itemPaypal.Description = item.ProductName;
itemPaypal.Amount = getAmountValue(item.value);
itemPaypal.Quantity = item.qtd.ToString();
itemPaypal.ItemURL = item.UrlImage;
paymentItems.Add(itemPaypal);
#region DISCOUNT
if (venda.isDesconto)
PaymentDetailsItemType itemPaypal = new PaymentDetailsItemType();
itemPaypal.Name = "Discount";
itemPaypal.Description = "Discount";
itemPaypal.Amount = getAmountValue(venda.Discount * (-1));
itemPaypal.Quantity = "1";
paymentItems.Add(itemPaypal);
#endregion
paymentDetail.ItemTotal = getAmountValue(valor);
#endregion
#region Shipping
if (ShippingValue > 0)
paymentDetail.ShippingTotal = getAmountValue(ShippingValue);
if (venda.ShippingDiscount > 0)
paymentDetail.ShippingDiscount = getAmountValue(venda.ShippingDiscount);
#endregion
paymentDetail.OrderDescription = string.Format("SALE 0 Nº 1", "XPTO eCommerce", "Sale ID");
paymentDetail.PaymentDetailsItem = paymentItems.ToArray();
paymentDetail.AllowedPaymentMethod = AllowedPaymentMethodType.AnyFundingSource;
paymentDetail.InvoiceID = venda.IdVenda.ToString();
List<PaymentDetailsType> paymentDetails = new List<PaymentDetailsType>();
paymentDetails.Add(paymentDetail);
requisicao.SetExpressCheckoutRequest.SetExpressCheckoutRequestDetails.PaymentDetails = paymentDetails.ToArray();
#endregion
#endregion
#region Sending to Paypal and waiting for token in var TIPO
paypalProxy.SetExpressCheckoutResponseType tipo = null;
paypalProxy.PayPalAPIAAInterfaceClient cliente = new paypalProxy.PayPalAPIAAInterfaceClient();
tipo = cliente.SetExpressCheckout(ref header, requisicao);
#endregion
return tipo;
【讨论】:
REST API 相同。实施的决定(针对新开发)更多地基于 feature 支持(可能在 REST API 中尚不支持)。 Hth.以上是关于PayPal API 混淆 - ExpressCheckout 使用哪一个的主要内容,如果未能解决你的问题,请参考以下文章
PayPal REST 令牌请求:api.paypal.com OK,api-m 失败