asp.net - Paypal Express Checkout 集成问题 (WEBREQUEST)

标签 asp.net vb.net paypal-sandbox paypal

所以我一直在努力从 PayPal 文档中找出头或尾,并且总觉得我的 Webrequest 有什么地方不对。

所以我将所有代码剥离回基本代码并简单地通过 HTTP 提交请求,PLUS 方面是我现在从 PayPal 沙箱服务器收到响应,其中 ACK=SuccessTOKEN=Valid-token-value-here 还返回了一些其他变量,例如 CORRELATIONID 和 TIMESTAMP。

因此,我尝试了一些 webrequest 示例,我只是得到一个空白屏幕,而不是被重定向到 Paypal 以供(沙盒)客户完成付款。

因此,如果任何人都可以发布他们的 WebRequest 方法,那就太好了。

这是我用于我的网络请求的代码,我确定它是错误的,但无法查明哪里出错了。

此外,当我在调试期间在我的本地主机上运行代码时,一切正常,调用成功完成并收到 token 。

当我实时运行它时,我收到错误异常中的错误编号 5 以及状态描述中的文本“远程主机无法连接”。

这是更新后的代码

Function MakeWebRequest(ByVal pUseSandbox As Boolean, ByVal pRequestMethod As String, ByVal pReturnUrl As String, ByVal pCancelUrl As String, ByRef pRtnStatus As String, ByRef pRtnStatusId As HttpStatusCode, ByRef pRtnResponseString As String) As Boolean
'
Dim _sxHost As String = Nothing
Dim _sxEndpoint As String = Nothing
Dim _sxNameValCol As System.Collections.Specialized.NameValueCollection = Nothing
Dim _sxResponseCol As System.Collections.Specialized.NameValueCollection = Nothing
Dim _sxCounta As Integer = Nothing
Dim _sxParamsString As String = Nothing
'
'-> Init
_sxParamsString = ""
MakeWebRequest = False
_sxNameValCol = New System.Collections.Specialized.NameValueCollection()
_sxResponseCol = New System.Collections.Specialized.NameValueCollection()
If pUseSandbox Then
  _sxHost = "http://www.sandbox.paypal.com"
  _sxEndpoint = "https://api-3t.sandbox.paypal.com/nvp"
Else
  _sxHost = "http://www.paypal.com"
  _sxEndpoint = "https://api-3t.paypal.com/nvp"
