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

       首先:没有回调?还是进入回调函数但是验签失败给支付宝返回了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(根据支付宝官网更新)


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

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

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

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

       如上述有错误或者疑问之处,请在评论区指正或提出,谢谢!


转载于:https://juejin.im/post/5c19d493e51d4550442a2b01

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Java 语言中,你可以使用支付提供的 SDK 来实现支付支付回调。以下是一个简单的示例代码: 1. 首先,确保你已经引入了支付的 SDK,例如 alipay-sdk-java。 2. 在你的回调接口中,获取支付返回的参数。 3. 使用支付提供的 DefaultAlipayClient 类创建一个 AlipayClient 对象,传入相应的配置参数。 4. 创建一个 AlipaySignature 类的实例,使用该实例的 verify 方法进行证。 5. 根据证的结果进行相应的处理。 示例代码: ```java import com.alipay.api.AlipayApiException; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.internal.util.AlipaySignature; import javax.servlet.http.HttpServletRequest; import java.util.Map; public class AlipayCallbackHandler { public void handleCallback(HttpServletRequest request) { // 获取支付返回的参数 Map<String, String[]> parameterMap = request.getParameterMap(); Map<String, String> params = new HashMap<>(); for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) { String key = entry.getKey(); String[] values = entry.getValue(); if (values.length > 0) { params.put(key, values[0]); } } // 配置参数 String gatewayUrl = "https://openapi.alipay.com/gateway.do"; String appId = "your app id"; String privateKey = "your private key"; String charset = "UTF-8"; String alipayPublicKey = "alipay public key"; String signType = "RSA2"; // 创建 AlipayClient 对象 DefaultAlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl, appId, privateKey, "json", charset, alipayPublicKey, signType); // 名 try { boolean verifyResult = AlipaySignature.rsaCheckV1(params, alipayPublicKey, charset, signType); if (verifyResult) { // 证成功,根据支付结果进行处理 String tradeStatus = params.get("trade_status"); if ("TRADE_SUCCESS".equals(tradeStatus)) { // 修改订单状态、发送邮件等 } } else { // 失败,处理异常情况 } } catch (AlipayApiException e) { // 证过程中发生异常,处理异常情况 } } } ``` 在上述示例代码中,需要将 "your app id"、"your private key"、"alipay public key" 替换为你自己的配置参数。另外,根据你的具体业务需求,可以在证成功后进行相应的处理,例如修改订单状态、发送邮件等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值