Files
grzanieplus.pl/plugins/stPrzelewy24Plugin/lib/Przelewy24.class.php
2025-03-12 17:06:23 +01:00

271 lines
6.7 KiB
PHP

<?php
/**
* Przelewy24 comunication class
*
* @author DialCom24 Sp. z o.o.
* @copyright DialCom24 Sp. z o.o.
* @version 1.1
* @since 2014-04-29
*/
/**
*
* Communication protol version
* @var double
*/
define("P24_VERSION", "3.2");
class Przelewy24
{
/**
* Live system URL address
* @var string
*/
private $hostLive = "https://secure.przelewy24.pl/";
/**
* Sandbox system URL address
* @var string
*/
private $hostSandbox = "https://sandbox.przelewy24.pl/";
/**
* Use Live (false) or Sandbox (true) enviroment
* @var bool
*/
private $testMode = false;
/**
* Merchant posId
* @var int
*/
private $posId = 0;
/**
* Salt to create a control sum (from P24 panel)
* @var string
*/
private $salt = "";
/**
* Array of POST data
* @var array
*/
private $postData = array();
/**
*
* Obcject constructor. Set initial parameters
* @param int $merchantId
* @param int $posId
* @param string $salt
* @param bool $testMode
*/
public function __construct($merchantId, $posId, $salt, $testMode = false)
{
$this->posId = (int) $posId;
$this->salt = $salt;
if ($testMode)
{
$this->hostLive = $this->hostSandbox;
}
$this->addValue("p24_merchant_id", $merchantId);
$this->addValue("p24_pos_id", $this->posId);
$this->addValue("p24_api_version", P24_VERSION);
return true;
}
/**
*
* Returns host URL
*/
public function getHost()
{
return $this->hostLive;
}
/**
*
* Add value do post request
* @param string $name Argument name
* @param mixed $value Argument value
* @todo Add postData validation
*/
public function addValue($name, $value)
{
$this->postData[$name] = $value;
}
/**
* Returns post request values
*
* @return array
*/
public function getValues()
{
return $this->postData;
}
/**
*
* Function is testing a connection with P24 server
* @return array Array(INT Error, Array Data), where data
*/
public function testConnection()
{
$crc = md5($this->posId . "|" . $this->salt);
$ARG["p24_pos_id"] = $this->posId;
$ARG["p24_sign"] = $crc;
$RES = $this->callUrl("testConnection", $ARG);
return $RES;
}
/**
*
* Prepare a transaction request
* @param bool $redirect Set true to redirect to Przelewy24 after transaction registration
* @return array array(INT Error code, STRING Token)
*/
public function trnRegister($redirect = false)
{
$crc = md5($this->postData["p24_session_id"] . "|" . $this->posId . "|" . $this->postData["p24_amount"] . "|" . $this->postData["p24_currency"] . "|" . $this->salt);
$this->addValue("p24_sign", $crc);
$RES = $this->callUrl("trnRegister", $this->postData);
if ($RES["error"] == "0")
{
$token = $RES["token"];
}
else
{
return $RES;
}
if ($redirect)
{
$this->trnRequest($token);
}
return array("error" => 0, "token" => $token);
}
/**
* Redirects or returns URL to a P24 payment screen
* @param string $token Token
* @param bool $redirect If set to true redirects to P24 payment screen. If set to false function returns URL to redirect to P24 payment screen
* @return string URL to P24 payment screen
*/
public function trnRequest($token, $redirect = true)
{
if ($redirect)
{
header("Location:" . $this->hostLive . "trnRequest/" . $token);
return "";
}
else
{
return $this->hostLive . "trnRequest/" . $token;
}
}
/**
*
* Function verify received from P24 system transaction's result.
* @return array
*/
public function trnVerify()
{
$crc = md5($this->postData["p24_session_id"] . "|" . $this->postData["p24_order_id"] . "|" . $this->postData["p24_amount"] . "|" . $this->postData["p24_currency"] . "|" . $this->salt);
$this->addValue("p24_sign", $crc);
$RES = $this->callUrl("trnVerify", $this->postData);
return $RES;
}
/**
*
* Function contect to P24 system
* @param string $function Method name
* @param array $ARG POST parameters
* @return array array(INT Error code, ARRAY Result)
*/
private function callUrl($function, $ARG)
{
if (!in_array($function, array("trnRegister", "trnRequest", "trnVerify", "testConnection")))
{
return array("error" => 201, "errorMessage" => "class:Method not exists");
}
$REQ = array();
foreach ($ARG as $k => $v) $REQ[] = $k . "=" . urlencode($v);
$url = $this->hostLive . $function;
$user_agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
if ($ch = curl_init())
{
if (count($REQ))
{
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, join("&", $REQ));
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
if ($result = curl_exec($ch))
{
$INFO = curl_getinfo($ch);
$error = curl_error($ch);
curl_close($ch);
if ($INFO["http_code"] != 200)
{
return array("error" => $INFO["http_code"], "errorMessage" => "HTTP connection error (" . $INFO["http_code"] . ")");
}
else
{
$RES = array();
$X = explode("&", $result);
foreach ($X as $val)
{
$Y = explode("=", $val);
$RES[trim($Y[0])] = urldecode(trim($Y[1]));
}
return $RES;
}
}
else
{
$error = curl_error($ch);
curl_close($ch);
return array("error" => 203, "errorMessage" => $error);
}
}
else
{
return array("error" => 202, "errorMessage" => "call:Curl init error");
}
}
}