Permalink
317 lines (275 sloc) 8.53 KB
<?php
/**
* OpenPayU Standard Library
*
* @copyright Copyright (c) 2011-2016 PayU
* @license http://opensource.org/licenses/LGPL-3.0 Open Software License (LGPL 3.0)
* http://www.payu.com
* http://developers.payu.com
*/
class OpenPayU_Util
{
/**
* Function generate sign data
*
* @param array $data
* @param string $algorithm
* @param string $merchantPosId
* @param string $signatureKey
*
* @return string
*
* @throws OpenPayU_Exception_Configuration
*/
public static function generateSignData(array $data, $algorithm = 'SHA-256', $merchantPosId = '', $signatureKey = '')
{
if (empty($signatureKey))
throw new OpenPayU_Exception_Configuration('Merchant Signature Key should not be null or empty.');
if (empty($merchantPosId))
throw new OpenPayU_Exception_Configuration('MerchantPosId should not be null or empty.');
$contentForSign = '';
ksort($data);
foreach ($data as $key => $value) {
$contentForSign .= $key . '=' . urlencode($value) . '&';
}
if (in_array($algorithm, array('SHA-256', 'SHA'))) {
$hashAlgorithm = 'sha256';
$algorithm = 'SHA-256';
} else if ($algorithm == 'SHA-384') {
$hashAlgorithm = 'sha384';
$algorithm = 'SHA-384';
} else if ($algorithm == 'SHA-512') {
$hashAlgorithm = 'sha512';
$algorithm = 'SHA-512';
}
$signature = hash($hashAlgorithm, $contentForSign . $signatureKey);
$signData = 'sender=' . $merchantPosId . ';algorithm=' . $algorithm . ';signature=' . $signature;
return $signData;
}
/**
* Function returns signature data object
*
* @param string $data
*
* @return null|object
*/
public static function parseSignature($data)
{
if (empty($data)) {
return null;
}
$signatureData = array();
$list = explode(';', rtrim($data, ';'));
if (empty($list)) {
return null;
}
foreach ($list as $value) {
$explode = explode('=', $value);
if (count($explode) != 2) {
return null;
}
$signatureData[$explode[0]] = $explode[1];
}
return (object)$signatureData;
}
/**
* Function returns signature validate
*
* @param string $message
* @param string $signature
* @param string $signatureKey
* @param string $algorithm
*
* @return bool
*/
public static function verifySignature($message, $signature, $signatureKey, $algorithm = 'MD5')
{
if (isset($signature)) {
if ($algorithm === 'MD5') {
$hash = md5($message . $signatureKey);
} else if (in_array($algorithm, array('SHA', 'SHA1', 'SHA-1'))) {
$hash = sha1($message . $signatureKey);
} else {
$hash = hash('sha256', $message . $signatureKey);
}
if (strcmp($signature, $hash) == 0) {
return true;
}
}
return false;
}
/**
* Function builds OpenPayU Json Document
*
* @param string $data
* @param string $rootElement
*
* @return null|string
*/
public static function buildJsonFromArray($data, $rootElement = '')
{
if (!is_array($data)) {
return null;
}
if (!empty($rootElement)) {
$data = array($rootElement => $data);
}
$data = self::setSenderProperty($data);
return json_encode($data);
}
/**
* @param string $data
* @param bool $assoc
* @return mixed|null
*/
public static function convertJsonToArray($data, $assoc = false)
{
if (empty($data)) {
return null;
}
return json_decode($data, $assoc);
}
/**
* @param array $array
* @return bool|stdClass
*/
public static function parseArrayToObject($array)
{
if (!is_array($array)) {
return $array;
}
if (self::isAssocArray($array)) {
$object = new stdClass();
} else {
$object = array();
}
if (is_array($array) && count($array) > 0) {
foreach ($array as $name => $value) {
$name = trim($name);
if (isset($name)) {
if (is_numeric($name)) {
$object[] = self::parseArrayToObject($value);
} else {
$object->$name = self::parseArrayToObject($value);
}
}
}
return $object;
}
return false;
}
/**
* @return mixed
*/
public static function getRequestHeaders()
{
if (!function_exists('apache_request_headers')) {
$headers = array();
foreach ($_SERVER as $key => $value) {
if (substr($key, 0, 5) == 'HTTP_') {
$headers[str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))))] = $value;
}
}
return $headers;
} else {
return apache_request_headers();
}
}
/**
* @param $array
* @param string $namespace
* @param array $outputFields
* @return string
*/
public static function convertArrayToHtmlForm($array, $namespace = "", &$outputFields)
{
$i = 0;
$htmlOutput = "";
$assoc = self::isAssocArray($array);
foreach ($array as $key => $value) {
if ($namespace && $assoc) {
$key = $namespace . '.' . $key;
} elseif ($namespace && !$assoc) {
$key = $namespace . '[' . $i++ . ']';
}
if (is_array($value)) {
$htmlOutput .= self::convertArrayToHtmlForm($value, $key, $outputFields);
} else {
$htmlOutput .= sprintf("<input type=\"hidden\" name=\"%s\" value=\"%s\" />\n", $key, $value);
$outputFields[$key] = $value;
}
}
return $htmlOutput;
}
/**
* @param $arr
* @return bool
*/
public static function isAssocArray($arr)
{
$arrKeys = array_keys($arr);
sort($arrKeys, SORT_NUMERIC);
return $arrKeys !== range(0, count($arr) - 1);
}
/**
* @param $namespace
* @param $key
* @return string
*/
public static function changeFormFieldFormat($namespace, $key)
{
if ($key === $namespace && $key[strlen($key) - 1] == 's') {
return substr($key, 0, -1);
}
return $key;
}
/**
* @param array $data
* @return array
*/
private static function setSenderProperty($data)
{
$data['properties'][0] = array(
'name' => 'sender',
'value' => OpenPayU_Configuration::getFullSenderName()
);
return $data;
}
public static function statusDesc($response)
{
$msg = '';
switch ($response) {
case 'SUCCESS':
$msg = 'Request has been processed correctly.';
break;
case 'DATA_NOT_FOUND':
$msg = 'Data indicated in the request is not available in the PayU system.';
break;
case 'WARNING_CONTINUE_3_DS':
$msg = '3DS authorization required.Redirect the Buyer to PayU to continue the 3DS process by calling OpenPayU.authorize3DS().';
break;
case 'WARNING_CONTINUE_CVV':
$msg = 'CVV/CVC authorization required. Call OpenPayU.authorizeCVV() method.';
break;
case 'ERROR_SYNTAX':
$msg = 'BIncorrect request syntax. Supported formats are JSON or XML.';
break;
case 'ERROR_VALUE_INVALID':
$msg = 'One or more required values are incorrect.';
break;
case 'ERROR_VALUE_MISSING':
$msg = 'One or more required values are missing.';
break;
case 'BUSINESS_ERROR':
$msg = 'PayU system is unavailable. Try again later.';
break;
case 'ERROR_INTERNAL':
$msg = 'PayU system is unavailable. Try again later.';
break;
case 'GENERAL_ERROR':
$msg = 'Unexpected error. Try again later.';
break;
}
return $msg;
}
}