支付宝回调验签错误 false

支付宝支付使用的是RSA非对称加密,商户服务端验签为支付宝的公钥!

查看入参,出参是否乱码,若乱码设置客户端初始化时请求url为:https://openapi.alipay.com/gateway.do?charset=utf-8

### Java 实现支付宝小程序支付回调 支付宝小程序支付完成后,服务器会向商户发送支付结果通知(即支付回调)。为了处理这些通知并证其合法性,以下是基于 Spring Boot 的实现方式。 #### 1. 配置支付宝 SDK 和依赖项 在项目中引入支付宝官方提供的 SDK `alipay-sdk-java`: ```xml <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.20.0.ALL</version> </dependency> ``` #### 2. 创建控制器接收回调请求 创建一个用于接收支付宝回调的通知接口。该接口需支持 POST 请求,并解析支付宝返回的数据。 ```java import com.alibaba.fastjson.JSONObject; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/pay/callback") public class AlipayCallbackController { @PostMapping public String handleAlipayCallback(@RequestBody String notifyData) { try { // 解析接收到的 JSON 数据 JSONObject jsonObject = JSONObject.parseObject(notifyData); // 获取必要的参数 String tradeStatus = jsonObject.getString("trade_status"); String outTradeNo = jsonObject.getString("out_trade_no"); String totalAmount = jsonObject.getString("total_amount"); // 根据业务逻辑判断交易状态 if ("TRADE_SUCCESS".equals(tradeStatus)) { // 处理成功订单逻辑 processOrderSuccess(outTradeNo, totalAmount); return "success"; // 返回 success 表示已成功处理通知 } else if ("TRADE_CLOSED".equals(tradeStatus)) { // 订单关闭逻辑 processOrderClosed(outTradeNo); return "success"; } } catch (Exception e) { e.printStackTrace(); } return "fail"; // 如果发生异常,则返回 fail } private void processOrderSuccess(String outTradeNo, String totalAmount) { System.out.println("订单号:" + outTradeNo + ", 总金额:" + totalAmount + " 已支付成功!"); // 更新数据库中的订单状态或其他操作 } private void processOrderClosed(String outTradeNo) { System.out.println("订单号:" + outTradeNo + " 已关闭!"); // 执行订单关闭后的清理工作 } } ``` #### 3. 回调数据的真实性 为了避免伪造的回调消息,在接收到通知后需要通过证来确认数据的真实性和完整性。以下是一个简单的方法: ```java import com.alipay.api.AlipayApiException; import com.alipay.api.internal.util.AlipaySignature; import java.util.Map; public class AlipayVerifyUtil { /** * 支付宝回调通知的名 * * @param params 接收的参数 Map * @param alipayPublicRsaKey 支付宝公钥字符串 * @return true/false 是否合法 */ public static boolean verifySign(Map<String, String> params, String alipayPublicRsaKey) throws AlipayApiException { // 过滤掉 sign 参数本身 params.remove("sign_type"); // 使用 RSA2 名算法进行校 return AlipaySignature.rsaCheckV1(params, alipayPublicRsaKey, "UTF-8", "RSA2"); } } ``` #### 4. 调整应用配置文件 在项目的 `application.yml` 文件中添加支付宝相关配置信息: ```yaml alipay: app-id: your_app_id_here merchant-private-key: your_merchant_private_key_here alipay-public-rsa-key: your_alipay_public_rsa_key_here gateway-url: https://openapi.alipay.com/gateway.do ``` #### 5. 测试回调功能 完成上述步骤后,可以通过模拟工具或实际发起一笔支付请求来测试回调功能是否正常运行。确保服务器能够正确响应 `success` 或 `fail` 并记录日志以便排查问题[^1]。 --- ### 注意事项 - **安全性**:生产环境中务必启用 HTTPS 协议保护通信安全。 - **超时重试机制**:如果商家未及时反馈结果给支付宝系统,默认情况下它会在一定时间间隔内多次尝试重新推送直到获得最终答复为止[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值