Java支付宝统一收单异步通知接口详解

在进行网上支付时,支付宝是一种非常常用的支付方式。为了保证支付的安全和准确性,支付宝提供了统一收单异步通知接口,用于通知商户订单的支付情况。本文将介绍如何在Java中使用支付宝统一收单异步通知接口,并提供相关代码示例。

什么是支付宝统一收单异步通知接口?

支付宝统一收单异步通知接口是支付宝提供的一种服务,用于在用户支付完成后向商户服务器发送支付结果通知。通过这个接口,商户可以及时获取订单的支付状态,进行后续的业务处理。

如何使用支付宝统一收单异步通知接口?

在Java程序中,我们可以通过监听HTTP请求的方式来接收支付宝的异步通知。以下是使用Java编写的示例代码:

// 接收支付宝的异步通知
@RestController
public class AlipayNotifyController {

    @PostMapping("/notify")
    public String notify(HttpServletRequest request) {
        Map<String, String[]> params = request.getParameterMap();
        Map<String, String> paramMap = new HashMap<>();
        for (Map.Entry<String, String[]> entry : params.entrySet()) {
            paramMap.put(entry.getKey(), entry.getValue()[0]);
        }

        // 验证签名
        if (AlipaySignature.rsaCheckV1(paramMap, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE)) {
            // 验证通过
            String tradeStatus = paramMap.get("trade_status");
            if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)) {
                // 处理支付成功的逻辑
                // 可以更新订单状态、发货等操作
                return "success";
            }
        }

        return "fail";
    }
}

在上面的代码中,我们定义了一个AlipayNotifyController类,用于接收支付宝的异步通知。在notify方法中,我们首先将HTTP请求参数转换为Map,并验证签名的有效性。如果签名验证通过且交易状态为成功,则可以进行后续操作。

支付宝异步通知参数说明

当支付宝向商户发送异步通知时,会包含一些参数,用于确认订单的支付状态。以下是一些常见的异步通知参数:

  • notify_time:通知时间
  • notify_type:通知类型
  • notify_id:通知校验ID
  • sign_type:签名类型
  • sign:签名
  • trade_no:支付宝交易号
  • out_trade_no:商户订单号
  • trade_status:交易状态
  • total_amount:订单金额
  • buyer_id:买家支付宝用户号
  • seller_id:卖家支付宝用户号

代码示例

下面是一个完整的Java示例代码,用于监听支付宝的异步通知并处理支付结果:

// 导入相关的包
import com.alipay.api.internal.util.AlipaySignature;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@RestController
public class AlipayNotifyController {

    private static final String ALIPAY_PUBLIC_KEY = "your_alipay_public_key";
    private static final String CHARSET = "UTF-8";
    private static final String SIGN_TYPE = "RSA2";

    @PostMapping("/notify")
    public String notify(HttpServletRequest request) {
        Map<String, String[]> params = request.getParameterMap();
        Map<String, String> paramMap = new HashMap<>();
        for (Map.Entry<String, String[]> entry : params.entrySet()) {
            paramMap.put(entry.getKey(), entry.getValue()[0]);
        }

        if (AlipaySignature.rsaCheckV1(paramMap, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE)) {
            String tradeStatus = paramMap.get("trade_status");
            if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)) {
                // 处理支付成功的逻辑
                return "success";
            }
        }

        return "fail";
    }
}

甘特图

下面是一个简单的甘特图,展示了支付宝异步通知的处理流程:

gantt
    title 支付宝异步通知处理流程
    section 接收通知
    接收通知: 0.5h