抖音小程序支付宝异步回调中验签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
还有很多问题需要你自己查一下你的代码。有好的建议可以留言,大家交流一下