APP 如何接入支付宝支付,urlscheme 代表什么?
结论
APP 接入支付宝支付主要涉及两部分:
- 服务端调用支付宝开放平台接口,生成带签名的支付订单。
- APP 把服务端返回的完整订单字符串交给支付宝客户端 SDK,由 SDK 拉起支付宝完成支付。
示例中的 urlscheme 通常是 iOS 应用注册的 URL Scheme,用于支付结束后从支付宝返回原 APP。这个值不是支付宝固定提供或分配的参数,而是由开发者为自己的 iOS 应用定义的。因此,直接搜索 "urlscheme" 往往找不到对应的配置项。
Android 原生支付宝支付一般不需要配置这个参数。
接入前需要准备什么
接入前,需要先在支付宝开放平台创建应用,并申请 APP 支付能力。开放条件、签约要求和控制台入口可能发生变化,请以支付宝开放平台当前显示的信息为准。
通常需要准备以下内容:
- 支付宝应用
app_id - 应用私钥
- 上传到支付宝开放平台的应用公钥,或平台要求使用的公钥证书
- 支付异步通知地址
notify_url - Android 应用包名、签名等应用信息
- iOS Bundle ID
- iOS 自定义 URL Scheme
- 对应平台的支付宝客户端 SDK
应用私钥只能保存在服务端,不能写入 APP,也不能随安装包发布。
推荐的支付流程
完整流程通常是:
- APP 向业务服务端提交商品编号、订单编号等业务参数。
- 服务端校验商品价格和订单状态。
- 服务端调用支付宝接口,生成带签名的订单字符串。
- 服务端把订单字符串返回给 APP。
- APP 调用支付宝 SDK 拉起支付。
- 支付结束后,APP 接收 SDK 返回的结果。
- 服务端接收支付宝异步通知,验签后更新订单状态。
- APP 向业务服务端查询最终支付结果。
不要让 APP 传入最终支付金额后自行签名。商品价格应由服务端根据可信的商品数据计算。
Android 调用示例
服务端返回支付宝要求的完整 orderInfo 后,可以通过 PayTask 发起支付:
import com.alipay.sdk.app.PayTask;
public void startAlipay(String orderInfo) {
new Thread(() -> {
PayTask alipay = new PayTask(this);
Map<String, String> result = alipay.payV2(orderInfo, true);
runOnUiThread(() -> {
String resultStatus = result.get("resultStatus");
String memo = result.get("memo");
String resultData = result.get("result");
// 这里只适合更新页面状态。
// 最终支付结果应向业务服务端查询。
});
}).start();
}
payV2 的支付调用可能耗时,不应阻塞主线程。实际项目还需要根据当前 SDK 的集成要求添加依赖、混淆规则和必要的应用配置。
iOS 调用示例
iOS 调用支付 SDK 时,需要通过 fromScheme 传入应用自己的 URL Scheme:
NSString *orderString = response[@"orderInfo"];
NSString *appScheme = @"myappalipay";
[[AlipaySDK defaultService] payOrder:orderString
fromScheme:appScheme
callback:^(NSDictionary *resultDic) {
NSLog(@"Alipay result: %@", resultDic);
// 回调结果可以用于页面展示,
// 最终支付状态仍应由服务端确认。
}];
Swift 项目的具体写法取决于 SDK 暴露的接口形式,但处理逻辑相同:
let orderString = response["orderInfo"] as? String ?? ""
let appScheme = "myappalipay"
AlipaySDK.defaultService().payOrder(
orderString,
fromScheme: appScheme
) { result in
print("Alipay result: \(String(describing: result))")
// 不要仅根据客户端回调发货。
// 应向业务服务端查询订单的最终状态。
}
SDK 的方法签名可能随版本以及 Objective-C、Swift 桥接方式而变化。请以项目实际引入的支付宝 SDK 头文件和当前官方接入文档为准。
urlscheme 到底是什么
URL Scheme 是 iOS 的一种应用跳转机制。例如:
myappalipay://
其中,myappalipay 是应用注册的 Scheme。支付过程中,系统可能暂时切换到支付宝客户端。用户完成支付后,系统会通过这个 Scheme 返回原 APP。
因此,示例中的:
urlscheme
通常只是一个占位符,需要替换成项目自己定义的值,例如:
com.example.shop.alipay
它不是支付宝统一分配的配置项,不能直接照抄到所有项目中。
iOS 如何配置 URL Scheme
可以在 Xcode 中按以下步骤配置:
- 打开 Target。
- 进入
Info。 - 找到
URL Types。 - 新增一项。
- 在
URL Schemes中填写自定义 Scheme。
对应的 Info.plist 结构类似:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myappalipay</string>
</array>
</dict>
</array>
调用 SDK 时必须传入相同的值:
NSString *appScheme = @"myappalipay";
传参时不要带上 ://,通常只需要 Scheme 名称:
myappalipay
不要写成:
myappalipay://
为什么配置后仍然无法返回 APP
常见原因有:
Info.plist中的 Scheme 与fromScheme参数不一致。- Scheme 拼写有误,或者错误地添加了
://。 - 多个已安装应用使用了相同的 Scheme。
- 支付 SDK 未正确集成。
- APP 没有按照所用 SDK 版本完成 URL 回调处理。
- 项目使用了跨平台框架,但没有在原生 iOS 工程中同步配置 Scheme。
- 支付宝开放平台中的应用信息与实际安装包信息不匹配。
URL Scheme 在系统范围内无法保证绝对唯一。建议使用包含公司域名、Bundle ID 或应用标识的值,以降低冲突概率。例如:
com.example.shop.alipay
配置完成后,可以在真机 Safari 中尝试打开:
com.example.shop.alipay://
如果系统能够拉起 APP,通常说明 Scheme 已经完成基础注册。不过,这项测试只能验证跳转配置,不能证明支付宝支付接口已经正确接入。
支付结果不能只看客户端回调
客户端可能收到 9000 等状态码,但客户端环境并不可信。网络中断、进程终止或回调伪造都可能造成误判。
支付结果应按以下方式确认:
- 服务端接收支付宝异步通知。
- 严格验证通知签名。
- 校验
app_id、商户订单号、金额、收款方等字段。 - 确保订单更新具有幂等性。
- APP 再向业务服务端查询订单状态。
- 只有服务端确认支付成功后,才能发货、充值或开通权益。
客户端回调可以用来改善交互,例如显示”正在确认支付结果”,但不能作为最终业务凭证。
接入时还要注意
- 私钥和签名逻辑必须放在服务端。
orderInfo应由服务端完整返回,APP 不要修改其中的字段。- 商户订单号必须唯一。
- 异步通知地址必须能被支付宝服务器通过公网访问。
- 服务端必须验证异步通知签名,不能只检查通知中的状态字段。
- 支付通知可能重复发送,订单处理必须支持幂等。
- 同步回调、SDK 回调和异步通知不是一回事,不要混用。
- 如果使用 Flutter、React Native、uni-app 等框架,
urlscheme可能需要填写在插件配置中,但最终仍须写入 iOS 原生工程的 URL Types 配置。 - SDK 集成方式和回调接口可能随版本变化。如果方法名不一致,请以当前 SDK 包中的接口定义为准。
备注:内容仅供参考。
