Coder Social home page Coder Social logo

paynow-php-sdk's Introduction

Paynow PHP SDK

Build Status Latest Version Software License Total Downloads

Paynow PHP Library provides access to Paynow API from Applications written in PHP language.

Requirements

  • PHP 7.1 or higher
  • HTTP client implements php-http/client-implementation. For more information see the packages list.

Installation

Composer

Install the library using Composer

$ composer require pay-now/paynow-php-sdk

If you don't have HTTP client that implements PSR-18 you can use:

$ composer require pay-now/paynow-php-sdk nyholm/psr7 php-http/curl-client

Use autoloader

require_once('vendor/autoload.php');

Usage

Making a payment

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

$client = new Client('TestApiKey', 'TestSignatureKey', Environment::SANDBOX);
$orderReference = "success_1234567";
$idempotencyKey = uniqid($orderReference . '_');

$paymentData = [
    'amount' => '100',
    'currency' => 'PLN',
    'externalId' => $orderReference,
    'description' => 'Payment description',
    'buyer' => [
        'email' => '[email protected]'
    ]
];

try {
    $payment = new Payment($client);
    $result = $payment->authorize($paymentData, $idempotencyKey);
} catch (PaynowException $exception) {
    // catch errors
}

Handling notification with current payment status

use Paynow\Notification;

$payload = trim(file_get_contents('php://input'));
$headers = getallheaders();
$notificationData = json_decode($payload, true);

try {
    new Notification('TestSignatureKey', $payload, $headers);
    // process notification with $notificationData
} catch (Exception $exception) {
    header('HTTP/1.1 400 Bad Request', true, 400);
}

header('HTTP/1.1 202 Accepted', true, 202);

Making a payment's refund

use Paynow\Client;
use Paynow\Environment;
use Paynow\Exception\PaynowException;
use Paynow\Service\Refund;

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

try {
    $refund = new Refund($client);
    $result = $refund->create('YXZA-123-ABC-A01', uniqid(), 100);
} catch (PaynowException $exception) {
    // catch errors
}

Retrieving available payment methods

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

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

try {
    $payment = new Payment($client);
    $paymentMethods = $payment->getPaymentMethods('PLN', 100);
    $availablePaymentMethods = $paymentMethods->getAll();
} catch (PaynowException $exception) {
    // catch errors
}

Documentation

See the Paynow API documentation

Support

If you have any questions or issues, please contact our support at [email protected].

License

MIT license. For more information see the LICENSE file

paynow-php-sdk's People

Contributors

developermovecloser avatar emilleszczak2 avatar mateusz0lejnik avatar mateusztwardowski avatar michalskladanowski avatar pperzyna avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

paynow-php-sdk's Issues

[2.0] odpowiedź serwera w Paynow\Service\Payment::authorize() może być pusta

STR:

  1. utwórz zamówienie na kwotę < 1zł
  2. uruchom Paynow\Service\Payment::authorize()
  3. uruchom to samo ponownie z tym samym idempotencyKey

W odpowiedzi przychodzi pusty obiekt, czyli redirectUrl/paymentId/status są null - a to powoduje błąd:

TypeError: Return value of Paynow\Response\Payment\Authorize::getPaymentId() must be of the type string, null returned
Paynow\Response\Payment\Authorize::getPaymentId(), line 34

Teoretycznie dokumentacja nie przewiduje takiej odpowiedzi, ale myślę, że warto, żeby paynow-php-sdk uwzględniało ten przypadek i np. wyrzucało jakiś wyjątek

(przy okazji w Payment.php jest literówka: $decpdedApiResponse)

Laravel 9 - empty array on getPaymentMethods

Hello,

I'm integrating Paynow with Laravel 9 project / PHP 7.4.

