当前位置: 代码网 > it编程>编程语言>Php > PHP通过pem文件校验签名异常问题解决

PHP通过pem文件校验签名异常问题解决

2024年05月18日 Php 我要评论
问题描述:在对接第三方支付过程中,支付成功异步回调时,校验签名,一直无法通过。但是在支付成功时有一个同步返回也需要校验签名,用的是同样的校验方法,都没有问题。当把回调时传递的参数放在postman中,

问题描述:

在对接第三方支付过程中,支付成功异步回调时,校验签名,一直无法通过。但是在支付成功时有一个同步返回也需要校验签名,用的是同样的校验方法,都没有问题。当把回调时传递的参数放在postman中,手动发起回调,也可以通过签名校验

最后经过排查,是引用秘钥文件时,报错了,错误代码如下

public static function verify(array $data, $sign)
    {
        if (empty($data) || empty($sign)) {
            return "";
        }
        //code+msg+date+result,
        $code   = $data['code'] ?? '';
        $msg    = $data['msg'] ?? '';
        $date   = $data['date'] ?? '';
        $result = $data['result'] ?? '';
        $signstring = $code . $msg . $date . $result;
		$mallbook_key_file = __dir__.'rsa_public.pem';
        $pubkey = file_get_contents($mallbook_key_file);
        /** 此处可能会返回false **/
        $res = openssl_get_publickey($pubkey);
        $result =  openssl_verify($signstring , base64_decode($sign), $res) === 1;
        openssl_free_key($res);
        return $result; 
    }

上面代码其实是没有问题的,问题出在rsa_public.pem文件的内容,秘钥内容都写在同一行了,没有按照标准的秘钥格式书写,如下

在这里插入图片描述

解决方法

第一种

按标准的秘钥书写格式修改秘钥文件每行只能有64个字符,如下

在这里插入图片描述

第二种

直接在代码中拼接秘钥字符串

$pubkey ='migfma0gcsqgsib3dqe***************************************
********************************************************************
***************1mwyu7rtdc8wp7lgddnlkjsml8masgmxa6cc9nwidaqab';
    $str= chunk_split($pubkey, 64, "\n");
    $key = "-----begin public key-----\n$str-----end public key-----\n";
    $signature = base64_decode($sign);
    return openssl_verify($signstring, $signature, $key, openssl_algo_sha1) === 1;

到此这篇关于php通过pem文件校验签名异常的文章就介绍到这了,更多相关php em文件校验签名内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com