netpayclient.php,银联 chinapay php版本库文件netpayclient php在php5 4以上版本中提示hex2bin 重定义...

今天用ecshop时,发现了这个问题。

经过解码, 完美解决问题。

贴出解码代码,以供参考。

// This file is protected by copyright law & provided under license. Copyright(C) 2005-2009 www.chinapay.com, All rights reserved.

define("DES_KEY", "SCUBEPGW");

define("HASH_PAD", "0001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003021300906052b0e03021a05000414");

bcscale(0);

$private_key = array();

/*function hex2bin($hexdata) {

$bindata = '';

if (strlen($hexdata) % 2 == 1) {

$hexdata = '0' . $hexdata;

}

for ($i = 0; $i < strlen($hexdata); $i+=2) {

$bindata .= chr(hexdec(substr($hexdata, $i, 2)));

}

return $bindata;

}*/

function padstr($src, $len = 256, $chr = '0', $d = 'L') {

$ret = trim($src);

$padlen = $len - strlen($ret);

if ($padlen > 0) {

$pad = str_repeat($chr, $padlen);

if (strtoupper($d) == 'L') {

$ret = $pad . $ret;

} else {

$ret = $ret . $pad;

}

}

return $ret;

}

function bin2int($bindata) {

$hexdata = bin2hex($bindata);

return bchexdec($hexdata);

}

function bchexdec($hexdata) {

$ret = '0';

$len = strlen($hexdata);

for ($i = 0; $i < $len; $i++) {

$hex = substr($hexdata, $i, 1);

$dec = hexdec($hex);

$exp = $len - $i - 1;

$pow = bcpow('16', $exp);

$tmp = bcmul($dec, $pow);

$ret = bcadd($ret, $tmp);

}

return $ret;

}

function bcdechex($decdata) {

$s = $decdata;

$ret = '';

while ($s != '0') {

$m = bcmod($s, '16');

$s = bcdiv($s, '16');

$hex = dechex($m);

$ret = $hex . $ret;

}

return $ret;

}

function sha1_128($string) {

$hash = sha1($string);

$sha_bin = hex2bin($hash);

$sha_pad = hex2bin(HASH_PAD);

return $sha_pad . $sha_bin;

}

function mybcpowmod($num, $pow, $mod) {

if (function_exists('bcpowmod')) {

return bcpowmod($num, $pow, $mod);

}

return emubcpowmod($num, $pow, $mod);

}

function emubcpowmod($num, $pow, $mod) {

$result = '1';

do {

if (!bccomp(bcmod($pow, '2'), '1')) {

$result = bcmod(bcmul($result, $num), $mod);

}

$num = bcmod(bcpow($num, '2'), $mod);

$pow = bcdiv($pow, '2');

} while (bccomp($pow, '0'));

return $result;

}

function rsa_encrypt($private_key, $input) {

$p = bin2int($private_key["prime1"]);

$q = bin2int($private_key["prime2"]);

$u = bin2int($private_key["coefficient"]);

$dP = bin2int($private_key["prime_exponent1"]);

$dQ = bin2int($private_key["prime_exponent2"]);

$c = bin2int($input);

$cp = bcmod($c, $p);

$cq = bcmod($c, $q);

$a = mybcpowmod($cp, $dP, $p);

$b = mybcpowmod($cq, $dQ, $q);

if (bccomp($a, $b) >= 0) {

$result = bcsub($a, $b);

} else {

$result = bcsub($b, $a);

$result = bcsub($p, $result);

}

$result = bcmod($result, $p);

$result = bcmul($result, $u);

$result = bcmod($result, $p);

$result = bcmul($result, $q);

$result = bcadd($result, $b);

$ret = bcdechex($result);

$ret = strtoupper(padstr($ret));

return (strlen($ret) == 256) ? $ret : false;

}