public function availablePaymentMethods()
    {
        $client = new Client(config('paynow.api_key'), config('paynow.signature_key'), Environment::SANDBOX);
        try {
            $payment = new Payment($client);
            $paymentMethods = $payment->getPaymentMethods();
            $availablePaymentMethods = $paymentMethods->getAll();
            return response()->json($availablePaymentMethods);
        } catch (PaynowException $exception) {
            return response()->json('Error occurred', 400);
        }
    }

API returns 200, but it's content is only empty elements:

[
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{},
	{}
]

Http Client:

httpClient: Paynow\HttpClient\HttpClient {#499 ▼
    #client: Symfony\Component\HttpClient\Psr18Client {#503 ▼
      -client: Symfony\Component\HttpClient\CurlHttpClient {#506 ▶}
      -responseFactory: Nyholm\Psr7\Factory\Psr17Factory {#504}
      -streamFactory: Nyholm\Psr7\Factory\Psr17Factory {#505}
    }

Pobieranie danych

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?

Nie działa środowisko sandbox

Kiedy zacznie działać ?
Ta witryna jest nieosiągalnaNie udało się znaleźć adresu IP serwera ze stroną rrev.online.mbank.pl.
DNS_PROBE_FINISHED_NXDOMAIN

Old version of curl-client

This package is requiring curl-client in version ^1.7

This is old version, conflicting with i.e. php-http/httplug-bundle
Please update dependency to version ^2.x

Błąd przy pobieraniu statusu płatności

Przy próbie pobrania statusu płatności dostaję błąd:

Fatal error: Uncaught Paynow\Exception\PaynowException: Error occurred during processing request in D:\Bank danych\Projekty WWW\Payments\vendor\pay-now\paynow-php-sdk\src\Paynow\Service\Payment.php on line 53

Mój kod poniżej:

require __DIR__ . '/vendor/autoload.php';
if(isset($_GET['paymentId']) && isset($_GET['paymentStatus'])) {

	$client = new \Paynow\Client('XXX', 'XXX', 'sandbox');
	try {
		$paymentID = $_GET['paymentId'];
		
		$payment = new \Paynow\Service\Payment($client);
		$result = $payment->status($paymentID);
		var_dump($result);
	} catch (PaynowException $exception) {
	   var_dump($exception->getErrors());
	}
}

Klucze i sygnatury są prawidłowe.

Bazowanie na paymentId w przypadku podnoszenia płatności nie jest dobrym rozwiązaniem brakuje funkcjonalności

Scenariusz pozytywny

  1. Dodawanie płatności - otrzymujemy zwrotnie paymentId (XXX-XX-XX-XX), status (NEW), redirectUrl
  2. za pomocą redirectUrl przekierowujemy klienta do bramki
  3. klient opłaca i wraca. Sprawdzamy z URL paymentId ?paymentId=XXX-XX-XX-XX&paymentStatus=CONFIRMED.
  4. Sprawdzamy status płatności wykorzystując paymentId przez API i mamy informacje o wpłacie do konkretnego zamówienia (oczywiście paymentId XXX-XX-XX-XX rejestrujemy w bazie podczas tworzenia płatności aby odpytać API o status płatności i porównać z URL powrotu).

Scenariusz problematyczny

  1. Dodawanie płatności - otrzymujemy zwrotnie paymentId (XXX-XX-XX-XX), status (NEW), redirectUrl
  2. za pomocą redirectUrl przekierowujemy klienta do bramki
  3. klient ma problem z płatnością (błędny BLIK czy cokolwiek). Ponawia płatność i po stronie bramki generuje się nowy paymentId (YYY-YY-YY-YY). Załóżmy, że zapłaci i wraca do sklepu ale jego paymentId to YYY-YY-YY-YY. Sprawdzamy z URL paymentId ?paymentId=YYY-YY-YY-YY&paymentStatus=CONFIRMED. Symbol XXX-XX-XX-XX ma status ABANDONED i nie ma żadnych informacji o powiazaniu YYY-YY-YY-YY z XXX-XX-XX-XX
  4. Sprawdzamy status płatności wykorzystując paymentId powrotu YYY-YY-YY-YY ( ?paymentId=YYY-YY-YY-YY&paymentStatus=CONFIRMED). I nie możemy z niczym tego powiązać.

Na początku utrzymujemy paymentId XXX-XX-XX-XX (przykład) następnie podczas podnoszenia płatności w bramce (poza sklepem) tworzona jest nowa sesja YYY-YY-YY-YY. ?paymentId=YYY-YY-YY-YY&paymentStatus=CONFIRMED. Do czego podpiąć YYY-YY-YY-YY my nie mamy informacji jakiej transakcji to dotyczy.

Jak wykonać zwrot kiedy to też bazuje na paymentId? My mamy informacje o XXX-XX-XX-XX a nie o YYY-YY-YY-YY
Rozwiązanie kiedy ktoś musi łączyć wpłaty logując się do panelu jest słabe.

Błąd podczas zwracania środków

Próbuję dokonać zwrotu środków, ale podczas wywoływania metody create na obiekcie klasy Refund otrzymuję poniższy błąd:

( ! ) Fatal error: Uncaught TypeError: Return value of Paynow\Response\Refund\Status::getStatus() must be of the type string, null returned in /home/pfilipek/homewww/omnipay-paynow/vendor/pay-now/paynow-php-sdk/src/Paynow/Response/Refund/Status.php on line 28
( ! ) TypeError: Return value of Paynow\Response\Refund\Status::getStatus() must be of the type string, null returned in /home/pfilipek/homewww/omnipay-paynow/vendor/pay-now/paynow-php-sdk/src/Paynow/Response/Refund/Status.php on line 28

Poniżej fagment kodu, który próbuję wywołać:

$client = new Client('api_key', 'signature_key', Environment::SANDBOX);
$refund = new Refund($client);
		
$result = $refund->create(
    'NOHH-7I9-BJM-7DU',
    '61379fb47c049',
    200,
    'OTHER'
);

Sprawdziłem w vendorze i faktycznie, z klienta HTTP faktycznie nie dostajemy żadnej odpowiedzi. Brzmi to trochę jak problem z API, a nie z samą biblioteką.

Metoda Paynow\Response\PaymentMethods\PaymentMethods::getAll() może zwrócić null

Deklaracja parametru metody wygląda w ten sposób:

    /**
     * @var PaymentMethod[]
     */
    private $list;

A getter dla tego parametru wygląda tak:

    /**
     * Retrieve all available payment methods
     *
     * @return PaymentMethod[]
     */
    public function getAll()
    {
        return $this->list;
    }

Jest to jednak zbyt optymistyczne podejście...

Konstruktor klasy wygląda tak:

    public function __construct($body)
    {
        if (! empty($body)) {
            foreach ($body as $group) {
                if (! empty($group->paymentMethods)) {
                    foreach ($group->paymentMethods as $item) {
                        $this->list[] = new PaymentMethod(
                            $item->id,
                            $group->type,
                            $item->name,
                            $item->description,
                            $item->image,
                            $item->status,
                            $item->authorizationType ?? null
                        );
                    }
                }
            }
        }
    }

Istnieje więc szansa, że zmienna $body lub $group->paymentMethods będzie pusta, więc w rezultacie nie dojdziemy nawet do wypełnienia $this->list.

Rozwiązanie:
Zmienić deklarację parametru na taką:

private array $list = [];

Swoją drogą, kiedy przejście kodem na PHP 8.2?

Missing option to override notification url

API should allow to override notification url set in panel, same as it allows to override return_url

It would simplify clients workflow in end applications - there would be no need to instruct user to put in proper notification url in panel.

Kwoty z groszami

Gdy podaje amount zawierający grosze to nie działa. Bardzo proszę o pomoc.
Podaje kwotę: 101.21
$exception->getErrors() zwraca błąd:
[0] => Paynow\Exception\Error Object
(
[type:Paynow\Exception\Error:private] => VALIDATION_ERROR
[message:Paynow\Exception\Error:private] => amount: invalid numeric value: 101.2099999999999937472239253111183643341064453125
)

Poprawka w dokumentacji notyfikacji

W README mamy opisane jak używać notyfikacji przy pomocy SDK, ale w dokumentacji nie ma nawet słowa co taka notyfikacja zwraca, w jakim formacie itd. Jest tylko opisane jak zmienić adres do notyfikacji.

Refund API Error

Dear PayNow,

I've tried to use your Refund Service, but it looks like there is an API error.
The underlying HTTP request in the create function returns null.

How to replicate it?

$refund = new Refund(new Client($this->config['key'], $this->config['signature'], $this->config['environment']));
$response = $refund->create('R3FU-UND-D8K-WZD', '5e3b80f7-c48c-429c-9686-ddba817e8231', 1000, 'RMA');

Expected output:
The Status object

Adres notyfikacji URL - feature.

Cześć,
Mam dla Was przyszłościową opcję bez której w sumie nie mogę Was teraz zintegrować :)

Mam platformę, na której ludzie mogą tworzyć własne sklepy pod własnym adresem URL (!!), w których są 4 rodzaje produktów, które mają osobne skrypty do otrzymywania powiadomień o płatności.

W takim razie każdy sklep ma 4 różne możliwe adresy URL do otrzymywania powiadomień o płatności - u Was jest opcja wpisania jednego adresu notyfikacji i to tylko w ustawieniach konta :) potrzebuję opcji w której mogę Wam przekazać adres do dostarczenia mi notyfikacji poprzez API.

Inne serwisy takie jak Paypal, Tpay, PayU, Dotpay, Przelewy24, Hotpay mają zintegrowany formularz z opcjonalną zmienną typu „notification_url” podczas tworzenia transakcji, gdzie przesyłają status transakcji - jak widać nie jest to głupio wymyślona opcja przeze mnie :) ale stosowana od dawna przez innych.

