payment/alipay/return 签名验证失败

可以正常支付成功,但跳转回商家的时候显示签名验证失败

http://shop.com/payment/alipay/return?char...


Yansongda \ Pay \ Exceptions \ InvalidSignException (5)
Alipay Sign Verify FAILED

附言 1  ·  5年前

composer.json信息:

{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=7.0.0",
"encore/laravel-admin": "1.5.",
"fideloper/proxy": "~3.3",
"laravel/framework": "5.5.
",
"laravel/tinker": "~1.0",
"overtrue/laravel-lang": "^3.0",
"predis/predis": "^1.1",
"yansongda/pay": "^2.5"
},
"require-dev": {
"filp/whoops": "~2.0",
"fzaninotto/faker": "~1.4",
"mockery/mockery": "~1.0",
"phpunit/phpunit": "~6.0",
"symfony/thanks": "^1.0"
},
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\": "app/"
},
"files": [
"bootstrap/helpers.php"
]
},
"autoload-dev": {
"psr-4": {
"Tests\": "tests/"
}
},
"extra": {
"laravel": {
"dont-discover": [
]
}
},
"scripts": {
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate"
],
"post-autoload-dump": [
"Illuminate\Foundation\ComposerScripts::postAutoloadDump",
"@php artisan package:discover"
]
},
"config": {
"preferred-install": "dist",
"sort-packages": true,
"optimize-autoloader": true
}
}

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
leo
最佳答案

_url=/payment/alipay/return

这个是哪来的?正常不应该有这个

5年前 评论
wgn-laravel 2年前
讨论数量: 13
leo

两种可能:

  1. 你引入了其他的包修改了 Request 的参数导致验签失败
  2. 在配置密钥那个章节有地方没有配置正确
5年前 评论

@Leo
是按照教程操作的,配置的地方代码都是复制的了,
ali_public_key是网站上复制的,private_key是本地生成后从私钥文件里拷贝的。

另外我尝试将ali_public_key修改为错误的内容后,仍然可以正常付款
在文件laravel-shop/vendor/yansongda/pay/src/Gateways/Alipay/Support.php的verifySign方法中
dump(publicKey)也可以正确打印出配置的ali_public_key信息
$toVerify的内容是:_url=/payment/alipay/return&app_id=2016092000558088&auth_app_id=2016092000558088&charset=GBK&method=alipay.trade.page.pay.return&out_trade_no=20181105190115943202&seller_id=2088102176533105&timestamp=2018-11-05 19:01:45&total_amount=207.00&trade_no=2018110522001466430500511564&version=1.0

openssl_verify($toVerify, base64_decode($sign), $publicKey, OPENSSL_ALGO_SHA256) 的结果是0

使用支付宝返回的签名和本地的配置的支付宝公钥无法正确校验

5年前 评论
leo

_url=/payment/alipay/return

这个是哪来的?正常不应该有这个

5年前 评论
wgn-laravel 2年前

@Leo
app('alipay')->verify();方法中

$request->query->all(); 得到

array:13 [▼
  "_url" => "/payment/alipay/return"
  "charset" => "GBK"
  "out_trade_no" => "20181105190115943202"
  "method" => "alipay.trade.page.pay.return"
  "total_amount" => "207.00"
  "sign" => "PfnLPXjv1WSThXBIC+95BdYg9nCtuE77lApB2exs4uosonJaog2gHPAcusrmVl6sUDAzz2xqDZ0GBmd1YNBzWa5t3VYpZ3JQEC5u/r/s7NLCakOWE41SLWh8Z68V3mq2NzwJRrYwu6pk2UeLbQc1GI7Jcftfvjze ▶"
  "trade_no" => "2018110522001466430500511564"
  "auth_app_id" => "2016092000558088"
  "version" => "1.0"
  "app_id" => "2016092000558088"
  "sign_type" => "RSA2"
  "seller_id" => "2088102176533105"
  "timestamp" => "2018-11-05 19:01:45"
]
   public function verify($data = null, $refund = false): Collection
    {
        if (is_null($data)) {
            $request = Request::createFromGlobals();

            $data = $request->request->count() > 0 ? $request->request->all() : $request->query->all();
            $data = Support::encoding($data, 'utf-8', $data['charset'] ?? 'gb2312');
        }

        Log::info('Received Alipay Request', $data);

        if (Support::verifySign($data)) {
            return new Collection($data);
        }

        Log::warning('Alipay Sign Verify FAILED', $data);

        throw new InvalidSignException('Alipay Sign Verify FAILED', $data);
    }
5年前 评论

@leo

  // 前端回调页面
    public function alipayReturn(Request $request)
    {
        $data = $request->toArray();
        if(isset($data['_url'])) {
            unset($data['_url']);
        }//删除_url校验成功
        // 校验提交的参数是否合法
        $data = app('alipay')->verify($data);
        dd($data);
    }

$request->toArray() 会获得_url,但我不知道这是为什么

5年前 评论

@leo 刚刚查看了一下,所有$request->all() 都会得到 _url这个参数,我的laravel版本是5.5,composer安装的附件都已贴到帖子里了

5年前 评论
leo

@Eangel 检查下你的 Nginx 配置

5年前 评论

@leo 谢谢大神

 location @rewrite {
       rewrite ^/(.*)$ /index.php?_url=/$1;
 }
5年前 评论

包这个错误:Yansongda \ Pay \ Exceptions \ InvalidSignException (5)
Alipay Sign Verify FAILED

回调打印如下:
Collection {#279 ▼

items: array:12 [▼

"charset" => "GBK"
"out_trade_no" => "1544599894"
"method" => "alipay.trade.wap.pay.return"
"total_amount" => "3.00"
"sign" => "pWxr4OsK1u2cHHcdTAcCu1eofyebOkMAO3d0WB+Jp2AsXKoihWwc7GD636vnEy4PGlAb0Z3bjoyH3+o+4N+PI/YFq0H7cudXw9z00OGNpXDRhjxZsShfGLGJaxkdYH0+YeuRtK/Q3Uhs1JwHHWRCO/tnD1ATEFymKsbPqsaORZ8KietoaaxSB8uqx7PLoAWGox1uXtW9OVwLwi12dhBEeLnBiQPRqrxD32tYKgDvAp/xu5IfRdLzdCspoeE7gk2GUaUzFHqAynCX1gWEaUO6tU7t3sKiuiA1b8d8iedJC4vYXlqhQKebP2tLKg9qqJaTgOvsyEkdQpGNKgygAFODpA== ◀"
"trade_no" => "2018121222001466040500303756"
"auth_app_id" => "2016092400585248"
"version" => "1.0"
"app_id" => "2016092400585248"
"sign_type" => "RSA2"
"seller_id" => "2088102177054760"
"timestamp" => "2018-12-12 15:31:45"

]
}

5年前 评论

图片

file
@leo 老师,验签失败,发现一个问题,很纠结,求指教!问题:加密数据self::getSignContent($data, true) 与 解密数据 self::getSignContent($data, true) 不一致,验签所以过不去

4年前 评论

@zhutou123 不知道你的问题解决了没啊,我之前也是这样,后来发现是要用这个公钥。之前一直是用的前面的,能正常支付,但是无法回调。用后面的支付宝公钥后就一切正常了。

file

4年前 评论
272361997 4年前
TommyTu

我和你一样, 直接用的生成器里面的公钥不行

4年前 评论

我也遇到了签名验证不过的情况,不能直接使用生成器里面的公钥, 要是用这个地方的公钥.

file

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!