function rsa_decrypt($input) {

global $private_key;

$check = bchexdec($input);

$modulus = bin2int($private_key["modulus"]);

$exponent = bchexdec("010001");

$result = bcpowmod($check, $exponent, $modulus);

$rb = bcdechex($result);

return strtoupper(padstr($rb));

}

function buildKey($key) {

global $private_key;

if (count($private_key) > 0) {

foreach ($private_key as $name => $value) {

unset($private_key[$name]);

}

}

$ret = false;

$key_file = parse_ini_file($key);

if (!$key_file) {

return $ret;

}

$hex = "";

if (array_key_exists("MERID", $key_file)) {

$ret = $key_file["MERID"];

$private_key["MERID"] = $ret;

$hex = substr($key_file["prikeyS"], 80);

} else

if (array_key_exists("PGID", $key_file)) {

$ret = $key_file["PGID"];

$private_key["PGID"] = $ret;

$hex = substr($key_file["pubkeyS"], 48);

} else {

return $ret;

}

$bin = hex2bin($hex);

$private_key["modulus"] = substr($bin, 0, 128);

$cipher = MCRYPT_DES;

$iv = str_repeat("\x00", 8);

$prime1 = substr($bin, 384, 64);

$enc = mcrypt_cbc($cipher, DES_KEY, $prime1, MCRYPT_DECRYPT, $iv);

$private_key["prime1"] = $enc;

$prime2 = substr($bin, 448, 64);

$enc = mcrypt_cbc($cipher, DES_KEY, $prime2, MCRYPT_DECRYPT, $iv);

$private_key["prime2"] = $enc;

$prime_exponent1 = substr($bin, 512, 64);

$enc = mcrypt_cbc($cipher, DES_KEY, $prime_exponent1, MCRYPT_DECRYPT, $iv);

$private_key["prime_exponent1"] = $enc;

$prime_exponent2 = substr($bin, 576, 64);

$enc = mcrypt_cbc($cipher, DES_KEY, $prime_exponent2, MCRYPT_DECRYPT, $iv);

$private_key["prime_exponent2"] = $enc;

$coefficient = substr($bin, 640, 64);

$enc = mcrypt_cbc($cipher, DES_KEY, $coefficient, MCRYPT_DECRYPT, $iv);

$private_key["coefficient"] = $enc;

return $ret;

}

function sign($msg) {

global $private_key;

if (!array_key_exists("MERID", $private_key)) {

return false;

}

$hb = sha1_128($msg);

return rsa_encrypt($private_key, $hb);

}

function signOrder($merid, $ordno, $amount, $curyid, $transdate, $transtype) {

if (strlen($merid) != 15)

return false;

if (strlen($ordno) != 16)

return false;

if (strlen($amount) != 12)

return false;

if (strlen($curyid) != 3)

return false;

if (strlen($transdate) != 8)

return false;

if (strlen($transtype) != 4)

return false;

$plain = $merid . $ordno . $amount . $curyid . $transdate . $transtype;

return sign($plain);

}

function verify($plain, $check) {

global $private_key;

if (!array_key_exists("PGID", $private_key)) {

return false;

}

if (strlen($check) != 256) {

return false;

}

$hb = sha1_128($plain);

$hbhex = strtoupper(bin2hex($hb));

$rbhex = rsa_decrypt($check);

return $hbhex == $rbhex ? true : false;

}

function verifyTransResponse($merid, $ordno, $amount, $curyid, $transdate, $transtype, $ordstatus, $check) {

if (strlen($merid) != 15)

return false;

if (strlen($ordno) != 16)

return false;

if (strlen($amount) != 12)

return false;

if (strlen($curyid) != 3)

return false;

if (strlen($transdate) != 8)

return false;

if (strlen($transtype) != 4)

return false;

if (strlen($ordstatus) != 4)

return false;

if (strlen($check) != 256)

return false;

$plain = $merid . $ordno . $amount . $curyid . $transdate . $transtype . $ordstatus;

return verify($plain, $check);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值