Możecie to wdrożyć jak najszybciej?
Pozdrawiam

błędny phpdoc w Paynow\Service\Payment::authorize()

 class Payment extends Service
{
    /**
     * @return ApiResponse
     */
    public function authorize(array $data, $idempotencyKey = null)
    {
        try {
            return $this->getClient()
                ->getHttpClient()
                ->post(
                    Configuration::API_VERSION.'/payments',
                    $data,
                    $idempotencyKey ? $idempotencyKey : $data['externalId']
                )
                ->decode();

Powyższy kod zwraca zdekodowanego JSONa a nie ApiResponse tak jak jest w phpdoc

Wdrożenie płatności formularz danych POST

Wdrożenie płatności.

Witam mam problem z koncepcja Państwa płatności, a [email protected] niestety NIE RACZY opowiadać!

Zatem o co mi chodzi - W systemie przeley24, PayPal itd... w celu zainicjowania płatności = obsłużenia wysyłamy dane POST z formularza w którym may klienta, za co płaci, cenę itd...

<form action="https://sandbox.przelewy24.pl/trnDirect" method="post" class="form" id="formplatonline">
<input type="text" name="p24_session_id" value="<?php echo $p24_session_id;?>">
<input type="text" name="p24_merchant_id" value="<?php echo $p24_merchant_id;?>">
<input type="text" name="p24_pos_id" value="<?php echo $p24_merchant_id;?>">
<input type="text" name="p24_amount" value="<?php echo $p24_amount;?>">
ITD....
<input type="submit" value="go" />
</form>

ITD.... Wysłanie formularza przenosi do systemu transakcyjnego na stronę wyboru banku itd...

Drugim etapem jest mechanizm odbioru płatności ale to się dzieje w tle.

Wiec pytanie brzmi jak to samo zrealizować u Was paynow.pl ?
W dokumentacji nie znajduje nic o analogicznym formularzu ?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.