2. 支付宝支付SDK核心接口梳理

支付宝支付SDK围绕支付、授权、订单查询与回调处理四大核心领域提供标准化接口。本章深入分析各接口的设计原理、调用流程、常见参数与返回结构,并通过内联SVG展示接口之间的协作关系,为后续Compose桥接打下牢固基础。

支付宝SDK核心接口关系图 支付接口 alipayClient.execute 授权接口 OAuth2.0 / alipay.user.info 订单查询 alipay.trade.query 回调处理类 NotifyReceiver / AuthCallback 支付宝服务器 验签 / 异步通知 同步结果 授权code 查询请求 异步通知 处理结果 说明:支付与授权返回同步结果给回调处理器;订单查询直接向支付宝服务器发起; 支付宝服务器通过异步通知方式将交易状态推送给回调处理类。
接口设计原则:支付宝SDK将支付与授权解耦,回调处理类统一管理异步通知和同步结果,订单查询作为补偿机制保障最终一致性。后续Compose桥接中需合理分配主线程与IO线程。

2.1 支付接口:alipayClient.execute

支付接口是SDK最核心的入口,用于发起App支付、手机网站支付等请求。其本质是向支付宝服务器提交交易订单,并返回用于客户端调用的字符串(如orderInfo)。

原理

  • 签名机制:商户服务端使用RSA私钥对订单参数串进行签名,SDK将携带签名的orderInfo传给支付宝客户端。
  • 支付流程:支付宝客户端解析orderInfo后唤起收银台,用户完成支付,支付宝后台同步返回处理结果。

核心API示例(Kotlin)

// 构造支付请求参数
val payRequest = AlipayTradeAppPayRequest().apply {
    notifyUrl = "https://yourdomain.com/pay/notify"
    bizContent = """
        {
            "subject": "测试商品",
            "out_trade_no": "${System.currentTimeMillis()}",
            "total_amount": "0.01",
            "product_code": "QUICK_MSECURITY_PAY"
        }
    """.trimIndent()
}

// 执行请求(需在IO线程)
val response = AlipayClient.execute(payRequest)

// 获取orderInfo字符串传递给支付宝App
val orderInfo = response.body
// 通过callback处理客户端返回结果
⚠ 常见错误:
  • orderInfo签名过期(系统时间错误导致验签失败)。
  • notifyUrl不能为本地地址或localhost,必须公网可达。
  • 并发请求时需保证out_trade_no唯一,否则可能创建重复订单。

2.2 授权接口:OAuth2.0 与 alipay.user.info

授权接口用于获取用户支付宝账号的授权信息(头像、昵称、用户ID等),通常用于登录场景。原理基于OAuth2.0授权码模式:

  • App唤起支付宝授权页面,用户同意后获得authCode。
  • 服务端使用authCode换取access_和用户信息。

API调用示例(服务端Java)

// 第一步:构造授权链接(客户端唤起使用)
String url = "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?" +
    "app_id=" + appId +
    "&scope=auth_user" +
    "&redirect_uri=" + URLEncoder.encode("alipay://callback", "UTF-8");

// 第二步:服务端根据authCode获取
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setGrantType("authorization_code");
request.setCode(authCode);
AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
String accessToken = response.getAccessToken();

// 第三步:查询用户信息
AlipayUserInfoShareRequest userReq = new AlipayUserInfoShareRequest();
AlipayUserInfoShareResponse userResp = alipayClient.execute(userReq, accessToken);
log.info("用户昵称:{}", userResp.getNickName());
⚡ 性能优化:授权接口的access_有效期通常为24小时,建议应用层缓存,减少重复授权请求。若用户频繁授权,可使用静默授权(scope=auth_base)快速获取userId,无需用户手动确认。

2.3 订单查询功能:alipay.trade.query

订单查询是支付成功率的保障,适用于以下场景:

  • 支付结果回调丢失或延迟,通过主动查询确认交易状态。
  • 对账:定期扫描未完成订单,调用查询接口进行补偿。

