支付宝小程序能否打开第三方APP并在支付后跳回APP?
结论
支付宝小程序通常无法通过任意 URL Scheme 打开未经关联和授权的第三方 App。能否唤起 App,取决于支付宝开放平台是否向该应用开放了相应能力,以及小程序和 App 是否完成主体认证、应用关联与跳转配置。这不是一项通用能力。
如果业务流程是「第三方 App 唤起支付宝支付,支付完成后返回原 App」,应接入支付宝 App 支付 SDK。支付结束后,SDK 会通过回调或 App Scheme 返回发起支付的 App,不需要先进入支付宝小程序。
推荐实现流程
通常可以按以下流程接入:
- App 向业务服务器请求支付订单。
- 服务器调用支付宝接口创建订单并完成签名。
- 服务器将签名后的
orderString返回给 App。 - App 使用支付宝 SDK 发起支付。
- 支付完成或用户取消后,支付宝客户端返回原 App。
- App 接收 SDK 回调。
- App 向业务服务器查询订单状态,并以服务器异步通知或主动查询结果为准。
不要只根据客户端返回的 resultStatus 更新订单。客户端结果可能被伪造,也可能因网络异常或进程被回收而丢失。
Android 示例
以下代码只展示客户端调用结构。orderInfo 必须由服务器生成并签名,不能将私钥放在 App 中。
Thread {
val payTask = PayTask(this)
val result: Map<String, String> = payTask.payV2(orderInfo, true)
runOnUiThread {
val resultStatus = result["resultStatus"]
// 客户端结果只用于提示用户。
// 最终支付状态应向业务服务器查询。
when (resultStatus) {
"9000" -> queryOrderFromServer()
"6001" -> showMessage("支付已取消")
else -> queryOrderFromServer()
}
}
}.start()
一般情况下,支付宝 SDK 完成支付后会自动返回发起调用的 App。接入时还要根据所用 SDK 版本的文档,配置 Android Manifest、包名、签名和相关回调组件。
iOS 示例
iOS App 需要配置用于回跳的 URL Scheme,并将同一个 Scheme 传给支付宝 SDK:
AlipaySDK.defaultService().payOrder(
orderString,
fromScheme: "yourAppScheme"
) { result in
// 此结果适合用于界面提示。
// 最终订单状态仍应由服务器确认。
queryOrderFromServer()
}
App 还需要处理支付宝的回跳 URL。具体入口取决于项目使用的 AppDelegate、SceneDelegate 和支付宝 SDK 版本,例如:
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any] = [:]
) -> Bool {
AlipaySDK.defaultService().processOrder(withPaymentResult: url) { result in
queryOrderFromServer()
}
return true
}
yourAppScheme 应具有唯一性,并配置在 Xcode 的 URL Types 中。不同版本的 SDK 可能会调整回调方法,具体应以当前支付宝开放平台文档和项目所集成 SDK 的接口定义为准。
如果支付流程发生在支付宝小程序中
如果用户已经进入支付宝小程序并完成支付,支付成功后想打开外部 App,不能假定小程序可以调用任意 Scheme,例如:
// 不应把这种方式视为通用、可靠的支付宝小程序能力
location.href = 'yourapp://payment/result'
小程序运行在受控容器内,跳转到外部应用通常会受到这些条件限制:
- 小程序与 App 是否属于同一主体,或是否已经建立关联;
- 相应能力是否已申请并通过审核;
- 当前支付宝客户端和操作系统是否支持;
- 用户设备是否安装了目标 App;
- 跳转入口、业务场景和参数是否符合平台规范。
如果开放平台后台没有提供相应的 App 唤起能力,可以考虑以下方案:
- 在支付成功页展示「返回 App」操作指引;
- 让 App 根据订单号轮询服务器上的支付状态;
- 由服务器异步通知更新订单,用户手动返回 App 后自动刷新;
- 在平台允许的情况下,配置经过审核的 App Link、Universal Link 或关联跳转能力。
H5 支付与 App 支付不要混用
支付宝 H5 支付中的 return_url 是支付完成后的网页跳转地址,不等同于可靠地返回原生 App。
一种做法是先跳转到 HTTPS 中转页,再尝试通过 Universal Link、App Link 或自定义 Scheme 打开 App。浏览器或支付宝客户端可能会拦截自动唤起,因此页面必须提供可点击的备用按钮:
<a href="yourapp://payment/result?orderNo=123456">
返回 App
</a>
这种方式会受到浏览器安全策略、系统版本和客户端行为影响,稳定性通常不如支付宝 App 支付 SDK。
服务端必须确认支付结果
客户端是否成功跳回 App,不应影响服务端确认订单。订单确认流程如下:
支付宝异步通知
↓
验证签名、商户号、应用 ID、订单号和金额
↓
以幂等方式更新订单
↓
App 查询服务器订单状态
处理异步通知时至少需要:
- 验证通知签名;
- 核对
app_id、商户订单号和支付金额; - 防止重复处理同一通知;
- 不以客户端页面是否成功回跳作为支付成功依据;
- 对超时、取消、重复支付和 App 进程被回收做好容错。
优先采用「App 直接通过支付宝 SDK 发起支付,并由 SDK 返回 App」的方式。「支付宝小程序支付后再打开第三方 App」受平台能力和审核条件限制,接入前需要先在支付宝开放平台确认应用是否具备相应权限。
备注:内容仅供参考。
