123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- <?php
- /**
- * @file uc_cmcic.inc
- * Written by Henri MEDOT <henri.medot[AT]absyx[DOT]fr>
- * http://www.absyx.fr
- *
- * This file is the API-like part of the module.
- * It is separated from the module file so that it can be imported from another module, even without Ubercart.
- * So if you want to use these utilities in a custom module, just add:
- * require_once drupal_get_path('module', 'uc_cmcic') .'/uc_cmcic.inc;
- * at the beginning of your module.
- */
- function uc_cmcic_complete_request($key, $fields) {
- $fields = array_merge(array(
- 'version' => '3.0',
- 'texte-libre' => '',
- 'lgue' => 'EN',
- ), $fields);
- $ordered_fields = array();
- foreach (array(
- 'TPE',
- 'date',
- 'montant',
- 'reference',
- 'texte-libre',
- 'version',
- 'lgue',
- 'societe',
- 'mail',
- 'nbrech',
- 'dateech1',
- 'montantech1',
- 'dateech2',
- 'montantech2',
- 'dateech3',
- 'montantech3',
- 'dateech4',
- 'montantech4',
- 'options',
- ) as $name) {
- $ordered_fields[$name] = isset($fields[$name]) ? $fields[$name] : '';
- }
- $fields['MAC'] = uc_cmcic_hmac_sha1(uc_cmcic_usable_key($key), implode('*', $ordered_fields));
- return $fields;
- }
- function uc_cmcic_validate_response($key, $fields) {
- if (empty($fields['MAC'])) {
- return FALSE;
- }
- $ordered_fields = array();
- foreach (array(
- 'TPE',
- 'date',
- 'montant',
- 'reference',
- 'texte-libre',
- 'version',
- 'code-retour',
- 'cvx',
- 'vld',
- 'brand',
- 'status3ds',
- 'numauto',
- 'motifrefus',
- 'originecb',
- 'bincb',
- 'hpancb',
- 'ipclient',
- 'originetr',
- 'veres',
- 'pares',
- ) as $name) {
- $ordered_fields[$name] = isset($fields[$name]) ? $fields[$name] : '';
- }
- $ordered_fields['version'] = '3.0';
- $ordered_fields[] = '';
- $mac = uc_cmcic_hmac_sha1(uc_cmcic_usable_key($key), implode('*', $ordered_fields));
- return (strtolower($mac) == strtolower($fields['MAC']));
- }
- function uc_cmcic_receipt($mac_ok) {
- return sprintf("version=2\ncdr=%s\n", ($mac_ok) ? '0' : '1');
- }
- function uc_cmcic_usable_key($key) {
- if (strlen($key) != 20) {
- $suffix = ''. substr($key, 38, 2) .'00';
- $key = substr($key, 0, 38);
- $cca0 = ord($suffix);
- if (($cca0 > 70) && ($cca0 < 97)) {
- $key .= chr($cca0 - 23) . substr($suffix, 1, 1);
- }
- elseif (substr($suffix, 1, 1) == 'M') {
- $key .= substr($suffix, 0, 1) .'0';
- }
- else {
- $key .= substr($suffix, 0, 2);
- }
- $key = pack('H*', $key);
- }
- return $key;
- }
- /**
- * RFC 2104 HMAC implementation for PHP >= 4.3.0 - Creates a SHA1 HMAC.
- * Eliminates the need to install mhash to compute a HMAC.
- * Adjusted from the md5 version by Lance Rushing.
- */
- function uc_cmcic_hmac_sha1($key, $data) {
- $length = 64; // block length for SHA1
- if (strlen($key) > $length) {
- $key = pack('H*', sha1($key));
- }
- $key = str_pad($key, $length, chr(0x00));
- $ipad = str_pad('', $length, chr(0x36));
- $opad = str_pad('', $length, chr(0x5c));
- $k_ipad = $key ^ $ipad;
- $k_opad = $key ^ $opad;
- return sha1($k_opad . pack('H*', sha1($k_ipad . $data)));
- }
- function uc_cmcic_languages() {
- return array('FR', 'EN', 'DE', 'IT', 'ES', 'NL');
- }
|