laravel 5.x 支付宝 异步通知签名验证失败 openssl_verify()错误

使用支付宝服务端PHP sdk,经常会遇到各种奇葩问题,这里记录了一些。

环境:

lavavel 5.5 

支付宝服务端sdk下载的最新压缩包(2017-10)

1.错误

openssl_verify(): supplied key param cannot be coerced into a public key

解决这个错误主要是确认 AopClient的参数 alipayrsaPublicKey 传入了参数 且是支付宝的公钥而不是商户公钥。

if($this->checkEmpty($this->alipayPublicKey)){

			$pubKey= $this->alipayrsaPublicKey;
			$res = "-----BEGIN PUBLIC KEY-----\n" .
				wordwrap($pubKey, 64, "\n", true) .
				"\n-----END PUBLIC KEY-----";
		}else {
			//读取公钥文件
			$pubKey = file_get_contents($rsaPublicKeyFilePath);
			//转换为openssl格式密钥
			$res = openssl_get_publickey($pubKey);
		}

在上面的代码中,如果没有给 alipayPublicKey 赋值,则是不需要传 rsaPublicKeyFilePath 这个参数的,pubkey仍然是读取的字符串形式。所以是不需要保存rsa密钥文件的。

$this->aopClient = new \AopClient();
        $this->aopClient->gatewayUrl = $this->gatewayUrl;
        $this->aopClient->appId = $this->appId;
        $this->aopClient->rsaPrivateKey = $this->rsaPrivateKey;
        $this->aopClient->alipayrsaPublicKey = $this->alipayRsaPublicKey;
        $this->aopClient->signType = $this->signType;
初始化时,只需要保证上面几个参数就可以了,另外沙箱系统的gatewayUrl 、appID和 rsakey 都不一样,注意区分就行了,key的值都是字符串,可以直接用文档给的签名生成工具生成,选择pkcs1非java适用就行,长度我的是2048位,生成的商户公钥去支付宝上传获得支付宝公钥,这里代码只会用到支付宝公钥和商户私钥。

 

2. 签名验证失败

rsaCheckV1() 验证签名返回 false

laravel 处理异步通知时,第一步需要接受post参数,直接用$_POST即可,不要使用$request->post()方法。

csrf验证必须关闭,Middleware\VerifyCsrfToken  修改 $except ,添加异步通知的列外,如添加一行 ‘alipay/*’。


3.函数冲突

AopClient  开头引入了AopEncrypt.php,里面的函数名称与 laravel helper函数冲突,可以修改个名字,AopClient中也使用了这些函数,一并修改了之。


你可能感兴趣的:(laravel 5.x 支付宝 异步通知签名验证失败 openssl_verify()错误)