Fork me on GitHub

支付宝无法回调或者回调后验签失败

首先:没有回调?还是进入回调函数但是验签失败给支付宝返回了failure?

       按照正常逻辑,验签失败就不会进行业务处理修改订单状态,订单仍处于未支付状态。为确定究竟是没有回调还是验签失败,可以在回调函数中打印request中获取的信息,或者存入Redis查看。

       一:没有回调

       没有回调极有可能是你的notify_url不能外网访问,这种情况很容易出现在本地调试期,本地可以使用钉钉外网穿透,具体怎么使用请参考我这篇文章中间部分https://juejin.im/post/5c1849f7f265da61327f3c40。

       服务器上没有访问则会是https的问题,公司注册的SSL证书不标准导致支付宝无法识别https,为确认,请改为http访问试试看能否正常回调。

       二:验签失败       

       支付宝的验签方式使用的是SDK自带的方法(具体完整的回调方法请参考https://juejin.im/post/5c1849f7f265da61327f3c40),如下:

boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipayPublicKey(), AlipayConfig.charset, AlipayConfig.signType);复制代码

参数分别为:从request中获取的信息(Map形式),支付宝公钥,编码方式,签名方式。

既然是封装在SDK中的方法,就极小可能出问题,那么问题100%出在参数上,我们一个个来讲

1.params 这是支付宝返回的信息,只要是支付宝给你返回信息了,一定是标准格式的信息,出错的可能性也很小,其中几个参数可能会是null,但在SDK封装好的验签方法中一定会剔除的。所以这个参数基本不会出问题。

2.编码格式和加密方式,这两个一般固定,UTF-8和RSA2,也一般不会出问题。

3.支付宝公钥,这是最有可能出错的。先讲讲这个参数的生成方式,进入open.alipay.com,登录后进入我的开放平台,在左上角找到开发者中心-->网页&移动应用,找到自己的应用点击查看详情

按官方文档https://docs.open.alipay.com/200/105310下载加密工具,生成公钥和私钥,将公钥贴在这里后会自动生成后面的支付宝公钥,私钥存在本地。你验签需要的支付宝公钥就是上图点击查看支付宝公钥的字符串。

       问题出在下载加密工具,这里要使用最新版本的V1.4(根据支付宝官网更新)

如果你使用了旧版本,支付依然能成功但是验签就会失败!!!

如果你使用了旧版本,支付依然能成功但是验签就会失败!!!

如果你使用了旧版本,支付依然能成功但是验签就会失败!!!

你可以看到在这个工具上方菜单栏也有验签功能,你可以用自己生成的公钥私钥先在这里验证一番。



posted @ 2018-12-19 16:04  梳碧湖砍柴的人  阅读(3828)  评论(0编辑  收藏  举报