pay-now / paynow-php-sdk

PHP Library for Paynow API
https://docs.paynow.pl
MIT License
15 stars 10 forks source link

Pobieranie danych #15

Closed Blaaszkovsky closed 4 years ago

Blaaszkovsky commented 4 years ago

Cześć, chciałem zrobić integracje na swoim stronie z formularzem kontaktowym, aby można było wykonywać określone płatności. Aktualnie utknąłem na błędzie z wykonaniem Requestu. Obliczyłem signaturekey oraz wpisałem apikey - wszystkie z konta sandboxowego. Jednak na stronie po walce z tym wszystkim wychodzi

Fatal error: Uncaught Paynow\Exception\PaynowException: Error occurred during processing request in /usr/home/olszowkapokoje/domains/dev.olszowkapokoje.com.pl/public_html/vendor/pay-now/paynow-php-sdk/src/Paynow/Service/Payment.php:32 Stack trace: #0 /usr/home/olszowkapokoje/domains/dev.olszowkapokoje.com.pl/public_html/index.php(35): Paynow\Service\Payment->authorize(Array, '15df79791cde568...') #1 {main} thrown in /usr/home/olszowkapokoje/domains/dev.olszowkapokoje.com.pl/public_html/vendor/pay-now/paynow-php-sdk/src/Paynow/Service/Payment.php on line 32

Co mogę robić nie tak?

emilleszczak2 commented 4 years ago

@Blaaszkovsky Sprawdź czy poprawnie skopiowałeś i wprowadziłeś klucze.

Jeśli złapiesz sobie wyjątek, to będziesz w stanie sprawdzić co jest powodem.

try {
    $response = $paymentService->authorize($paymentData, 'idempotencyKey123');
    // ... do something
} catch (PaynowException $exception) {
    // catch error from $exception->getCode() or $exception->getErrors()
}
Blaaszkovsky commented 4 years ago

Nawet po wprowadzeniu wyjątku, nie pobiera mi go. Cały kod wygląda tak: Wydaje mi się, że wszystkie klucze dobrze wprowadzam i gdzieś się wywala, ale nie mam pojęcia gdzie może być przyczyna.


    require_once('vendor/autoload.php');

    use Paynow\HttpClient;
    use Paynow\Payment;

    $orderReference = "1";
    $idempotencyKey = uniqid($orderReference, true);

    $paymentData = [
        "amount" => 10,
        "externalId" => $orderReference,
        "description" => "Payment description",
        "buyer" => [
            "email" => "wujek.blacha@gmail.com"
            ]
        ];

    $hash = new \Paynow\Util\SignatureCalculator('KLUCZ DO OBLICZANIA PODPISU', $paymentData);

    $client = new \Paynow\Client('KLUCZ DO API', $hash, '', 'Zaliczki');
    $payment = new \Paynow\Service\Payment($client);

    // print_r($payment);exit;
    //$result = $payment->authorize($paymentData, $idempotencyKey);

    try {
        $result = $payment->authorize($paymentData, $idempotencyKey);
        var_dump($result);
    } catch (PaynowException $exception) {
        // catch error from $exception->getCode() or $exception->getErrors()
        $exception->getErrors();
    }
emilleszczak2 commented 4 years ago

Nie musisz wyliczać hash'a, zrobi to za Ciebie SDK podczas wysyłania wiadomości.

W pliku README.md znajdziesz przykład:

$client = new \Paynow\Client('TestApiKey', 'TestSignatureKey', Environment::SANDBOX);

gdzie:

Jeśli chcesz natomiast zobaczyc jakim błędem odpowiedziało do Ciebie API:

var_dump($exception->getErrors());
Blaaszkovsky commented 4 years ago

Zrobiłem tak jak mówiłeś i dalej jest ten sam błąd. Usunąłem wyliczanie hashu i skopiowałem cały klucz i dalej ten sam błąd.


    try {
      $payment = new \Paynow\Service\Payment($client);
      $result = $payment->authorize($paymentData, $idempotencyKey);
    } catch (PaynowException $exception) {
        // catch errors
        var_dump($exception->getErrors());
    }
emilleszczak2 commented 4 years ago

Co dostałeś w odpowiedzi z API ? Czy zmieniłeś TestApiKey oraz TestSignatureKey na wartości skopiowane z Panelu Merchanta?

Blaaszkovsky commented 4 years ago

@emilleszczak2 zmieniłem wartości w TestApiKey oraz TestSignatureKey na wartości skopiowane z merchanta. Najpierw obliczałem to, ale gdy powiedziałeś, że SDK zrobi to za mnie, to zmieniłem tak jak wskazałeś wyżej.

Po wrzuceniu tego w try mimo wszystko mam błąd, który wysłałem w pierwszej wiadomości.

Blaaszkovsky commented 4 years ago

Dodatkowo nie wiem czemu, ale przy użyciu Environment::SANDBOX mam błąd, że klasa Environment nie istnieje.

Blaaszkovsky commented 4 years ago

@emilleszczak2 spróbowałem zrobić to za pomocą zwykłego połączenia GuzzleHttp - występuje błąd z weryfikacją Signature Key, mimo, że podaję taki jaki mam w panelu merchanta.

<?php

require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

$paymentData = [
    "amount" => 10,
    "externalId" => 'abcdefgh',
    "description" => "Description",
    "buyer" => [
        "email" => "wujek.blacha@gmail.com"
        ]
    ];

class HashCalculator {

  private $hmacAlgorithm = "sha256";
  private $key = "SINGATURE KEY";

  public function calculateHmac(array $data) {
    return base64_encode(hash_hmac($this->hmacAlgorithm, json_encode($data), $this->key, true));
  }
}

$hash = new HashCalculator;
$signature = $hash->calculateHmac($paymentData);

$request = $client->request('POST', 'https://api.sandbox.paynow.pl/v1/payments', [
    'headers' => [
        'Api-Key' => 'API KEY',
        'Signature' => $signature,
        'Indempotency-Key' => 'Test',
        'Accept' => '*/*',
        'Content-Type' => 'application/json'
    ],
    'Accept' => 'application/json'
]);

var_dump($request);

// try {
//     var_dump($request)
// } catch ()
emilleszczak2 commented 4 years ago

Prześlij na support@paynow.pl swój plik z integracją. Spróbujemy pomóc.

Blaaszkovsky commented 4 years ago

@emilleszczak2 pisałem, mam nadzieję, że szybko podejmiecie działanie.

emilleszczak2 commented 4 years ago

@Blaaszkovsky nie dostaliśmy od Ciebie maila z plikiem.

Blaaszkovsky commented 4 years ago

@emilleszczak2 poszło.

emilleszczak2 commented 4 years ago

@Blaaszkovsky Poniżej wrzucam poprawiony Twój plik:

<?php

require 'vendor/autoload.php';

use Paynow\Environment;
use Paynow\Exception\PaynowException;
use Paynow\Service\Payment;

$client = new \Paynow\Client('API_KEY', 'SIGNATURE_KEY', Environment::SANDBOX);
$idempotencyKey = 'Test';
$paymentData = [
    "amount" => 100,
    "currency" => "PLN",
    "externalId" => '12345dsfsdf',
    "description" => "Description",
    "buyer" => [
        "email" => "wujek.blacha@gmail.com"
    ]
];

try {
    $payment = new Payment($client);
    $result = $payment->authorize($paymentData, $idempotencyKey);
    var_dump($result);
} catch (PaynowException $exception) {
    var_dump($exception->getErrors());
}
Blaaszkovsky commented 4 years ago

Teraz wszystko działa, na czym polegał błąd. skoro wszystko wygląda praktycznie tak samo? :D