End If
'-> Create Request
Try
  '-> Key/Value Collection Params
  _sxNameValCol.Add("METHOD", "SetExpressCheckout")
  _sxNameValCol.Add("USER", _UserName)
  _sxNameValCol.Add("PWD", _Password)
  _sxNameValCol.Add("SIGNATURE", _Signature)
  _sxNameValCol.Add("PAYMENTREQUEST_0_AMT", Format(_Basket.BasketTotalIncDelivery / 100, "0.00"))
  _sxNameValCol.Add("PAYMENTREQUEST_0_PAYMENTACTION", "Sale")
  _sxNameValCol.Add("PAYMENTREQUEST_0_CURRENCYCODE", "GBP")
  _sxNameValCol.Add("RETURNURL", pReturnUrl)
  _sxNameValCol.Add("CANCELURL", pCancelUrl)
  _sxNameValCol.Add("REQCONFIRMSHIPPING", "0")
  _sxNameValCol.Add("NOSHIPPING", "2")
  _sxNameValCol.Add("LOCALECODE", "EN")
  _sxNameValCol.Add("BUTTONSOURCE", "PP-ECWizard")
  _sxNameValCol.Add("VERSION", "93.0")
  '-> UrlEncode
  For _sxCounta = 0 To _sxNameValCol.Count - 1
    If _sxCounta = 0 Then
      _sxParamsString = _sxParamsString & _sxNameValCol.Keys(_sxCounta) & "=" & HttpUtility.UrlEncode(_sxNameValCol(_sxCounta))
    Else
      _sxParamsString = _sxParamsString & "&" & _sxNameValCol.Keys(_sxCounta) & "=" & HttpUtility.UrlEncode(_sxNameValCol(_sxCounta))
    End If
  Next
  '-> Credentials (not used)
  '_sxRequest.Credentials = CredentialCache.DefaultCredentials
  Try
    Dim _sxRequest As WebRequest = DirectCast(System.Net.WebRequest.Create(_sxEndpoint), System.Net.HttpWebRequest)
    '-> Convert request to byte-array
    Dim _sxByteArray As Byte() = Encoding.UTF8.GetBytes(_sxParamsString)
    _sxRequest.Method = "POST"                                                      'Our method is post, otherwise the buffer (_sxParamsString) would be useless
    _sxRequest.ContentType = "application/x-www-form-urlencoded"                    'We use form contentType, for the postvars
    _sxRequest.ContentLength = _sxByteArray.Length                                  'The length of the buffer (postvars) is used as contentlength
    Dim _sxPostDataStream As System.IO.Stream = _sxRequest.GetRequestStream()       'We open a stream for writing the postvars
    _sxPostDataStream.Write(_sxByteArray, 0, _sxByteArray.Length)                   'Now we write, and afterwards, we close
    _sxPostDataStream.Close()                                                       'Closing is always important!
    '-> Create Response
    Dim _sxResponse As HttpWebResponse = DirectCast(_sxRequest.GetResponse(), HttpWebResponse)
    '-> Get Response Status
    pRtnStatus = _sxResponse.StatusDescription
    pRtnStatusId = _sxResponse.StatusCode
    '-> Reponse Stream
    Dim _sxResponseStream As Stream = _sxResponse.GetResponseStream()               'Open a stream to the response
    '-> Response Stream Reader
    Dim _sxStreamReader As New StreamReader(_sxResponseStream)                      'Open as reader for the stream 
    pRtnResponseString = _sxStreamReader.ReadToEnd()                                'Read the response string
    MakeWebRequest = True
    '-> Tidy up
    _sxStreamReader.Close()
    _sxResponseStream.Close()
    _sxResponse.Close()
    _sxByteArray = Nothing
    _sxPostDataStream = Nothing
    _sxRequest = Nothing
    _sxResponse = Nothing
    _sxResponseStream = Nothing
    _sxStreamReader = Nothing
  Catch ex As Exception
    pRtnStatusId = Err.Number
    pRtnStatus = "response(" & ex.Message & ")"
    Decode(pRtnResponseString, _sxResponseCol)
    pRtnResponseString = Stringify(_sxResponseCol)
  End Try
Catch ex As Exception
  pRtnStatusId = Err.Number
  pRtnStatus = "request(" & ex.Message & ")"
  Decode(pRtnResponseString, _sxResponseCol)
  pRtnResponseString = Stringify(_sxResponseCol)
End Try
'-> Tidy Up
_sxHost = Nothing
_sxEndpoint = Nothing
_sxNameValCol = Nothing
_sxResponseCol = Nothing
_sxCounta = Nothing
_sxParamsString = Nothing
'
End Function

enter image description here

最佳答案

好的,现在很明显您没有从服务器获得任何响应,因为您的服务器根本无法连接到 PayPal 的服务器。因此,您没有得到服务器响应和消息 Unable to connect to the remote server。测试时,我收到了一个 HTTP 200 响应,正文如下:

TIMESTAMP=2015-07-07T09:07:39Z&CORRELATIONID=7f4d2313c9696&ACK=Failure&VERSION=93.0&BUILD=17276661&L_ERRORCODE0=10002&L_SHORTMESSAGE0=Authentication/Authorization Failed&L_LONGMESSAGE0=You do not have permissions to make this API call&L_SEVERITYCODE0=Error

显然那是因为我使用空白的用户名和密码进行了测试。

因此,您的服务器设置有问题,导致您无法进行外部连接,无论是在 IIS 级别还是由于您的防火墙配置。

如果不亲临您的机器,我们无法做很多事情来追踪阻止它的原因,但您可以尝试打开对其他公共(public)网站(如 Google.com)的 HTTP 请求,看看是否成功。

关于asp.net - Paypal Express Checkout 集成问题 (WEBREQUEST),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31016008/

相关文章:

C++ 到 VB.NET 的转换

ruby - 如何创建/编辑/配置多个 PayPal 标准支付按钮?

asp.net - 长时间运行的 http 进程 - 如何放入单独的进程?

asp.net - 在 ASP.NET 成员提供者数据库中加密密码

c# - 从 Silverlight 控件中获取数据

javascript - 如何通过RegisterStartupScript传递2个参数?

asp.net - 如何在asp.net中的数字之间插入斜线?

vb.net - 如何访问 RouteTable.Routes.MapHttpRoute?

asp.net - 如何解决 Paypal 沙箱中的这个错误

c# - 从 C# 使用 Paypal REST API