请求参数与返回结构

参数 类型 必填 说明
out_trade_no String 是(与trade_id二选一) 商户订单号,64个字符以内
trade_no String 是(与out_trade_no二选一) 支付宝交易号,优先级高于out_trade_no
trade_status String 返回 枚举:WAIT_BUYER_PAY / TRADE_SUCCESS / TRADE_FINISHED / TRADE_CLOSED

示例代码(Kotlin协程)

data class TradeStatusResponse(
    val outTradeNo: String,
    val tradeNo: String,
    val tradeStatus: String,
    val totalAmount: String
)

suspend fun queryTrade(orderId: String): TradeStatusResponse {
    val request = AlipayTradeQueryRequest().apply {
        bizContent = """{"out_trade_no": "$orderId"}"""
    }
    val response = alipayClient.execute(request) // IO线程
    val body = JSONObject(response.body)
    return TradeStatusResponse(
        outTradeNo = body.getString("out_trade_no"),
        tradeNo = body.getString("trade_no"),
        tradeStatus = body.getString("trade_status"),
        totalAmount = body.getString("total_amount")
    )
}
🔍 调试建议:开发环境可使用支付宝沙箱工具模拟订单状态变化。查询接口返回的send_pay_date字段对分析支付延迟很有帮助。

2.4 回调处理类:NotifyReceiver & AuthCallback

回调处理是支付宝SDK异步通知的终点,分为两类:

  • 服务端异步通知:支付宝在支付完成后向商户notify_url发送POST请求,携带交易参数与签名。
  • 客户端同步回调:支付成功后支付宝App通过intent或URL Scheme返回结果码(9000成功、8000处理中等)。

服务端验签核心逻辑

String sign = request.getParameter("sign");
String content = AlipaySignature.getSignCheckContentV2(request.getParameterMap());
boolean isVaild = AlipaySignature.rsaCheckV2(content, sign, alipayPublicKey, "UTF-8");

if (isVaild) {
    String tradeStatus = request.getParameter("trade_status");
    if ("TRADE_SUCCESS".equals(tradeStatus)) {
        // 更新订单状态,返回success给支付宝
        response.getWriter().write("success");
    }
} else {
    // 验签失败,记录日志并丢弃
    log.warn("异步通知验签失败,参数: {}", request.getParameterMap());
}
⚠ 常见错误处理:
  • 异步通知重复发送:必须实现幂等性,通过订单号+状态校验防重复处理。
  • 同步回调结果不可信:客户端可能被篡改,必须以后端异步通知和订单查询为准。
  • 验签时注意编码:支付宝文档强调使用UTF-8,且签名校验只能用支付宝公钥(非商户公钥)。

2.5 接口调用流程总览

以下流程步骤归纳了支付、授权、查询与回调的完整协作关系:

  1. 支付发起:服务端组装订单参数并签名,返回orderInfo给App。
  2. 唤起支付:App通过SDK的AlipaySDK.payV2(orderInfo, true)唤起支付宝客户端。
  3. 同步回调:支付完成,支付宝App通过Intent回调返回结果码(9000/8000/6001等)。
  4. 异步通知:支付宝服务器向notify_url发送POST请求,包含完整交易数据和签名。
  5. 服务端处理:验签通过后更新订单状态,返回"success"给支付宝。
  6. 订单补偿查询:若异步通知超时或丢失,App可主动调用alipay.trade.query确认状态。
  7. 授权流程:用户授权后获得authCode,服务端换取access_后调用用户信息接口。
📌 本章核心要点:
  • 支付接口(alipayClient.execute)是核心入口,必须理解orderInfo生成与签名的关系。
  • 授权接口遵循OAuth2.0授权码模式,access_需要缓存且注意scope选择。
  • 订单查询接口作为最终一致性保障,建议在支付结果页主动调用。
  • 回调处理类必须实现幂等性与严格验签,异步通知是可信的交易凭证。