2015-06-24 27 views
5

Tak więc zmagałem się z wyciąganiem głowy lub ogona z dokumentacji PayPal i zawsze czułem, że coś jest nie tak z moim Webrequestem.Problemy z integracją Paypal Express Checkout (WEBREQUEST)

Więc usunąłem cały kod z powrotem do podstawowego i po prostu przesłałem żądanie przez HTTP, a strona PLUS jest taka, że ​​teraz otrzymuję odpowiedź z serwera piaskownicy PayPal, gdzie ACK=Success i TOKEN=Valid-token-value-here są również zwracane inne zmienne, takie jak jako CORRELATIONID i TIMESTAMP.

Tak więc wypróbowałem niektóre z webrequest sample i po prostu otrzymałem pusty ekran zamiast przekierowania do Paypal dla klienta (sandbox) w celu dokończenia płatności.

Więc jeśli ktoś może opublikować swoją metodę WebRequest, byłoby wspaniale.

Oto kod, którego użyłem do mojego webquestu, jestem pewien, że jest błędny, ale nie może wskazać miejsca, w którym jest źle.

Ponadto, po uruchomieniu kodu na moim localhost podczas debugowania, wszystko działa poprawnie, a połączenie jest zakończone z SUCCESS i odbierany jest TOKEN.

Po uruchomieniu na żywo otrzymuję numer błędu 5 w wyjątku Error oraz tekst "Host zdalny nie udało się połączyć" w OPIS STATUSU.

TO JEST zaktualizowany kod

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

Jakie były kody odpowiedzi HTTP dla pustych stron? – BoffinbraiN

+0

Mam zaktualizowane moje pytanie, proszę zobaczyć powyższe informacje o błędzie. – Zeddy

Odpowiedz

0

OK, więc to jest teraz jasne, że nie dostaniesz żadnej odpowiedzi z serwera, ponieważ serwer nie jest w stanie połączyć się z serwerami firmy PayPal w ogóle. W związku z tym nie otrzymałeś odpowiedzi serwera i wiadomości Unable to connect to the remote server. Kiedy testowałem, dostałem odpowiedzi HTTP 200 z następującym ciała:

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 

Oczywiście to dlatego, że testowane z pustą nazwę użytkownika i hasło.

Coś jest nie tak z konfiguracją serwera, która uniemożliwia wykonywanie połączeń zewnętrznych na poziomie IIS lub z powodu konfiguracji zapory ogniowej.

Bez fizycznej obecności na komputerze, nie możemy wiele zrobić, aby wyśledzić, co blokuje, ale możesz spróbować otworzyć żądania HTTP na innych publicznych stronach internetowych, takich jak Google.com i sprawdzić, czy się uda.

+0

Czy możesz mi doradzić, jak otworzyć żądanie HTTP, proszę o inną publiczną stronę internetową? Dzięki – Zeddy

+0

Prawdopodobnie chcesz spojrzeć na [to] (https://stackoverflow.com/questions/92522/http-get-in-vb-net) i upewnij się, że złapałeś wyjątek, aby znaleźć przyczynę. – BoffinbraiN

+0

Hiya BoffinbraiN, dziękuję, że próbujesz mi pomóc. Nigdy nie udało mi się dowiedzieć, co jest nie tak, ponieważ czas był pilny i zleciłem integrację PayPal i zapłaciłem, aby został rozwiązany. Widząc, że jesteś jedyną osobą, która zaoferowała ci pomoc, zaznaczam twoją odpowiedź jako poprawną odpowiedź i przyznaję ci 50 punktów reputacji. Dziękuję za pomoc. – Zeddy