java的加签用php如何实现
1. 问题描述?
对接一个甘肃农信的支付通道,他们的demo是用java写的,我们是php. 比对着java试写着php的加签demo,结果验签失败.
2. 代码块
java:
public static String signPaygateData(String plain) throws Exception {
String signatureAlgorithm = "MD5withRSA";
String keyAlias="ddbank";
KeyReader keyReader = new KeyReader();
//使用pfx加签
PrivateKey privateKey = keyReader.readPrivateKeyfromPKCS12StoredFile(certPath, certPassword);
byte[] signature = null;
System.out.println("privateKey=========="+privateKey);
try {
signature = sign(privateKey, signatureAlgorithm, plain.getBytes("UTF-8"));
} catch (Exception e) {
throw new Exception(e);
}
return Hex2Byte.byte2Hex(signature);
}
PHP:
# 获取私钥
$cert = file_get_contents(realpath('./ddbank_test.pfx'));
openssl_pkcs12_read($cert, $cert_info, '123456');
$private_key = $cert_info['pkey']; //私钥
# 签名数据
$sign_data = '123456';
$priKey = openssl_get_privatekey($private_key);
if ($priKey === false) {
throw new \Exception('证书文件路径错误或者传入的证书格式错误');
}
# 加签
openssl_sign(utf8_encode($sign_data), $signs, $priKey, OPENSSL_ALGO_MD5);
return bin2hex($signs);
3. 您期望得到的结果?
我想知道问题导致俩边加签数据不一致的原因可能有哪些引起的,我对java不了解.
私钥
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKTLTFQIJnUGk+XFRwu6t+hPh60T/NZQVVAwWKOjhwz1EuhWSMVJiHFya7rVsXxhmmIz+RzBDO5Ce4xi0+4lRIPvGPa2mUNG8fcPjCtXC8BQyicfvAWCqiyKpPekN7grczt3HYV2/Y+DhXKXuulVkNqBn5Bxf8xLuw9kpt6++/hfAgMBAAECgYAVEGtkPlp0EPAsqYfIRwik6C2GgQyLdF9DTbq2x/tGO7k7+3N3zEtlfOOqURBLvsoWDWClPUPi3JqgOi2uvhLAub/ooolTbfqWOv/C/3FI0BLatMgkuQg+3jtKhFdveblrLJLtZb80CLkJjCdyR4/yJOkkGUiT5EA2uzLBstnO+QJBAOEJnq9CKybIvymkr2bRxoIOkbIyVg4AHbqfmb/aH6Q/NAsGBmP5Yo+WveHMkt6W2XywBg8xkTIZmQyzv1ho31sCQQC7d8FTCcdgjNZNcPka+Jm3ZSrI+kCj6SrCoYE7ARjAoOLnRodlgnSmCH17ryBvRMMrpXaReCdVR8UFyjTGJn5NAkBJMZvPXTIz1y92F/6E7s4mFx8EWqLqwtbokGitogCQp44B19/UPJT2Jw1zl9pdU6tBhu8xmemj5feFziD6XIHpAkAatVgUtYrzRX1usQ68efikeURcN9MnxxtxeUMJHgHhx8or+w9lNe3ajdEa4vty/s/zkvJOjVjFPKFkTsewB2HtAkEAxfxQuKBR6HYKDqDQHqXdZZtf2J77G65Jt5LSnuUfTh2tlpsYo4ur2+qeUuc4FjS99/gf2FXT7PFNu7MmsTPQ/A==
真实加签内容:
$sign_data = "<Message><TransId>TJSK</TransId><MerchantId>95162014214P003</MerchantId><OrderId>220422154103083890517</OrderId><Subject>解忧杂货铺 收款0.01元</Subject><MerTransDateTime>20220422154103</MerTransDateTime><MerTransDate>20220422</MerTransDate><TransAmount>0.01</TransAmount><termId>5006A01V</termId><MerchantIP>100.120.72.108</MerchantIP><qrCode>133664342880547822</qrCode><MerchantUrl>https://www.weiwoju.com/PayNotify/gunx</MerchantUrl><areaInfo>1568200</areaInfo><consignee>CDS</consignee><SignType>RSA</SignType></Message>";
java:1fb08bba187d6e41950eac7ca9d93ae4c18de1f974ab022884e88455e5a0dda22f19a6236f17272ffe46870783ccae310756a74b09423d85c3843dc1f6e2df0768fdcac480099222c1c85609f568ed5df4fddd7b4fd17b734c1a841be22dae0ad86b695b4b1eaa6cc74d68ee5ccd63fb71dab3fe3c5fbdd5efdb091cd4cce2d3
php:4a2fcfc9567b9c251bdbc4e6016fce7846990e025a57f845236a25c43516e32b65efb638902a28d5843f9561b2438f8a7872416a931529c22e995a53edbcd3d6d4324ca69389fda382ac70536e964b2841b98c261b189fbcc6106919ee4291d74aa8a505cdacbabeab8016393eb98345d316671bda5935ba9b9e8de65e50c0b3
感谢大家,问题已解决
原因:俩边的证书不同(我真无语,还特地问了,他们说就用demo的证书就行,结果商户和证书不匹配,搞了俩天多,感谢大家的回应).
用java+你贴私钥+你提供的$sign_data跑了下输出是这个
结果:
与你的也不一致:
用123456与PHP进行验证
$signData=”123456”;
java结果:
php结果: