支付宝现在是否提供免费的支付开放接口?
结论
支付宝提供开放的支付接口。商家可以在支付宝开放平台创建应用,接入电脑网站支付、手机网站支付、App 支付、当面付等功能。
API 的开发和调用通常不单独收费,但使用支付宝收款并不一定免费。支付交易可能产生商家服务费,费率由签约产品、商户类型、所属行业、活动政策和签约协议决定。部分支付功能还要求商家完成企业认证、应用审核和产品签约。
准确来说,支付宝提供可供商家接入的支付 API。交易是否收费以及具体费率,应以商户签约页面和合同为准。
可以接入哪些支付 API
常见支付场景及对应接口如下:
| 支付场景 | 主要 API | 适用情况 |
|---|---|---|
| 电脑网站支付 | alipay.trade.page.pay | 用户在电脑浏览器中跳转至支付宝付款 |
| 手机网站支付 | alipay.trade.wap.pay | 用户在手机浏览器中完成付款 |
| App 支付 | alipay.trade.app.pay | Android、iOS App 调起支付宝客户端 |
| 当面付扫码支付 | alipay.trade.precreate | 商家生成二维码,用户扫码付款 |
| 当面付条码支付 | alipay.trade.pay | 商家扫描用户付款码 |
| 订单查询 | alipay.trade.query | 查询支付结果和订单状态 |
| 交易退款 | alipay.trade.refund | 对已支付交易发起退款 |
| 退款查询 | alipay.trade.fastpay.refund.query | 查询退款处理结果 |
| 交易关闭 | alipay.trade.close | 关闭尚未完成付款的订单 |
商家实际能够申请哪些接口,要看支付宝开放平台能力中心当前提供的产品以及相应的准入条件。
接入步骤
1. 创建开放平台应用
登录支付宝开放平台,在控制台中创建与业务对应的网页应用、移动应用或小程序。创建完成后,平台会分配 app_id。
应用类型需要与支付场景对应。网站收款通常接入电脑网站支付或手机网站支付,原生移动应用则接入 App 支付。
2. 配置接口签名
支付宝开放接口通常采用 RSA2 签名。商户需要生成应用私钥和应用公钥,并将应用公钥配置到开放平台。
接入时一般需要准备:
app_id- 应用私钥
- 支付宝公钥或支付宝公钥证书
- 异步通知地址
notify_url - 同步跳转地址
return_url - 签名方式
RSA2
应用私钥只能存放在服务端,不能写入网页或 App 安装包,也不要提交到公开代码仓库。
3. 申请并签约支付产品
在应用中添加需要使用的支付功能,再按照页面要求提交审核或完成签约。不同产品的准入条件、材料要求和费率可能不同。
开发者可以使用沙箱环境进行联调,但沙箱交易不能用于正式收款。上线前,还需要改用正式网关、正式应用配置和正式密钥。
4. 服务端调用支付接口
支付请求应由服务端生成并签名,再把支付页面、跳转地址或支付参数返回给前端。
以下是使用支付宝 Java SDK 调用电脑网站支付接口 alipay.trade.page.pay 的基本示例:
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
public class AlipayPagePayExample {
public static void main(String[] args) throws AlipayApiException {
String gatewayUrl = "https://openapi.alipay.com/gateway.do";
String appId = "YOUR_APP_ID";
String appPrivateKey = "YOUR_APP_PRIVATE_KEY";
String alipayPublicKey = "ALIPAY_PUBLIC_KEY";
AlipayClient alipayClient = new DefaultAlipayClient(
gatewayUrl,
appId,
appPrivateKey,
"json",
"UTF-8",
alipayPublicKey,
"RSA2"
);
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl("https://example.com/alipay/return");
request.setNotifyUrl("https://example.com/alipay/notify");
request.setBizContent("""
{
"out_trade_no": "ORDER_202609080001",
"total_amount": "99.00",
"subject": "测试商品",
"product_code": "FAST_INSTANT_TRADE_PAY"
}
""");
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
if (response.isSuccess()) {
String paymentHtml = response.getBody();
System.out.println(paymentHtml);
} else {
System.err.println(response.getSubCode());
System.err.println(response.getSubMsg());
}
}
}
pageExecute 通常会返回可以提交或直接输出到浏览器的支付页面内容。在生产环境中,应通过 Web 响应将其返回给浏览器,不能只打印到控制台。
不同版本的 SDK 在类名、构造方式和证书模式配置上可能存在差异。实际接入时应参考当前的官方 SDK 文档,不要直接使用示例中的占位配置。
5. 验证异步通知
用户付款后,支付宝会向 notify_url 发送异步通知。服务端需要完成以下处理:
- 使用支付宝公钥验证通知签名。
- 核对
app_id、seller_id、out_trade_no等身份和订单信息。 - 检查
total_amount是否与本地订单金额一致。 - 确认
trade_status是业务认可的支付状态。 - 通过数据库唯一约束或订单状态判断实现幂等处理。
- 处理成功后,按照接口要求返回
success。
不能仅凭浏览器跳转到 return_url 就认定付款成功。同步跳转可能中断,也可能被伪造。最终订单状态应以验签通过的异步通知或主动查询结果为准。
费用如何确认
判断支付 API 是否会产生交易服务费,不能只看接口能否调用。正式接入前,应检查以下信息:
- 产品签约页面显示的服务费率;
- 商户与支付宝签署的协议;
- 当前行业和经营类目对应的费率;
- 优惠活动的有效期及适用范围;
- 退款后是否退还原交易服务费;
- 是否有结算、提现或其他附加规则。
支付宝可能调整产品名称、准入条件和收费政策,正式费率应以签约时页面展示的信息为准。
注意事项
- 支付接口通常要求商户主体,个人账号不一定能申请全部支付产品。
- 不要将应用私钥、AES 密钥或其他敏感配置放在前端。
- 金额应使用十进制字符串或可靠的金额类型处理,避免直接使用浮点数计算。
out_trade_no应由商户生成,并确保不会重复。- 支付宝可能重复发送异步通知,因此订单更新必须具备幂等性。
- 接口请求超时不能直接视为支付失败,应调用
alipay.trade.query查询最终状态。 - 发起退款时应使用独立且可追踪的退款请求号,并记录支付宝返回的结果。
- 上线前应分别测试支付成功、支付取消、重复通知、订单超时、退款和网络异常等情况。
备注:内容仅供参考。
