自有APP和网站接入支付宝支付应选择哪个平台?
结论
自有 APP 和网站接入支付宝支付时,开发和接口接入应通过支付宝开放平台完成。支付宝商家平台则主要用于商户经营管理,包括交易查询、账单下载和资金管理等日常工作。
这两个平台需要配合使用,常见流程如下:
- 在支付宝开放平台创建应用,配置所需的支付能力。
- 使用已完成认证的支付宝商家账号签约支付产品。
- 在开放平台获取应用参数、配置密钥并开发接口。
- 上线后通过支付宝商家平台管理交易、账单和资金。
简单来说:开放平台负责支付接口怎么接,商家平台负责接入后怎么管理。
两个平台有什么区别
| 对比项 | 支付宝开放平台 | 支付宝商家平台 |
|---|---|---|
| 主要用途 | 创建应用、申请接口、配置密钥、联调开发 | 管理门店、交易、账单、资金及经营数据 |
| 面向角色 | 开发者、技术团队、系统服务商 | 商户负责人、财务和运营人员 |
| 支付接入相关功能 | 应用创建、接口权限、支付产品签约、应用网关、回调地址、密钥配置 | 查询交易和账单、退款及资金管理等 |
| 是否用于编写支付程序 | 是 | 通常不是 |
| 是否需要商户主体 | 正式接入支付一般需要完成主体认证,并满足相应产品的签约条件 | 需要对应的商家账号及权限 |
账号类型、所属行业和支付产品不同,准入条件也可能不同。具体可申请的能力和签约要求,应以开放平台控制台的实际显示为准。
APP 和网站分别选择什么支付产品
不必因为同时有一个 APP 和一个网站,就机械地创建多个账户。支付产品应根据实际使用场景选择:
- 原生 Android 或 iOS APP:通常接入 APP 支付,调用
alipay.trade.app.pay。 - PC 浏览器网站:通常接入 电脑网站支付,调用
alipay.trade.page.pay。 - 手机浏览器中的 H5 网站:通常接入 手机网站支付,调用
alipay.trade.wap.pay。
如果同一业务同时有 APP、PC 网站和 H5 页面,可以根据业务归属,在开放平台创建、关联或配置应用,再申请对应的支付能力。能否共用同一个应用,取决于控制台中的应用类型和产品配置规则,不能只看接口名称。
接入步骤
1. 完成商家主体认证
使用企业、个体工商户等符合要求的主体注册并认证支付宝账号。支付产品是否对某类主体开放,是否需要补充行业资质,应以申请页面的提示为准。
2. 在开放平台创建应用
登录支付宝开放平台,根据支付场景创建网页应用、移动应用等对应类型的应用,并填写以下信息:
- 应用名称和基本资料
- APP 包名、应用签名等移动端信息
- 网站地址等网页端信息
- 应用网关或授权回调地址
- 异步通知地址
notify_url - 接口加签方式和公钥
创建完成后会获得 app_id。应用正式调用生产接口前,通常还需要通过审核并上线。
3. 申请并签约支付产品
根据使用场景申请 APP 支付、电脑网站支付或手机网站支付。创建应用不等于已经获得收款权限,还要确认相应的支付产品已经签约并生效。
4. 配置接口签名
支付请求需要使用应用私钥签名。收到支付宝返回的数据后,需要使用支付宝公钥或支付宝公钥证书验签。
通常需要妥善保管以下配置:
app_id- 应用私钥
- 支付宝公钥,或支付宝公钥证书
- 应用公钥证书
- 支付宝根证书
- 签名算法,例如
RSA2
使用公钥模式还是证书模式,必须与开放平台控制台中的应用配置一致。两种模式使用的客户端初始化方法和验签参数不同,不能混用。
5. 由服务端创建支付订单
商户服务端应生成唯一的商户订单号 out_trade_no,再调用对应的支付接口:
- APP 支付接口返回支付参数字符串,由 APP 交给支付宝客户端 SDK 发起支付。
- 电脑网站支付接口通常返回用于跳转或提交的表单。
- 手机网站支付接口通常返回 H5 跳转页面或表单。
支付金额、订单号和商品信息必须由可信的服务端生成,不能直接采用客户端传入的最终值。
Java 服务端示例
下面使用支付宝 Java SDK 的常见调用方式说明核心流程。依赖坐标、SDK 构造方法和证书配置方式可能随 SDK 版本变化,应以所用版本的官方说明为准。
APP 支付
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
APP_ID,
APP_PRIVATE_KEY,
"json",
"UTF-8",
ALIPAY_PUBLIC_KEY,
"RSA2"
);
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setNotifyUrl("https://pay.example.com/alipay/notify");
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setOutTradeNo("ORDER_202609090001");
model.setTotalAmount("99.00");
model.setSubject("会员服务");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
if (!response.isSuccess()) {
throw new IllegalStateException(
response.getCode() + ": " + response.getSubMsg()
);
}
// 将签名后的订单参数返回给 APP,再由支付宝客户端 SDK 发起支付
String orderString = response.getBody();
电脑网站支付
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl("https://www.example.com/pay/result");
request.setNotifyUrl("https://pay.example.com/alipay/notify");
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.setOutTradeNo("ORDER_202609090002");
model.setTotalAmount("299.00");
model.setSubject("网站订单");
model.setProductCode("FAST_INSTANT_TRADE_PAY");
request.setBizModel(model);
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
if (!response.isSuccess()) {
throw new IllegalStateException(
response.getCode() + ": " + response.getSubMsg()
);
}
// 将 response.getBody() 返回给浏览器,完成页面跳转或表单提交
String paymentForm = response.getBody();
示例中的订单号只用于演示。生产环境必须确保 out_trade_no 在商户系统中唯一,也不要把真实私钥直接写进源代码。
异步通知处理
判断支付是否成功,应以支付宝服务端发送的异步通知和主动查询结果为准,不能只依赖浏览器同步跳转页面或 APP 客户端返回值。
处理异步通知时,至少要完成以下检查:
- 使用支付宝 SDK 验证通知签名。
- 检查通知中的
app_id是否属于当前应用。 - 检查
out_trade_no是否存在,并确认它属于当前商户。 - 检查
total_amount、币种和订单金额是否一致。 - 检查交易状态是否符合业务要求。
- 以唯一订单号进行幂等处理,避免重复发货。
- 处理成功后,按照支付宝接口要求返回成功响应。
常见的 Java 验签形式如下:
Map<String, String> params = new HashMap<>();
for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
String value = String.join(",", entry.getValue());
params.put(entry.getKey(), value);
}
boolean verified = AlipaySignature.rsaCheckV1(
params,
ALIPAY_PUBLIC_KEY,
"UTF-8",
"RSA2"
);
if (!verified) {
response.getWriter().write("failure");
return;
}
// 继续核对 app_id、订单号、金额和交易状态,并执行幂等更新
boolean processed = processPaymentIdempotently(params);
response.getWriter().write(processed ? "success" : "failure");
如果应用使用证书模式,初始化和验签也必须采用与证书模式匹配的方案,不能直接套用公钥模式的配置。
容易踩坑的地方
不要让客户端保存应用私钥
APP、网页 JavaScript 和小程序代码都可能被分析或篡改。应用私钥只能保存在商户服务端,建议通过密钥管理系统或受控配置中心管理。
return_url 不能作为到账依据
return_url 只负责将用户带回商户页面。用户可能在跳转前关闭页面,返回参数也可能被伪造,所以不能根据它发货或开通服务。
异步通知可能重复到达
网络重试可能让同一笔支付通知被多次发送。订单更新、发货和权益发放都必须支持幂等处理。
支付结果不明确时要主动查询
遇到请求超时、客户端中断或通知延迟时,应调用交易查询接口核实订单状态,不要直接使用相同订单号再次发起支付。
沙箱和生产环境配置要分离
沙箱网关、应用编号、密钥和测试账号不能与生产配置混用。切换到生产环境时,还要确认应用已经上线、支付产品已经签约,并且回调地址可以从公网访问。
一个支付产品不一定覆盖所有终端
电脑网站支付、手机网站支付和 APP 支付对应不同场景。如果需要支持多个终端,应分别确认相应的支付产品已经申请并生效。
技术团队主要通过支付宝开放平台创建应用、完成签约配置和开发接口。商户负责人、财务和运营人员则使用支付宝商家平台处理后续经营与资金管理。两个平台需要配合使用,不能通过商家平台代替开放平台完成支付接口接入。
备注:内容仅供参考。
