first commit

This commit is contained in:
2024-07-15 11:28:08 +02:00
commit f52d538ea5
21891 changed files with 6161164 additions and 0 deletions

View File

@@ -0,0 +1,89 @@
<?php
/**
* File that define P24_Rest_Abstract class.
*
* @package Przelewy24
*/
defined( 'ABSPATH' ) || exit;
/**
* Base class for REST API transaction.
*/
class P24_Rest_Abstract {
const URL_SECURE = 'https://secure.przelewy24.pl/api/v1';
const URL_SANDBOX = 'https://sandbox.przelewy24.pl/api/v1';
/**
* Url.
*
* @var string|null
*/
protected $url;
/**
* Config accessor.
*
* @var P24_Config_Accessor
*/
protected $cf;
/**
* Przelewy24RestAbstract constructor.
*
* @param P24_Config_Accessor $cf
*/
public function __construct( P24_Config_Accessor $cf ) {
$this->cf = clone $cf;
$this->cf->access_mode_to_strict();
if ( $this->cf->is_p24_operation_mode( 'sandbox' ) ) {
$this->url = self::URL_SANDBOX;
} else {
$this->url = self::URL_SECURE;
}
}
/**
* Call rest command
*
* @param string $path Api path.
* @param array|object|null $payload Method call parameters.
* @param string $method Method name.
*
* @return array
*/
protected function call( $path, $payload, $method ) {
$credentials = $this->cf->get_shop_id() . ':' . $this->cf->get_p24_api();
$json_style = JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES;
$options = array(
CURLOPT_USERPWD => $credentials,
CURLOPT_URL => $this->url . $path,
CURLOPT_RETURNTRANSFER => true,
);
if ( 'PUT' === $method ) {
$options[ CURLOPT_CUSTOMREQUEST ] = 'PUT';
}
if ( 'GET' !== $method ) {
$headers = array(
'Content-Type: application/json',
);
$options[ CURLOPT_POST ] = true;
$options[ CURLOPT_HTTPHEADER ] = $headers;
$options[ CURLOPT_POSTFIELDS ] = wp_json_encode( $payload, $json_style );
}
$h = curl_init();
curl_setopt_array( $h, $options );
$ret = curl_exec( $h );
curl_close( $h );
$decoded = json_decode( $ret, true );
if ( ! is_array( $decoded ) ) {
$decoded = array();
}
return $decoded;
}
}

View File

@@ -0,0 +1,33 @@
<?php
/**
* File that define P24_Rest_Blik class.
*
* @package Przelewy24
*/
defined( 'ABSPATH' ) || exit;
/**
* Class that support card API.
*/
class P24_Rest_Blik extends P24_Rest_Abstract {
/**
* Charge by code
*
* @param string $token Przelewy24 transaction token.
* @param string $blik_code Blik code.
*
* @return array
*/
public function charge_by_code( $token, $blik_code ) {
$path = '/paymentMethod/blik/chargeByCode';
$payload = array(
'token' => $token,
'blikCode' => $blik_code,
);
$ret = $this->call( $path, $payload, 'POST' );
return $ret;
}
}

View File

@@ -0,0 +1,72 @@
<?php
/**
* File that define P24_Rest_Card class.
*
* @package Przelewy24
*/
defined( 'ABSPATH' ) || exit;
/**
* Class that support card API.
*/
class P24_Rest_Card extends P24_Rest_Abstract {
/**
* Charge with 3ds.
*
* @param string $token Przelewy24 transaction token.
* @return array
*/
public function chargeWith3ds( $token ) {
$path = '/card/chargeWith3ds';
$payload = array(
'token' => $token,
);
$ret = $this->call( $path, $payload, 'POST' );
return $ret;
}
/**
* Charge without 3ds.
*
* @param string $token Przelewy24 transaction token.
* @return array
*/
public function chargeWithout3ds( $token ) {
$path = '/card/charge';
$payload = array(
'token' => $token,
);
$ret = $this->call( $path, $payload, 'POST' );
return $ret;
}
/**
* Pay.
*
* @param array $payload Array with transaction data required to make card payment.
*
* @return array
*/
public function pay( $payload ) {
$path = '/card/pay';
$ret = $this->call( $path, $payload, 'POST' );
return $ret;
}
/**
* Info.
*
* @param string $order_id Order id used to collect card data with.
*
* @return array
*/
public function info( $order_id ) {
return $this->call( '/card/info/' . $order_id, null, 'GET' );
}
}

View File

@@ -0,0 +1,80 @@
<?php
/**
* File that define P24_Rest_Common class.
*
* @package Przelewy24
*/
defined( 'ABSPATH' ) || exit;
/**
* Class that support card API.
*/
class P24_Rest_Common extends P24_Rest_Abstract {
/**
* Test access.
*
* @return array
*/
public function test_access() {
$path = '/testAccess';
$ret = $this->call( $path, null, 'GET' );
return $ret;
}
/**
* Test access bool.
*
* @return bool
*/
public function test_access_bool() {
$data = $this->test_access();
return isset( $data['error'] ) && empty( $data['error'] );
}
/**
* Get payment methods (internal).
*
* @param string $lang One of supported languages (only 'pl' and 'en' for now).
*
* @return array
*
* @throws LogicException When wrong language is provided.
*/
public function payment_methods( $lang ) {
$ret = $this->payment_methods_internal( $lang );
$new_data = array();
foreach ( $ret['data'] as $row ) {
if ( Przelewy24Generator::P24NOW !== $row['id'] ) {
$new_data[] = $row;
}
}
$ret['data'] = $new_data;
return $ret;
}
/**
* Get payment methods (internal).
*
* @param string $lang One of supported languages (only 'pl' and 'en' for now).
*
* @return array
*
* @throws LogicException When wrong language is provided.
*/
private function payment_methods_internal( $lang ) {
if ( ! in_array( $lang, array( 'pl', 'en' ), true ) ) {
$msg = 'The lang ' . $lang . ' is not supported.';
throw new LogicException( esc_html( $msg ) );
}
$path = '/payment/methods/' . $lang;
$ret = $this->call( $path, null, 'GET' );
return $ret;
}
}

