重构支付集成的代码
打赏作者

yujiak

支付宝支付,设置disable_pay_channels禁用支付渠道的时候,禁用了信用卡支付,但是提交付款的时候还是可以选择信用卡付款!这个怎么解?支付宝接口已升级到2.0了的。

JellyBool 回复 yujiak

你申请的是哪个支付接口?即时到账还是当面付?

yujiak 回复 JellyBool

即时到账,pc端和wap的都申请了

JellyBool 回复 yujiak

你的具体配置是什么样的?代码可以贴出来看一下。

是否是按照这个来的呢? https://www.pingxx.com/api#支付渠道-extra-参数说明

yujiak 回复 JellyBool

现在这个问题解决了,在本地也能支付,但是上传到服务器就提示 “错误代码 invalid-signature 错误原因: 无效签名”。
protected function verifyPing($rawData){
$headers = \Pingpp\Util\Util::getRequestHeaders();
signature=isset(signature = isset(headers[‘X-Pingplusplus-Signature’]) ? $headers[‘X-Pingplusplus-Signature’] : NULL;
publicKeyContents = file_get_contents(public_path(). '/rsa_public_key.pem');//注意这里的文件路劲相对应 return openssl_verify(rawData,base64_decode(signature),signature),publicKeyContents,‘SHA256’);
}
执行这个函数的时候返回了 0 ,问题是不是在这呢?

JellyBool 回复 yujiak
signature = isset(signature=isset(headers[‘X-Pingplusplus-Signature’]) ? $headers[‘X-Pingplusplus-Signature’] : NULL;

这是什么?确认没有写错么?

yujiak

晕,直接复制的一发出去就变成这样了…

JellyBool 回复 yujiak

这个是应该这样的么:

//openssl_verify(rawData,base64_decode(signature),signature),publicKeyContents,‘SHA256’);
openssl_verify($data, base64_decode($signature), $publicKeyContents, 'sha256');

再检查一下大小写试试。

实在还是不行,把你所有相关的代码贴出来看看?你的环境也告知一下。。。

yujiak 回复 JellyBool
public function notify(){
        $rawData = file_get_contents('php://input');
        $result = $this->verifyPing($rawData);
}
protected function verifyPing($rawData){
       $headers = \Pingpp\Util\Util::getRequestHeaders();
//       $headers = Util::getRequestHeaders();
       $signature = isset($headers['X-Pingplusplus-Signature']) ?: null;
       $publicKeyContents = file_get_contents(public_path(). '/rsa_public_key.pem');
       return openssl_verify($rawData,base64_decode($signature),$publicKeyContents,'sha256');
   }

这大小写看起来应该是没毛病,laravel5.2 + nginx/1.10.2 +php5.6.27

JellyBool 回复 yujiak

你的证书是用的这个么?
https://github.com/PingPlusPlus/pingpp-php/blob/master/example/pingpp_rsa_public_key.pem

然后可以看看这个
https://github.com/PingPlusPlus/pingpp-php/blob/master/example/webhooks.php#L19-L36

我看了,感觉也没啥问题的样子。证书能确保对的话,确实排不出 bug 了

yujiak 回复 JellyBool

这里的证书用的是ping后台提供的ping公钥

yujiak 回复 JellyBool
$rsa = \Pingpp\Pingpp::setPrivateKeyPath(public_path() . '/rsa_private_key.pem');
        dd($rsa);

我这里打印出来结果是 null ,看起来不对吧?目录下确实是有这个文件的

JellyBool 回复 yujiak

你先不要 \Pingpp\Pingpp::setPrivateKeyPath(public_path() . '/rsa_private_key.pem'); 这一行代码,只要 setApiKey 这行代码试试。

yujiak 回复 JellyBool

test模式下返回这个错误:“错误代码 invalid-signature 错误原因: 无效签名”。live模式下就报“提供了无效的签名”

JellyBool 回复 yujiak

https://pub.pingplusplus.com/d/859-type-invalid-request-error-message
你可以看看这个。。。感觉你的 Ping++ 后台没有配置正确

yujiak 回复 JellyBool

ping++开发配置这里的“商户公钥(用于商户身份验证)”用的是支付宝公钥,“支付宝开放平台 - PID 和公钥管理 - 开放平台密钥 - RSA2 (SHA256) 密钥 - 查看支付宝公钥”。复制的这个里面的。

JellyBool 回复 yujiak

https://help.pingxx.com/article/115667
你看看这个,感觉就是你的 Ping++ 后台都没有配置好。比如这个:“商户公钥(用于商户身份验证)”用的是支付宝公钥 ,这个应该是你的公钥。

yujiak
$signature = isset($headers['X-Pingplusplus-Signature']) ? $headers['X-Pingplusplus-Signature'] : NULL;

是这样的…