Metoda post zwraca html

Metoda post zwraca html
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
0

Hej Wszystkim,

Potrzebuję zaimplementować płatność PayU w swojej aplikacji. Na stronce PayU podali przykład jak zrobić nową płatność przy użyciu REST API. Mianowicie metoda post powinna zwrócić adres url który może nas przekierować do strony płatności. Przykład ze strony przy użyciu curl działa świetnie:

Kopiuj
curl -X POST https://secure.snd.payu.com/api/v2_1/orders \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer d9a4536e-62ba-4f60-8017-6053211d3f47" \
    -d '{
        "notifyUrl": "https://your.eshop.com/notify",
        "customerIp": "127.0.0.1",
        "merchantPosId": "300746",
        "description": "RTV market",
        "currencyCode": "PLN",
        "totalAmount": "21000",
        "buyer": {
            "email": "john.doe@example.com",
            "phone": "654111654",
            "firstName": "John",
            "lastName": "Doe",
            "language": "pl"
        },
        "products": [
            {
                "name": "Wireless Mouse for Laptop",
                "unitPrice": "15000",
                "quantity": "1"
            },
            {
                "name": "HDMI cable",
                "unitPrice": "6000",
                "quantity": "1"
            }
        ]
    }'

Jednak kiedy próbuję zrobić to samo z poziomu Pythona:

Kopiuj
import requests
import json

payload = {
"notifyUrl": "https://your.eshop.com/notify",
"customerIp": "127.0.0.1",
"merchantPosId": "300746",
"description": "RTV market",
"currencyCode": "PLN",
"totalAmount": "21000",
"buyer": {
"email": "john.doe@example.com",
"phone": "654111654",
"firstName": "John",
"lastName": "Doe",
"language": "pl"
},
"products": [
{
"name": "Wireless Mouse for Laptop",
"unitPrice": "15000",
"quantity": "1"
},
{
"name": "HDMI cable",
"unitPrice": "6000",
"quantity": "1"
}
]
}
headers = {
    'Authorization': 'Bearer d9a4536e-62ba-4f60-8017-6053211d3f47',
    'Content-Type': 'application/json',
}

to_json= json.dumps(payload)
resp = requests.post('https://secure.snd.payu.com/api/v2_1/orders',  data=to_json, headers=headers)


print(resp.text)

Nie będę wklejał całej odpowiedzi bo jest ogromna, ale zamiast jsona dostaję plik html (?). Co zabawne kiedy robię metodę GET, wszystko jest jak być powinno.
Czy ktoś spotkał się z podobnym problemem?

ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0

sproboj zamiast

Kopiuj
data 

uzyc

Kopiuj
json
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
0

@ledi12: Po zmianie serwer odpowiada:

Kopiuj
{"status":{"statusCode":"ERROR_SYNTAX","code":"103","codeLiteral":"ERROR_SYNTAX","statusDesc":"Bad syntax"}}

Ale wygląda na to, że to dobry trop więc teraz będę próbował zmienić formatowania jsona

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
0
bilborrd napisał(a):

@ledi12: Po zmianie serwer odpowiada:

Kopiuj
{"status":{"statusCode":"ERROR_SYNTAX","code":"103","codeLiteral":"ERROR_SYNTAX","statusDesc":"Bad syntax"}}

Ale wygląda na to, że to dobry trop więc teraz będę próbował zmienić formatowania jsona

Zamiast

Kopiuj
to_json= json.dumps(payload)
resp = requests.post('https://secure.snd.payu.com/api/v2_1/orders',  data=to_json, headers=headers)

zrób

Kopiuj
resp = requests.post('https://secure.snd.payu.com/api/v2_1/orders',  json=payload, headers=headers)
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
0

@TomRiddle: Zrobiłem i niestety wróciłem do punktu wyjścia. Dalej odpowiada jakimś wielkim html. Początek wygląda tak:

