EBS支付网关:安全哈希算法


EBS payment gateway: secure hash algorithm

我对计算哈希值的方式有点困惑。集成指南和一些集成工具包根据所有排序的参数进行计算(PHP工具包已经注释掉了这部分代码)。然而,PHP集成工具包和一些在线教程仅从其中几个(密钥,帐户id,金额,订单,返回url和模式)计算请求散列,并且实际上有效。

我在寻找这种状态的解释。

我在计算响应哈希时也遇到了一些困难。

$data = $config['secretKey'];
$hash = $params['SecureHash'];
unset($params['SecureHash']);
ksort($params);
foreach ($params as $param) {
    if (strlen($param) > 0) {
        $data .= '|' . $param;
    };
}
$data = hash($config['hashAlgoritm'], $data); // The same hash algorithm used for request
return $data == $hash;

而且响应似乎不包含AccountID。

ResponseCode = '0'
ResponseMessage = 'Transaction Successful'
DateCreated = '2015-09-23 00:18:15'
PaymentID = '42609232'
MerchantRefNo = '223'
Amount = '1.00'
Mode = 'TEST'
BillingName = 'John Raj'
BillingAddress = 'Arcot Road'
BillingCity = 'Chennai'
BillingState = 'Tamil Nadu'
BillingPostalCode = '600001'
BillingCountry = 'IND'
BillingPhone = '04423452345'
BillingEmail = 'test@40test.test'
DeliveryName = 'John Esak'
DeliveryAddress = 'Arcot Road'
DeliveryCity = 'Chennai'
DeliveryState = 'Tamil Nadu'
DeliveryPostalCode  = '600001'
DeliveryCountry = 'IND'
DeliveryPhone = '04423452345'
Description = 'Test Order Description'
IsFlagged = 'NO'
TransactionID = '110978476'
PaymentMethod = '1001'
RequestID = '7331147'
SecureHash = 'f9101f3cbf53be4da75e51c208775953'

请求

目前为止,从秘钥、账户id、金额、引用号、返回url和模式中计算请求哈希似乎是正确的方法。

$hashData = 'The secret key';
$hashType = 'md5'; // md5|sha1|sha250
$hash .= "|" . urlencode($params['account_id']) . "|"
      . urlencode($params['amount']) . "|"
      . urlencode($params['reference_no']) . "|" 
      . $params['return_url'] . "|"
      . urlencode($params['mode']);
return hash($hashType, $hashData);

反应

对于响应,我无法重建安全哈希的计算方式,甚至无法重建安全哈希是否应该用于验证。所以我已经切换到使用加密版本的响应。

EBS没有指定应该使用哪种算法,但它似乎是某种RC4密码。

要使用加密的响应,返回url必须投诉知识库中指定的以下格式:'http://www.yourdomainname.com/response.extension?DR={DR}'

$DR = preg_replace("/'s/","+",$_GET['DR']);
$rc4 = new Crypt_RC4($secret_key);
$QueryString = base64_decode($DR);
$rc4->decrypt($QueryString);
$QueryString = explode('&',$QueryString);
$response = array();
foreach($QueryString as $param){
    $param = explode('=',$param);
    $response[$param[0]] = urldecode($param[1]);
}
return $response

Crypt_RC43类由EBS在Rc43文件中提供,该文件是集成套件的一部分。

注意:Rc43文件不是每个集成工具包的一部分。一些工具包甚至包括Crypt_RC43类作为控制器的私有内部类。对于我的实现,我使用了Wordpress-3.7中包含的Rc43文件。x赠送集成工具包