2015-06-24 7 views
5

Так что я боролся с тем, чтобы сделать голову или хвост из документации PayPal и всегда чувствовал, что с моим Webrequest что-то не так.Проблемы с интеграцией PayPal Express Checkout (WEBREQUEST)

Так я раздел весь код обратно в основные и просто подал запрос через HTTP и сторона PLUS является то, что я теперь получить ответ от сервера песочницы PayPal, где ACK=Success и TOKEN=Valid-token-value-here есть некоторые другие переменные вернулся слишком, как CORRELATIONID и TIMESTAMP.

И поэтому поэтому я попробовал некоторые из образцов webrequest, и я просто получил пустой экран вместо того, чтобы перенаправляться в Paypal для клиента (песочницы) для завершения платежа.

Так что, если кто-то может опубликовать свой метод WebRequest, это было бы здорово.

Вот код, который я использовал для своего веб-запроса, я уверен, что он ошибается, но не может определить, где он идет не так.

Кроме того, когда я запускаю код на своем локальном хосте во время отладки, все работает нормально, а вызов завершается с помощью SUCCESS и получен TOKEN.

Когда я запускаю его в прямом эфире, я получаю Error Number 5 в исключении Error, а также текст `Remote host failed to connect 'в STATUS DESCRIPTION.

ЭТО ОБНОВЛЕНИЕ КОД

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

+0

Каковы коды ответа HTTP для пустых страниц? – BoffinbraiN

+0

Я обновил свой вопрос, пожалуйста, см. Выше информацию об ошибке. – Zeddy

ответ

0

ОК, так что теперь ясно, что вы не получаете никакого ответа от сервера, потому что ваш сервер не может подключиться к серверам системы 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, либо из-за конфигурации брандмауэра.

Без физического присутствия на вашем компьютере мы не сможем многое сделать, чтобы отслеживать, что блокирует его, но вы можете попробовать открыть HTTP-запросы на другие общедоступные сайты, такие как Google.com, и посмотреть, удастся ли им это сделать.

+0

Можете ли вы посоветовать мне, как открыть HTTP-запрос на другом общедоступном веб-сайте, пожалуйста? Спасибо – Zeddy

+0

Возможно, вы захотите посмотреть [this] (https://stackoverflow.com/questions/92522/http-get-in-vb-net) и убедиться, что вы поймаете исключение, чтобы найти причину. – BoffinbraiN

+0

Hiya BoffinbraiN, Спасибо, что постарался мне помочь. Я ни разу не узнал, что случилось, так как время было срочным, я передал аутсорсинг интеграции Paypal и заплатил за его разрешение. Видя, как вы были единственным человеком, который даже предлагал помочь, я отмечаю ваш ответ как правильный ответ и награждаю вас 50 точками репутации. Спасибо за помощь. – Zeddy

Смежные вопросы