抖音小程序支付宝异步回调中验签php代码
异步回调中验签中我遇到坑:
openssl_verify()
总是返回0;问了支付宝技术客服才解决。已测试。可用
代码php示例:
function RSAVerify($return_data, $public_key,$ksort=true){
if (empty($return_data) || !(is_array($return_data)))
{
return false;
}
$public_key = chackKey($public_key);
$pkeyid = openssl_pkey_get_public($public_key);
if (empty($pkeyid))
{
return false;
}
$rsasign = $return_data['sign'];
$sign_type = trim($return_data['sign_type'], '"');
unset($return_data['sign'], $return_data['sign_type']);
if ($ksort)
{
ksort($return_data);
}
if (is_array($return_data) && !(empty($return_data)))
{
$strdata = '';
foreach ($return_data as $k => $v )
{
if (empty($v))
{
continue;
}
if (is_array($v))
{
$strdata .= $k . '=' . json_encode($v) . '&';
}
else
{
$strdata .= $k . '=' . $v . '&';
}
}
}
$strdata = trim($strdata, '&');
$rsasign = str_replace(' ', '+', $rsasign);
$rsasign = base64_decode($rsasign);
if ($sign_type == 'RSA') {
$rsaverify = openssl_verify($strdata, $rsasign, $pkeyid);
} else if ($sign_type == 'RSA2') {
$rsaverify = openssl_verify($strdata, $rsasign, $pkeyid, OPENSSL_ALGO_SHA256);
}
openssl_free_key($pkeyid);
return $rsaverify;
}
function chackKey($key, $public = true)
{
if (empty($key)) {
return $key;
}
if ($public) {
if (strexists($key, '-----BEGIN PUBLIC KEY-----')) {
$key = str_replace(array('-----BEGIN PUBLIC KEY-----', '-----END PUBLIC KEY-----'), '', $key);
}
$head_end = '-----BEGIN PUBLIC KEY-----
{key}
-----END PUBLIC KEY-----';
}
else {
if (strexists($key, '-----BEGIN RSA PRIVATE KEY-----')) {
$key = str_replace(array('-----BEGIN RSA PRIVATE KEY-----', '-----END RSA PRIVATE KEY-----'), '', $key);
}
$head_end = '-----BEGIN RSA PRIVATE KEY-----
{key}
-----END RSA PRIVATE KEY-----';
}
$key = str_replace(array('
', '
', '
'), '', trim($key));
$key = wordwrap($key, 64, '
', true);
return str_replace('{key}', $key, $head_end);
}
function characet($data, $targetCharset) {
if (!empty($data)) {
$fileType = "UTF-8";
if (strcasecmp($fileType, $targetCharset) != 0) {
$data = mb_convert_encoding($data, $targetCharset, $fileType);
}
}
return $data;
}
/**
* 校验$value是否非空
* if not set ,return true;
* if is null , return true;
**/
function checkEmpty($value) {
if (!isset($value))
return true;
if ($value === null)
return true;
if (trim($value) === "")
return true;
return false;
}
问题有几处1、:$public_key
记住他是支付宝公钥不是应用公钥切记好好检查一下这里是最重要出错地方
。
2、:openssl_pkey_get_public这里返回false那么是你的支付宝公钥位数不够,如果返回资源id,也并不说明你的公钥是正确的。这就是坑。
3、如果是
RSA2类型
:记得加上
OPENSSL_ALGO_SHA256
4、openssl_verify总是返回0,又不告诉你错在哪里,很坑,如果你的正确了,会返回1
还有很多问题需要你自己查一下你的代码。有好的建议可以留言,大家交流一下
版权声明:本文为weixin_37616043原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。