PageRenderTime 75ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/examples/itnSend.php

https://gitlab.com/blue-media/online-payments-php
PHP | 302 lines | 245 code | 57 blank | 0 comment | 17 complexity | f177b3fc31d13ac769a727bf0220ebb7 MD5 | raw file
  1. <?php
  2. require_once './.config.php';
  3. ini_set('default_charset', 'UTF-8');
  4. $data = array(
  5. 'url' => (!empty($_GET['url']) ? $_GET['url'] : ''),
  6. 'sendRequest' => (!empty($_GET['sendRequest']) ? $_GET['sendRequest'] : 0),
  7. 'serviceID' => (!empty($_GET['serviceID']) ? $_GET['serviceID'] : $serviceId),
  8. 'orderID' => (!empty($_GET['orderID']) ? $_GET['orderID'] : (string) time()),
  9. 'remoteID' => (!empty($_GET['remoteID']) ? $_GET['remoteID'] : '9999FFFF'),
  10. 'amount' => (!empty($_GET['amount']) ? $_GET['amount'] : '0.05'),
  11. 'currency' => (!empty($_GET['currency']) ? $_GET['currency'] : 'PLN'),
  12. 'gatewayID' => (!empty($_GET['gatewayID']) ? $_GET['gatewayID'] : 106),
  13. 'paymentDate' => (!empty($_GET['paymentDate']) ? $_GET['paymentDate'] : date('Y-m-d\TH:i', time())),
  14. 'paymentStatus' => (!empty($_GET['paymentStatus']) ? $_GET['paymentStatus'] : 'PENDING'),
  15. 'paymentStatusDetails' => (!empty($_GET['paymentStatusDetails']) ? $_GET['paymentStatusDetails'] : 'AUTHORIZED'),
  16. 'hashingAlgorithm' => (!empty($_GET['hashingAlgorithm']) ? $_GET['hashingAlgorithm'] : 'sha256'),
  17. 'hashingSalt' => (!empty($_GET['hashingSalt']) ? $_GET['hashingSalt'] : $hashingSalt),
  18. 'hashingSeparator' => (!empty($_GET['hashingSeparator']) ? $_GET['hashingSeparator'] : $hashingSeparator),
  19. );
  20. function page_header()
  21. {
  22. printf('<!DOCTYPE html>');
  23. printf('<html lang="pl">');
  24. printf('<head>');
  25. printf('<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">');
  26. printf('<title>ITN sending and debugging</title>');
  27. printf('</head>');
  28. printf('<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha256-7s5uDGW3AHqw6xtJmNNtr+OBRJUlgkNJEo78P4b0yRw=" crossorigin="anonymous">');
  29. printf('<body>');
  30. printf('<div class="container">');
  31. echo configForm();
  32. }
  33. function page_footer()
  34. {
  35. printf('<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>');
  36. printf('<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha256-KXn5puMvxCw+dAYznun+drMdG1IFl3agK0p/pqT9KAo=" crossorigin="anonymous"></script>');
  37. printf('<script>
  38. $(\'.form-reset\').click(function(event) {
  39. event.preventDefault();
  40. var $form = $(this).parents(\'form\').first();
  41. $(\'input[type="text"]\', $form).val(\'\');
  42. $(\'select\', $form).each(function(key, select) {
  43. $(select).prop(\'selectedIndex\', 0);
  44. });
  45. });
  46. $(\'.form-reset-url\').click(function(event) {
  47. event.preventDefault();
  48. var url = document.location.origin;
  49. url += document.location.pathname;
  50. document.location = url;
  51. });
  52. </script>');
  53. printf('</div>');
  54. printf('</body>');
  55. printf('</html>');
  56. }
  57. function make_input_number($fieldName, $fieldValue)
  58. {
  59. return sprintf('<div class="form-group"><label for="%1$s" class="control-label">%1$s</label><input name="%1$s" id="%1$s" type="number" class="form-control" value="%2$d"></div>', $fieldName, $fieldValue);
  60. }
  61. function make_input_text($fieldName, $fieldValue)
  62. {
  63. return sprintf('<div class="form-group"><label for="%1$s" class="control-label">%1$s</label><input name="%1$s" id="%1$s" type="text" class="form-control" value="%2$s"></div>', $fieldName, $fieldValue);
  64. }
  65. function make_select($fieldName, array $fieldSelects = array(), $fieldValue, array $fieldOptions = array())
  66. {
  67. $result = sprintf('<div class="form-group"><label for="%1$s" class="control-label">%1$s</label><select name="%1$s" id="%1$s" class="form-control">', $fieldName);
  68. if (is_array($fieldSelects) && !empty($fieldSelects)) {
  69. foreach ($fieldSelects as $fieldSelectName) {
  70. $isSelected = ($fieldValue === $fieldSelectName);
  71. $result .= sprintf('<option value="%1$s" title="%1$s" %2$s>%1$s</option>', $fieldSelectName, ($isSelected ? 'selected' : ''));
  72. }
  73. }
  74. $result .= sprintf('</select></div>');
  75. return $result;
  76. }
  77. function page_form(array $data = array())
  78. {
  79. printf('<form method="GET" action="" class="form-horizontal">');
  80. printf('<div class="form-group"><label for="%1$s" class="control-label">%1$s</label><input name="%1$s" id="%1$s" type="url" class="form-control" value="%2$s"></div>', 'url', $data['url']);
  81. echo make_input_number('serviceID', $data['serviceID']);
  82. echo make_input_number('orderID', $data['orderID']);
  83. echo make_input_number('remoteID', $data['remoteID']);
  84. printf('<div class="form-group"><label for="%1$s" class="control-label">%1$s</label><input name="%1$s" id="%1$s" type="number" class="form-control" min="0.05" max="100000.00" step="0.05" value="%2$01.2f"></div>', 'amount', $data['amount']);
  85. echo make_select('currency', array('PLN', 'EUR'), $data['currency']);
  86. echo make_input_number('gatewayID', $data['gatewayID']);
  87. printf('<div class="form-group"><label for="%1$s" class="control-label">%1$s</label><input name="%1$s" id="%1$s" type="datetime-local" class="form-control" value="%2$s"></div>', 'paymentDate', $data['paymentDate']);
  88. echo make_select('paymentStatus', array('PENDING', 'SUCCESS', 'FAILURE'), $data['paymentStatus']);
  89. echo make_select('paymentStatusDetails', array('AUTHORIZED', 'ACCEPTED', 'INCORRECT_AMOUNT', 'EXPIRED', 'CANCELLED', 'ANOTHER_ERROR'), $data['paymentStatusDetails']);
  90. echo make_select('hashingAlgorithm', array('md5', 'sha1', 'sha256', 'sha512'), $data['hashingAlgorithm']);
  91. echo make_input_text('hashingSalt', $data['hashingSalt']);
  92. echo make_input_text('hashingSeparator', $data['hashingSeparator']);
  93. printf('<div class="checkbox"><label for="%1$s" class="control-label"><input type="checkbox" name="%1$s" id="%1$s" value="1">%1$s %2$d</label></div>', 'sendRequest', $data['sendRequest']);
  94. printf('<div class="form-group">');
  95. printf('<label for="%1$s" class="control-label"></label><button name="%1$s" id="%1$s" type="submit" class="btn btn-primary">%2$s</button>', 'submit_1', 'Submit');
  96. printf('<label for="%1$s" class="control-label"></label><button name="%1$s" id="%1$s" type="reset" class="btn btn-default form-reset">%2$s</button>', 'reset_1', 'Reset form');
  97. printf('<label for="%1$s" class="control-label"></label><button name="%1$s" id="%1$s" type="reset" class="btn btn-default form-reset-url">%2$s</button>', 'reset_2', 'Reset page');
  98. printf('</div>');
  99. printf('</form>');
  100. }
  101. function page_itn_make(array $data = array())
  102. {
  103. $dataIn = $data;
  104. $hashingAlgorithm = $dataIn['hashingAlgorithm'];
  105. $hashingSalt = $dataIn['hashingSalt'];
  106. $hashingSeparator = $dataIn['hashingSeparator'];
  107. unset($dataIn['url']);
  108. unset($dataIn['sendRequest']);
  109. unset($dataIn['hashingAlgorithm']);
  110. unset($dataIn['hashingSalt']);
  111. unset($dataIn['hashingSeparator']);
  112. $dataIn['paymentDate'] = DateTime::createFromFormat('Y-m-d\TH:i', $dataIn['paymentDate'])->format('YmdHis');
  113. $dataIn['hash'] = '';
  114. foreach ($dataIn as $name => $value) {
  115. if (mb_strtolower($name) === 'hash' || empty($value)) {
  116. continue;
  117. }
  118. $dataIn['hash'] .= $value . $hashingSeparator;
  119. }
  120. $dataIn['hash'] .= $hashingSalt;
  121. $dataIn['hash'] = hash($hashingAlgorithm, $dataIn['hash']);
  122. $xml = new XMLWriter();
  123. $xml->openMemory();
  124. $xml->startDocument('1.0', 'UTF-8', 'yes');
  125. $xml->startElement('transactionList');
  126. $xml->writeElement('serviceID', $dataIn['serviceID']);
  127. $xml->startElement('transactions');
  128. $xml->startElement('transaction');
  129. $xml->writeElement('orderID', $dataIn['orderID']);
  130. $xml->writeElement('remoteID', $dataIn['remoteID']);
  131. $xml->writeElement('amount', $dataIn['amount']);
  132. $xml->writeElement('currency', $dataIn['currency']);
  133. $xml->writeElement('gatewayID', $dataIn['gatewayID']);
  134. $xml->writeElement('paymentDate', $dataIn['paymentDate']);
  135. $xml->writeElement('paymentStatus', $dataIn['paymentStatus']);
  136. $xml->writeElement('paymentStatusDetails', $dataIn['paymentStatusDetails']);
  137. $xml->endElement(); // transaction
  138. $xml->endElement(); // transactions
  139. $xml->writeElement('hash', $dataIn['hash']);
  140. $xml->endElement(); // transactionList
  141. return $xml->outputMemory();
  142. }
  143. function page_itn_check($string)
  144. {
  145. $hasFeff = preg_match('/^[\pZ\p{Cc}\x{feff}]+|[\pZ\p{Cc}\x{feff}]+$/ux', $string, $matches);
  146. return sprintf('<span class="%s">%s</span>', (($hasFeff) ? 'bg-danger' : 'bg-success'), $string);
  147. }
  148. function page_itn_display($itnXml, $showAdd = false)
  149. {
  150. if (!empty($itnXml)) {
  151. if ($showAdd) {
  152. $itnXmlEsc = htmlentities($itnXml, ENT_SUBSTITUTE);
  153. printf('<pre><strong>XML RAW:</strong> %s</pre>', PHP_EOL . page_itn_check($itnXmlEsc));
  154. printf('<pre><strong>XML to JSON:</strong> %s</pre>', PHP_EOL . json_encode($itnXmlEsc));
  155. }
  156. $dom = new DOMDocument();
  157. $dom->loadXML($itnXml, (LIBXML_NONET));
  158. $dom->formatOutput = true;
  159. $itnXmlFormated = $dom->saveXml();
  160. printf('<pre><strong>XML FORMATED:</strong> %s</pre>', PHP_EOL . htmlspecialchars($itnXmlFormated, ENT_SUBSTITUTE));
  161. if ($showAdd) {
  162. $itnXmlData = array();
  163. $xmlReader = new XMLReader();
  164. $xmlReader->XML($itnXml, 'UTF-8', (LIBXML_NONET));
  165. while ($xmlReader->read()) {
  166. switch ($xmlReader->nodeType) {
  167. case XMLREADER::ELEMENT:
  168. $nodeName = $xmlReader->name;
  169. $xmlReader->read();
  170. $nodeValue = $xmlReader->value;
  171. if (!empty($nodeName) && !empty(trim($nodeValue))) {
  172. $itnXmlData[$nodeName] = $nodeValue;
  173. }
  174. break;
  175. }
  176. }
  177. $xmlReader->close();
  178. printf('<pre><strong>DATA PARSED:</strong> %s</pre>', PHP_EOL . var_export($itnXmlData, 1));
  179. }
  180. }
  181. }
  182. function page_itn_send($itnXml, $data)
  183. {
  184. if (empty($data['url']) || empty($data['sendRequest'])) {
  185. return '';
  186. }
  187. $requestUrl = $data['url'];
  188. $requestData = array(
  189. 'transactions' => base64_encode($itnXml),
  190. );
  191. $requestOptions = array(
  192. 'form_params' => $requestData,
  193. 'allow_redirects' => false,
  194. 'http_errors' => false,
  195. 'headers' => array(
  196. 'Cookie' => 'XDEBUG_SESSION=PHPSTORM',
  197. ),
  198. );
  199. $client = new GuzzleHttp\Client();
  200. $result = $client->post($requestUrl, $requestOptions)->getBody();
  201. return $result;
  202. }
  203. function page_itn_show_helper($itnXml, $data)
  204. {
  205. if (empty($data['url']) || empty($data['sendRequest'])) {
  206. return '';
  207. }
  208. $requestUrl = $data['url'];
  209. $requestData = array(
  210. 'transactions' => base64_encode($itnXml),
  211. );
  212. $requestDataString = implode(', ', array_map(
  213. function ($v, $k) {
  214. return $k . '=' . $v;
  215. },
  216. $requestData,
  217. array_keys($requestData)
  218. ));
  219. printf('<pre><strong>curl request:</strong>%s curl -I --request POST --data "%s" %s</pre>', PHP_EOL, $requestDataString, $requestUrl);
  220. printf('<form method="POST" action="%s" target="_blank">', $data['url']);
  221. printf('<input type="hidden" name="transactions" value="%s">', $requestData['transactions']);
  222. printf('<label for="%1$s" class="control-label"></label><button name="%1$s" id="%1$s" type="submit" class="btn btn-primary">%2$s</button>', 'submit_1', 'Send from browser');
  223. printf('</form>');
  224. }
  225. page_header();
  226. printf('<div class="row">');
  227. printf('<div class="col-md-6">');
  228. page_form($data);
  229. printf('</div>');
  230. printf('<div class="col-md-6">');
  231. $itn = page_itn_make($data);
  232. page_itn_display($itn, false);
  233. if (!empty($data['url']) && !empty($data['sendRequest'])) {
  234. $itnResponse = page_itn_send($itn, $data);
  235. printf('<hr>');
  236. page_itn_show_helper($itn, $data);
  237. printf('<hr>');
  238. page_itn_display($itnResponse, true);
  239. }
  240. printf('</div>');
  241. printf('</div>');
  242. page_footer();