Listening to the Words

支付宝异步回调失败的一个原因

《支付宝异步回调失败的一个原因》

php开发微信支付和支付宝支付时,经常遇到各种坑,微信经常遇到的是签名和prepay_id的问题,而支付宝经常遇到的问题是异步回调验签失败的问题,即便是检查了支付宝公钥和个人的私钥,也经常的报出验签失败的异常.

支付宝的支付使用私钥进行加签,回调会使用公钥验签,只要是签名通不过就会报出异常,由于异步回调的原因使得调试变得很不方便只能不断打日志来判断什么原因.

其中一个我遇到的最大的坑就是异步回调POST参数接受不到或者由于POST被框架过滤导致验签失败.
因此解决办法有两种:

第一种

如果是在框架中:比如tp,laravel中,不使用框架提供的方法,也不使用$_REQUREST接收post参数,转而使用原生的$_POST

第二种

即便使用了$_POST,有些框架也会过滤此全局数组,因此还是通不过,此时就要使用另外一个方式了

$post=file_get_contents("php://input");
parse_str($post,$_POST);//php转码解析函数
print_r($_POST);

到此,就能接收到原生的(raw)post参数了,如果仍然验签失败,就要检查是否是公钥出错或者把个人公钥当成了支付宝公钥传值了

点赞