实现支付宝支付成功回调的完整流程

一、支付成功回调流程

在实现支付宝支付成功回调之前,我们需要了解整个流程。下表展示了处理支付宝支付的步骤:

步骤 描述
1. 用户在前端发起支付请求 用户在应用中选择商品并提交支付请求。
2. 生成支付宝订单 后端接收到请求后,生成订单并向支付宝发起支付请求。
3. 用户完成支付 用户在支付宝界面完成支付。
4. 支付宝向商户服务器发送回调 支付宝支付成功后,向你的服务端发送支付结果通知。
5. 处理回调 后端接收到回调信息,处理支付结果并更新数据库。

二、实现步骤

1. 用户在前端发起支付请求

在前端应用中,用户可以选择商品并发起支付请求。这部分代码通常涉及到UI的构建,不在本文讨论范围内。

2. 生成支付宝订单

后端需要处理用户的支付请求,生成订单并请求支付宝进行支付。以下是Java代码示例:

// 引入所需的支付宝SDK
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;

// 创建支付宝客户端
AlipayClient alipayClient = new DefaultAlipayClient(
        " // 接口网关
        "your_app_id", // 商户应用ID
        "your_private_key", // 商户私钥
        "json", // 返回格式
        "UTF-8", // 编码格式
        "alipay_public_key", // 支付宝公钥
        "RSA2" // 签名方式
);

// 创建请求对象
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl("http://your_return_url"); // 支付成功返回地址
request.setNotifyUrl("http://your_notify_url"); // 支付结果异步通知地址

// 设置业务参数
request.setBizContent("{" +
    "    \"out_trade_no\":\"20150320010101001\"," + // 商户订单号
    "    \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," + // 销售产品码
    "    \"total_amount\":88.88," + // 订单金额
    "    \"subject\":\"Iphone6 16G\", " + // 商品名称
    "    \"body\":\"Iphone6 16G\" " + // 商品描述
    "}");

// 发送请求
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);

3. 用户完成支付

用户在支付宝界面完成支付后,支付宝将会根据我们设置的 notify_url 进行支付结果的回调。

4. 支付宝向商户服务器发送回调

支付宝发起回调时,会向我们在上一步中设置的 notify_url 发送POST请求。下面是处理回调的方法:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 处理支付宝回调
public void handleAlipayCallback(HttpServletRequest request, HttpServletResponse response) {
    // 获取支付宝的通知参数
    Map<String, String[]> parameterMap = request.getParameterMap();
    
    // 验证签名和参数
    boolean isVerified = AlipaySignature.rsaCheckV1(parameterMap, "alipay_public_key", "UTF-8", "RSA2");
    
    if (isVerified) {
        String tradeStatus = request.getParameter("trade_status");
        String tradeNo = request.getParameter("trade_no");
        String outTradeNo = request.getParameter("out_trade_no");

        if ("TRADE_SUCCESS".equals(tradeStatus)) {
            // 业务逻辑:更新订单状态等
            updateOrderStatus(outTradeNo, "PAID");
        }
        // 返回success给支付宝
        response.getWriter().write("success");
    } else {
        // 验签失败
        response.getWriter().write("fail");
    }
}
  • 上述代码中,我们首先获取所有的请求参数并进行签名验证。
  • 如果验证成功,则获取 trade_status 和其他相关参数,并根据 trade_status 进行相应的业务处理。

5. 处理回调

当支付宝回调成功后,需要根据 trade_status 更新数据库中的订单状态。在这里我们使用了一些伪代码来表示更新操作,具体实现可能会根据实际情况有所不同:

// 更新订单状态的示例
public void updateOrderStatus(String outTradeNo, String status) {
    // 假设有个OrderDAO负责与数据库交互
    OrderDAO orderDAO = new OrderDAO();
    orderDAO.updateStatus(outTradeNo, status);
}

三、数据库模型关系

下面用 mermaid 语法表示与支付宝回调相关的数据库模型关系。

erDiagram
    USER ||--o{ ORDER : places
    ORDER }o--|| PAYMENT : includes
    PAYMENT }o--|| ALIPAY : processes

结尾

通过以上步骤,我们完成了支付宝支付成功回调的实现。从用户发起支付请求,到后端接收回调并处理,都有了清晰的步骤和示例代码。掌握这些技能后,你能够更好地实现与支付宝的集成,并处理支付相关的业务逻辑。如果在实现过程中遇到问题,可以随时查阅支付宝官方文档或相应的SDK文档。祝你开发顺利!