服务商如何申请商家APP支付宝支付?
明确结论
服务商帮助商家的 APP 接入支付宝支付时,通常采用“第三方应用代商家调用”模式,流程如下:
- 商家完成支付宝商家认证并开通
APP支付产品。 - 服务商在支付宝开放平台创建第三方应用,配置密钥、网关和回调地址。
- 商家授权服务商应用代为调用支付接口。
- 服务商用授权码换取
app_auth_token。 - 服务商后端携带
app_auth_token,调用alipay.trade.app.pay创建订单。 - 商家 APP 通过支付宝客户端 SDK 发起支付,服务商后端根据异步通知确认最终支付结果。
服务商不能只用自己的账号替未签约、未授权的商家收款。商家仍需具备支付宝要求的主体资质,并完成产品签约和授权。
申请前需要准备什么
商家一般需要准备:
- 已完成认证的支付宝企业或个体工商户账号
- 营业执照和经营信息
- APP 名称、简介、图标和应用截图
- Android 包名、应用签名,或 iOS Bundle ID
- APP 下载地址、应用市场地址或其他可供审核的安装方式
- 隐私政策、用户协议等页面
- 与实际经营内容相符的行业资质
服务商一般需要准备:
- 已完成认证的支付宝开放平台账号
- 第三方应用
- 应用公钥、应用私钥,以及支付宝公钥或支付宝公钥证书
- 商家授权回调地址
- 支付异步通知地址
- 商家、授权令牌与订单之间的映射关系
所需材料和审核要求可能随商家行业、主体类型及开放平台规则变化,申请时应以支付宝开放平台页面显示的要求为准。
具体申请流程
1. 商家开通 APP 支付
商家登录支付宝开放平台或商家平台,创建与其 APP 对应的移动应用,并申请 APP支付 能力。
申请时需要确认:
- 应用主体与实际经营主体一致,或双方的授权关系可以得到证明
- APP 中已有可供审核的商品或服务页面
- APP 的经营内容与申请行业一致
- 包名、Bundle ID 等信息填写准确
- 收款账户属于实际提供商品或服务的商家
通过审核并完成签约后,商家才能使用相应的 APP 支付能力。
2. 服务商创建第三方应用
服务商在支付宝开放平台创建第三方应用,用它帮助多个商家完成授权、下单和订单查询。
应用通常需要配置:
- RSA2 密钥或证书
- 商家授权回调地址
- 支付异步通知地址
- 代商家调用接口所需的权限
- 应用网关和相关安全配置
第三方应用的 app_id 属于服务商。实际调用接口时,系统通过各商家的 app_auth_token 区分所代表的商家。
3. 引导商家完成授权
服务商生成商家授权链接,引导商家进入支付宝授权页面。商家登录并确认授权后,支付宝会向服务商配置的回调地址返回授权码,通常为 app_auth_code。
服务商通过以下接口换取授权令牌:
alipay.open.auth.token.app
请求形式如下:
{
"grant_type": "authorization_code",
"code": "商家授权后返回的 app_auth_code"
}
调用成功后会获得:
app_auth_token:代商家调用接口时使用app_refresh_token:授权令牌到期后用于刷新
授权码通常有有效期,并且只能按照平台规则使用。服务商收到授权回调后,应立即在服务端换取令牌,不能在 APP 客户端完成这一过程。
4. 安全保存商家授权信息
服务商应按商家分别保存以下信息:
merchant_id
merchant_alipay_user_id
app_auth_token
app_refresh_token
token_expire_time
authorization_status
app_auth_token 和 app_refresh_token 都是敏感凭据,不能返回给商家 APP,也不能以明文形式写入前端代码或日志。
5. 服务端创建 APP 支付订单
用户在商家 APP 中提交订单后,APP 将业务订单信息发送到服务商后端。服务商后端根据商家标识找到对应的 app_auth_token,然后调用:
alipay.trade.app.pay
以下是使用支付宝 Java SDK 的示意代码:
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
isvAppId,
isvPrivateKey,
"json",
"UTF-8",
alipayPublicKey,
"RSA2"
);
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setOutTradeNo("M202609090001");
model.setTotalAmount("99.00");
model.setSubject("商家订单");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl("https://pay.example.com/alipay/notify");
// 代表指定商家调用接口
request.putOtherTextParam("app_auth_token", merchantAppAuthToken);
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
if (!response.isSuccess()) {
throw new IllegalStateException(
response.getCode() + ": " + response.getSubMsg()
);
}
// 将完整订单字符串返回给商家 APP
String orderString = response.getBody();
不同版本的支付宝 Java SDK,方法签名可能略有差别。如果当前版本提供了专门传入 app_auth_token 的重载方法,应按该版本的 SDK 文档调用。
APP 客户端收到完整的 orderString 后,将它交给支付宝客户端 SDK:
PayTask payTask = new PayTask(activity);
Map<String, String> result = payTask.payV2(orderString, true);
应用私钥、签名过程和 app_auth_token 必须保留在服务端,不能放进 Android 或 iOS 安装包。
6. 验证支付异步通知
支付完成后,支付宝会向 notify_url 发送异步通知。服务商收到通知后,至少要完成以下检查:
- 使用支付宝公钥或证书验证签名。
- 检查通知中的
app_id。 - 确认
out_trade_no存在。 - 核对订单金额、币种和实际收款商家。
- 检查订单是否已经处理,保证接口幂等。
- 所有校验通过后再更新订单状态。
- 按支付宝协议返回成功响应。
不能只凭 APP 客户端返回的支付结果发货。客户端结果可能因网络中断、应用退出或伪造请求而不完整。最终状态应以验签通过的异步通知为准,也可以由服务端主动查询确认。
主动查询可以使用:
alipay.trade.query
查询时也需要携带该商家的 app_auth_token。
两种接入模式不要混淆
商家自行维护支付后端时,可以使用自己的应用和密钥直接调用支付接口,不需要授权服务商代为调用。
服务商统一为多个商家提供 SaaS 支付能力时,则应采用第三方应用授权模式。每个商家都要分别完成签约和授权。多个独立商家不能共用同一个商家的收款身份,也不能只通过修改订单参数来切换实际收款方。
注意事项
app_id、商家主体、APP 包名和支付签约关系需要保持一致,或符合支付宝允许的授权模式。- 每次下单时,都应根据当前商家选用对应的
app_auth_token,以免发生串户收款。 out_trade_no在服务商系统中应保持唯一,创建后不要随意复用。- 金额必须由服务端根据商品和优惠规则计算,不能直接采用客户端传入的金额。
- 私钥不能提交到代码仓库、写入 APP 或通过接口下发。
- 商家取消授权、令牌失效或产品签约终止后,服务商应立即停止代为调用。
- 正式环境和沙箱环境的应用、网关、密钥及授权令牌不能混用。
- 如果业务涉及二清、资金归集、分账或平台代理收款,还需另行确认支付宝产品及相关合规要求。普通
APP支付授权并不当然支持这些资金模式。 - 开放平台的菜单名称、审核材料和授权页面可能调整。实际申请时,应以控制台展示内容和对应接口文档为准。
备注:内容仅供参考。