Kopiuj
<!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#abd037"> <title>PayU</title> <link rel="shortcut icon" type="image/png" href="favicon.png"> <link rel="icon" type="image/png" href="favicon_192x192.png" sizes="192x192"> <link type="text/css" rel="stylesheet" media="all" href="css/all.93b3563345a2.css"> <script type="text/javascript"> window.config = {
            piwikUrl: "",
            masterpassUrl: "https://sandbox.masterpass.com/dyn/js/switch/integration/MasterPass.client.js",
            newMasterpassEnabled: true,
            visaCheckoutUrl: "https://sandbox-assets.secure.checkout.visa.com/checkout-widget/resources/js/integration/v1/sdk.js",
            googlePayUrl: "https://pay.google.com/gp/p/js/pay.js",
            googlePayEnv: "TEST",
            googlePayMerchantId: "0",
            assetsUrl: "https://test.assets.payu.com",
            staticUrl: "https://static.payu.com"
        } </script> </head> <body> <div id="app"></div> <script async type="text/javascript" src="js/all.93b3563345a2.js"></script> <svg><symbol viewBox="0 0 38 25" id="a
Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
0
bilborrd napisał(a):

@TomRiddle: Zrobiłem i niestety wróciłem do punktu wyjścia. Dalej odpowiada jakimś wielkim html. Początek wygląda tak:

Kopiuj
<!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#abd037"> <title>PayU</title> <link rel="shortcut icon" type="image/png" href="favicon.png"> <link rel="icon" type="image/png" href="favicon_192x192.png" sizes="192x192"> <link type="text/css" rel="stylesheet" media="all" href="css/all.93b3563345a2.css"> <script type="text/javascript"> window.config = {
            piwikUrl: "",
            masterpassUrl: "https://sandbox.masterpass.com/dyn/js/switch/integration/MasterPass.client.js",
            newMasterpassEnabled: true,
            visaCheckoutUrl: "https://sandbox-assets.secure.checkout.visa.com/checkout-widget/resources/js/integration/v1/sdk.js",
            googlePayUrl: "https://pay.google.com/gp/p/js/pay.js",
            googlePayEnv: "TEST",
            googlePayMerchantId: "0",
            assetsUrl: "https://test.assets.payu.com",
            staticUrl: "https://static.payu.com"
        } </script> </head> <body> <div id="app"></div> <script async type="text/javascript" src="js/all.93b3563345a2.js"></script> <svg><symbol viewBox="0 0 38 25" id="a

Zapisz to albo otwórz ten HTML w przeglądarce i zobacz co tam jest napisane. Możliwe że jest tam ukryty jakiś błąd.

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
0

@TomRiddle: Niestety pusta strona w przeglądarce.

AF
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 172
0

Nie znam API PayU ale prawdopodobnie zostałeś przekierowany i dostałeś odpowiedź z nowego url. Zdebuguj skrypt i zajrzyj co jest pod resp.history - podejrzewam, że odpowiedź w JSONie z statusem 302.

Edit. Zajrzałem do dokumentacji. Jest dokładnie jak wyżej napisałem:
"Odpowiedź zwraca kod HTTP 302 oraz nagłówek Location ustawiony na redirectUri. Może być to powodem automatycznych przekierowań."

XA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 42
0

Udało się to jakoś naprawić? mam to samo...
Natomiast ja dostaje kod 200 wraz z tym HTML'em, nie wazne czy postman'em czy requests'em, daje application/json nawet naglowek z accept zeby wymusic i nic :/

TE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0
Xarenz napisał(a):

Udało się to jakoś naprawić? mam to samo...
Natomiast ja dostaje kod 200 wraz z tym HTML'em, nie wazne czy postman'em czy requests'em, daje application/json nawet naglowek z accept zeby wymusic i nic :/

Zdaje sobie sprawę, że upłynęło troche czasu, ale może moja odpowiedź pomoże komuś w przyszłości.
Musisz skonfigurować narzędzie do requestów (fetch, axios, co tam masz do komunikacji z endpointami) w taki sposób aby nie śledziło ono automatycznie przekierowań na zwróconą wartość nagłówka location.
Np. dla natywnego fetch, którego możesz użyć na froncie czy w node.js ma defaultowo redirect: "follow" (dlatego otrzymujesz kod html docelowej strony), trzeba to zmienić, pod headers musisz dodać:

Kopiuj
redirect: 'manual',

Po zmianie redirect otrzymasz bazową odpowiedź, czyli kod 302 oraz obiekt json, gdzie będzie location z urlem, którego szukasz.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.