View File

@@ -0,0 +1,76 @@
<?php
/**
* File that define P24_Rest_Heavy class.
*
* @package Przelewy24
*/
defined( 'ABSPATH' ) || exit;
/**
* Class that cache few REST requests.
*/
class P24_Rest_Heavy {
/* Key used for cache. */
const CACHE_KEY_PREFIX = 'p24-wc8-gateway-plugin-methods-';
/**
* @var P24_Rest_Common
*/
private $rest_common;
/**
* P24_Rest_Heavy constructor.
*
* @param P24_Config_Accessor $cf
*/
public function __construct( P24_Config_Accessor $cf ) {
$this->rest_common = new P24_Rest_Common( $cf );
}
/**
* Get payment methods, use cache.
*
* @param string $lang One of supported languages (only 'pl' and 'en' for now).
*
* @return array
*
* @throws LogicException When wrong language is provided.
*/
public function payment_methods( $lang ) {
if ( ! in_array( $lang, array( 'pl', 'en' ), true ) ) {
throw new LogicException( 'The lang ' . $lang . ' is not supported.' );
}
$key = self::CACHE_KEY_PREFIX . $lang;
$ret = get_transient( $key );
if ( ! $ret ) {
$ret = $this->rest_common->payment_methods( $lang );
set_transient( $key, $ret, 180 );
}
return $ret;
}
/**
* Get payment methods and reset cache.
*
* @param string $lang One of supported languages (only 'pl' and 'en' for now).
*
* @return array
*
* @throws LogicException When wrong language is provided.
*/
public function payment_methods_uncached( $lang ) {
if ( ! in_array( $lang, array( 'pl', 'en' ), true ) ) {
throw new LogicException( 'The lang ' . $lang . ' is not supported.' );
}
$key = self::CACHE_KEY_PREFIX . $lang;
$ret = $this->rest_common->payment_methods( $lang );
set_transient( $key, $ret, 180 );
return $ret;
}
}

View File

@@ -0,0 +1,146 @@
<?php
/**
* File that define P24_Rest_Transaction class.
*
* @package Przelewy24
*/
defined( 'ABSPATH' ) || exit;
/**
* Class that support transaction API.
*/
class P24_Rest_Transaction extends P24_Rest_Abstract {
/**
* Register.
*
* @param array $payload
* @return array
*/
public function register( $payload ) {
$path = '/transaction/register';
$payload['sign'] = $this->sign_sha_384_register( $payload );
return $this->call( $path, $payload, 'POST' );
}
/**
* Register raw token.
*
* @param array $payload Array with payload data.
*
* @return string|null
*/
public function register_raw_token( $payload ) {
$res = $this->register( $payload );
if ( isset( $res['data']['token'] ) ) {
return $res['data']['token'];
} else {
return null;
}
}
/**
* Register.
*
* @param array $payload
* @return array
*/
public function verify( $payload ) {
$path = '/transaction/verify';
$payload['sign'] = $this->sign_sha_384_verify( $payload );
return $this->call( $path, $payload, 'PUT' );
}
/**
* Register.
*
* @param array $payload Array with optional data -> status field.
*
* @return bool
*/
public function verify_bool( $payload ) {
$res = $this->verify( $payload );
if ( isset( $res['data']['status'] ) ) {
$status = $res['data']['status'];
} else {
$status = '';
}
return 'success' === $status;
}
/**
* Register.
*
* @param array $payload Array with transaction refund data.
*
* @return array
*/
public function refund( $payload ) {
$path = '/transaction/refund';
return $this->call( $path, $payload, 'POST' );
}
/**
* By_session_id.
*
* @param string $session_id Session id of transaction to search for by REST api.
*
* @return array
*
* @throws InvalidArgumentException When invalid session id is provided.
*/
public function by_session_id( $session_id ) {
/* RFC 3986 unreserved characters. */
if ( ! preg_match( '/^[a-zA-Z0-9\\_\\.\\-\\~]+$/', $session_id ) ) {
/* We do not support other than unreserved characters in $session_id. */
throw new InvalidArgumentException( 'Invalid session id provided.' );
}
$path = '/transaction/by/sessionId/' . $session_id;
return $this->call( $path, null, 'GET' );
}
/**
* Sign sha384.
*
* @param array $payload
* @return string
*/
public function sign_sha_384_register( $payload ) {
$data = array(
'sessionId' => $payload['sessionId'],
'merchantId' => $payload['merchantId'],
'amount' => $payload['amount'],
'currency' => $payload['currency'],
'crc' => $this->cf->get_salt(),
);
$string = json_encode( $data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );
$sign = hash( 'sha384', $string );
return $sign;
}
/**
* Sign sha384.
*
* @param array $payload
* @return string
*/
private function sign_sha_384_verify( $payload ) {
$data = array(
'sessionId' => $payload['sessionId'],
'orderId' => $payload['orderId'],
'amount' => $payload['amount'],
'currency' => $payload['currency'],
'crc' => $this->cf->get_salt(),
);
$string = json_encode( $data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );
$sign = hash( 'sha384', $string );
return $sign;
}
}