培植银行支付接口开拓吸收关照和验签问题

最近在做建行的B2B支付接口(B2C和B2B差不多)

支付成功后吸收银行关照并验签涌现的问题和解决方案,现在逐一记下:

php话费充值接口扶植银行付出接口开辟吸收通知和验签问题php 无COM组件版 Node.js

建行供应的验签DEMO php版的是用COM组件 但是我的做事器是LINUX 的对COM组件不支持(听说网上有方法支持,太烦放弃)。

还有种方法是用PHP 调用JAVA的类 (PHP-Java-Bridge方法 这个这里不说自己百度)

这里详细说下用PHP 的openssl_verify 来验签,各位看官 请随我逐步道来

下面是步骤:

1.openssl_verify 须要一个PEM格式的公钥 从建行下载一个公钥(建行供应的一个公钥是一串字符串并且是16进制的,并且你每次下载的公钥是不同的 是会变的哦 这个把稳)

2.想办法把这串16进制的公钥转成PEM格式于是百度创造没有详细的方案。
现在给出php代码 通过下面的代码即可转成PEM格式

function der2pem($der_data)

{

$pem = chunk_split(base64_encode(hex2bin($der_data)), 64, \"大众\n\公众);

$pem = \"大众-----BEGIN PUBLIC KEY-----\n\"大众 . $pem . \公众-----END PUBLIC KEY-----\n\公众;

return $pem;

}

调用方法:der2pem('公钥串');

3.验签(php代码如下)

/

验证署名

@param array $val 原字符串

@param type $sign 加密串

/

public function verifySign($val, $sign)

{

$data = '';

foreach ($val as $k => $v)

{

if(\Org\Util\String::isUtf8($v)) //判断编码 UTF8 须要转换下

{

$data.=iconv('utf-8', 'gbk', $v);

}

else

{

$data.=$v;

}

}

$public_key = self::PUBKEY;

$public_key = file_get_contents(dirname(__FILE__ ) . '/' . $public_key);

$pkeyid = openssl_get_publickey($public_key);

$verifyResult = openssl_verify($data, pack(\公众H\"大众 . strlen($sign), $sign), $pkeyid, OPENSSL_ALGO_MD5);

openssl_free_key($pkeyid);

return $verifyResult == 1 ? true : false;

}

4.特殊解释:

a.建行的加密参数是GBK的以是验签的时候的UTF8的编码要转GBK的

b.建行页面关照get参数中文居然没有URL编码 所有在ie下可能是乱码 (用THINKPHP 框架的用I方法会获取不到含中文的参数 以是要用原生的$_GET方法)

c.openssl_verify($data, pack(\"大众H\"大众 . strlen($sign), $sign), $pkeyid, OPENSSL_ALGO_MD5);

//建行是采取的rsawithmd5的加密方法所有验签时要用到OPENSSL_ALGO_MD5参数并且把加密串转2进制 pack(\公众H\公众 . strlen($sign), $sign)