setExpressCheckout and SSL/TLS error



我正在尝试开发一个简单的应用程序,使用户可以通过Paypal API从网站上购买服务。此应用程序正在使用C#的ASP.NET上运行。

我在尝试让贝宝API合作时运气很差。我调用的方法是SetExpressCheckout,其中包含所有适当的变量。

我做了研究,发现由于我在Localhost中进行测试,这可能会影响Paypal与应用程序的通信能力。因此,我尝试的下一件事是通过开放端口和可公开访问的IP地址访问我的应用程序,但在调用SetExpressCheckout时也发生了同样的错误。

错误如下:

Exception Details: System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
Source Error: 

Line 1790:        [return: System.Xml.Serialization.XmlElementAttribute("SetExpressCheckoutResponse", Namespace="urn:ebay:api:PayPalAPI")]
Line 1791:        public SetExpressCheckoutResponseType SetExpressCheckout([System.Xml.Serialization.XmlElementAttribute(Namespace="urn:ebay:api:PayPalAPI")] SetExpressCheckoutReq SetExpressCheckoutReq) {
Line 1792:            object[] results = this.Invoke("SetExpressCheckout", new object[] {
Line 1793:                        SetExpressCheckoutReq});
Line 1794:            return ((SetExpressCheckoutResponseType)(results[0]));
Source File: c:WINDOWSMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filesanan_p2730602d631a8d74eApp_WebReferences.c8vgyrf8.2.cs    Line: 1792 

我还尝试过使用OpenSSL生成证书,并将其上传到Paypal帐户的加密卖家选项,但仍然没有效果。

非常感谢你通读我的问题!

更新:根据要求,这里是正在使用的代码。

String hostingOn = ConfigurationManager.AppSettings["default_site_url"];
reqDetails.ReturnURL = hostingOn + "marketplace_confirm.aspx";
reqDetails.CancelURL = hostingOn + "marketplace.aspx";
reqDetails.NoShipping = "1";
reqDetails.ReqConfirmShipping = "0";
reqDetails.OrderTotal = new BasicAmountType()
{
currencyID = CurrencyCodeType.CAD,
Value = payment_amt.Value,
};
SetExpressCheckoutReq req = new SetExpressCheckoutReq()
{
SetExpressCheckoutRequest = new SetExpressCheckoutRequestType()
{
Version = UtilPayPalAPI.Version,
SetExpressCheckoutRequestDetails = reqDetails
}
};
PayPalAPIAASoapBinding paypal = new PayPalAPIAASoapBinding();
paypal.SetExpressCheckout(req);

我也在使用https://api-aa-3t.paypal.com/2.0/用于访问API 的url

自2016年初以来,Paypal开始要求沙盒中的通信使用TLS 1.2协议,并将从6月17日起在实时环境中强制执行该协议。请参阅此处以供参考。

在大多数.NET应用程序中,TLS 1.2将在默认情况下禁用,因此您需要启用它。

例如,您需要在Application_Start方法的开头添加以下行:

public class Site : HttpApplication
{
protected void Application_Start()
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
// other configuration
}
}

您可能正在连接到api.paypal.com或api.sandbox.paypalcom,但没有随api证书一起发送。API证书是用于完成SSL链的客户端SSL证书。

如果您没有或未使用API证书,则应分别连接到API-3t.paypal.com或API-3t.sandbox.paypal.com for Live或sandbox。

我一直在使用PayPal(NVP/Signature)Express Checkout集成,并遇到了此SSL/TLS错误。

我似乎什么也没做,但后来我找到了下面的代码来添加到我的请求中。作为参考,我使用的是MVC3/.NET4,因此Tls1.2在默认情况下不可用(就像在.NET4.5+中一样)。这段代码的前三行绕过了这一点。我希望它能帮助人们!

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
ServicePointManager.DefaultConnectionLimit = 9999;
var url = "https://[paypal-api-url]/nvp";
var uri = new Uri(url);
var request = WebRequest.Create(uri);
var encoding = new UTF8Encoding();
var requestData = encoding.GetBytes(data);
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
request.Timeout = (300 * 1000); 
request.ContentLength = requestData.Length;
using (var stream = request.GetRequestStream())
{
stream.Write(requestData, 0, requestData.Length);
}
var response = request.GetResponse();
...

非常感谢对我的帮助。

这里是我在VB.NET 中建立接口的代码,供参考

'Create a service Binding in code
Dim ppEndpointAddress As New System.ServiceModel.EndpointAddress("https://api-3t.sandbox.paypal.com/2.0/")
Dim ppBinding As New System.ServiceModel.BasicHttpBinding(System.ServiceModel.BasicHttpSecurityMode.Transport)
Dim ppIface As New PayPalAPI.PayPalAPIAAInterfaceClient(ppBinding, ppEndpointAddress)
Dim ppPaymentReq As New PayPalAPI.DoDirectPaymentReq()
ppPaymentReq.DoDirectPaymentRequest = ppRequest

相关内容

  • 没有找到相关文章

最新更新