简介:支付宝已开放scheme大全是一份面向移动开发者的支付宝内跳转参数速查手册,专注于解决通过scheme唤起支付宝指定页面或功能的需求。资源数据从支付宝APK中直接提取,将密钥数字与scheme的said形成对应关系,使用时替换saId参数即可完成配置,尤其适合需要接入支付宝扫一扫、蚂蚁森林等场景的Android开发者。资源包为zip格式,整体大小仅62KB,包含2个文件:1个json和1个xml,json内收录了scheme映射与部分活动页面信息,xml则提供配套的预装或配置结构,两者互补可快速检索与验证跳转参数。目前已有5720人学习/下载,说明该资源在开发者社区中有一定实用热度。借助这份大全,读者可免去自行反编译APK的繁琐流程,直接获得经过整理的scheme对应关系;同时,json中标注过部分历史活动页会提示已暂停服务,有助于开发者提前甄别并规避无效跳转,提升集成效率。
1. 为什么大家都在整理支付宝 scheme,它到底解决什么问题
1.1 scheme 是什么,和普通链接有什么区别
我先用大白话把 scheme 讲清楚。你在浏览器里打开网页用的是https://,在手机上调起支付宝,用的则是alipays://这类自定义协议头。它本质上就是一套“App 之间的 URL”,系统识别到alipays://之后,会把后面的参数交给支付宝 App 去处理。
很多做 H5 支付、电商导流、渠道推广的朋友第一次接触 scheme 时,最容易绕晕的一点是:https://和alipays://都叫链接,但一个是网页地址,一个是 App 调起协议。网页地址可以直接在浏览器打开,而 scheme 只能被装好的 App 响应。如果你想从自己的 App 里跳到支付宝收银台、小程序、乘车码或者 NFC 页面,就需要拼接一条合法的alipays://scheme。
支付宝开放 scheme 的直接好处,是让外部 App 或 H5 页面可以安全、可控地把用户“交接”给支付宝。比如电商 App 下单之后,用户点击支付,App 唤起支付宝收银台,付完再跳回自己的 App,这就是最典型的一条 scheme 链路。
1.2 哪些场景真正用得上 scheme
我平时接触到的场景主要分这么几类:
- 拉起收银台:H5 或 App 内通过 scheme 唤起支付宝付款页面,这是最刚需的用法。
- 账户授权:引导用户跳到支付宝完成 OAuth 授权,拿回用户信息,常见于“支付宝登录”。
- 跳转小程序:
alipays://platformapi/startapp可以拉起指定小程序,甚至可以指定 page 路径,适合做跨端导流。 - 打开固定业务页:比如扫码、乘车码、NFC 刷门禁、生活缴费页等,前提是支付宝方已开放对应能力。
- 渠道归因:部分推广场景会用带参数的 scheme 做投放,帮助判断流量来源。
需要注意的是,不是所有 scheme 都能直接拿来生产环境使用。支付宝对不少能力有商户资质、AppId 白名单、签约等前置要求。所以网上流传的“scheme 大全”适合作为调研参考,正式上线前必须去开放平台确认自己的账号权限。我的习惯是先用沙箱环境验证完流程,再申请真实能力。
2. 支付宝 scheme 大全与 URL 编码规则
2.1 通用结构:先看懂参数再背清单
scheme 并不是一段黑魔法,它的结构非常统一。拿最常用的通用入口举例:
alipays://platformapi/startapp?appId=20000067&url=https%3A%2F%2Fopenauth.alipay.com%2Foauth2%2FappToAppAuth.htm%3F...拆开看就三部分:
alipays://:协议头,告诉系统“这个链接要交给支付宝”;platformapi/startapp:支付宝内部的路由标识,意思是“从我这里启动一个已注册的 AppId 应用”;appId/page/url/query:后面跟的业务参数,不同场景不一样。
大量新手在这里翻车,是因为没搞懂 URL 编码。%3A是冒号的编码,%2F是斜杠的编码,%3F是问号的编码。一条正常链接被当作参数塞进 scheme 时,必须把里面的特殊字符转义,否则支付宝解析时会把参数截断,导致跳转失败或白屏。记住一个原则:凡是出现在?后面的链接型参数,都要先 urlencode 再拼进去。
2.2 高频 scheme 清单
下面我按场景列一下实际开发中出镜率比较高的 scheme,并附上简单说明。具体 appId 会随开放能力调整,请以开放平台文档和联调环境为准。
| 场景 | scheme 示例 | 说明 |
|---|---|---|
| 拉起 H5 收银台 | alipays://platformapi/startapp?saId=10000007&clientVersion=3.7.0.0718&qrcode=https%3A%2F%2Fqr.alipay.com%2Fxxx | qrcode 参数放的是支付二维码链接或支付串 |
| 账户授权 | alipays://platformapi/startapp?appId=20000067&url=https%3A%2F%2Fopenauth.alipay.com%2Foauth2%2FappToAppAuth.htm%3Fapp_id%3Dxxx%26redirect_uri%3Dxxx | 用于支付宝 OAuth 免登 |
| 打开小程序 | alipays://platformapi/startapp?appId=202100xxxx&page=%2Fpages%2Findex%2Findex | 直接进小程序首页或指定页面 |
| 打开扫码 | alipays://platformapi/startapp?saId=10000003 | 拉起支付宝扫一扫 |
| NFC 能力 | alipays://nfc/app?id=xxx | 部分门禁、标签绑定场景使用 |
| 乘车码 | alipays://platformapi/startapp?saId=10000011 | 需城市和商户支持 |
这些 scheme 的来源主要有三类:开放平台官方文档、支付宝 mPaaS 组件、以及社区里抓包/联调沉淀的清单。抓包拿到的 scheme 并不保证长期有效,尤其是 AppId 变了或能力下线,协议就会失效。我自己的做法是维护一份内部速查表,定期跑一遍自动化测试,发现失效就更新,避免线上投放时踩雷。
2.3 render.alipay.com 这类中转页在做什么
搜索热词里经常能看到render.alipay.com/p/s/i?scheme=...这样的地址。它本身不是 scheme,而是一个中转页,页面加载后会自动把scheme参数里那段 URL 解码并尝试调起支付宝。这样做有两个好处:一是可以放到短信、邮件、二维码等不能直接写 scheme 的渠道;二是中转页可以做好兜底,比如检测到没有装支付宝时展示下载引导。
我建议你在投放场景里优先考虑这种中转方式,因为很多手机系统会对“外部 App 直接拉起另一个 App”做拦截或弹窗提醒,而经过一个中间页面后系统会把它当成一次普通的网页跳转,兼容性更好。拼接方式就是把目标 scheme 做一层 urlencode,放到scheme=后面:
https://render.alipay.com/p/s/i?scheme=alipays%3A%2F%2Fplatformapi%2Fstartapp%3FappId%3Dxxx3. 从支付链接到拉起收银台的一次完整实操
3.1 电脑网站支付如何只返回一个二维码链接
后台开发经常会遇到这个需求。调用支付宝电脑网站支付接口alipay.trade.page.pay后,默认返回的是一段自动提交的 HTML form 表单。但业务方只想要一个二维码链接用来展示或投放,不想把完整 form 塞给前端。
实际做法是在服务端只从接口结果里取qrCode字段。它本身就是一个可用于扫码支付的支付宝链接,格式类似https://qr.alipay.com/xxxx。拿到这个链接后再做两件事:
- 判断是否需要把它包装成 scheme,比如 App 内直接拉起支付宝,就需要把
qr.alipay.com的链接 urlencode 后拼进alipays://platformapi/startapp?saId=10000007&qrcode=xxx。 - 如果要给 PC 端浏览器用,就直接把链接生成二维码图片,不需要再套 scheme。
很多同事在这里被绕进去,是因为分不清“页面支付表单”和“二维码链接”的区别。alipay.trade.page.pay返回的表单主要给网页同步跳转用;qrCode字段才是为扫码场景准备的。后端只需要透传qrCode,前端二维码模块把它渲染成图片即可。
3.2 组装 scheme 并完成跳转
假设后端已经返回一个支付链接https://qr.alipay.com/xxxx,我在前端 JS 里是这样拼 scheme 的:
const payUrl = "https://qr.alipay.com/xxxx"; // 后端接口返回 const scheme = "alipays://platformapi/startapp?saId=10000007&clientVersion=3.7.0.0718&qrcode=" + encodeURIComponent(payUrl); // 安卓/iOS 通用:用隐藏 iframe 或 location 跳转 window.location.href = scheme;如果是 App 内嵌 WebView,也可以走原生能力调起。安卓端用 Intent 或startActivity,iOS 端用UIApplication.openURL都是成熟方案。关键点在于encodeURIComponent不能省,否则支付链接里的冒号和斜杠会被支付宝解析成协议结构的一部分,轻则参数丢失,重则直接无法唤起。
还有一个容易忽略的细节:如果页面运行在自己的 App WebView 里,需要确认 WebView 是否允许 scheme 跳转。很多客户端默认拦截外部协议,要在 WebView 的shouldOverrideUrlLoading里放行alipays://。
3.3 异步回调与验签的一次完整闭环
支付完成后的流程,才是真正考验后端的地方。支付宝会往notify_url发异步通知,通知内容是表单格式,需要你验签、校验金额、校验 AppId,然后返回一个纯文本success给支付宝。
热词里提到的“支付宝验签 argument should be integer or bytes-like object, not 'str'”,是所有用 Python 做验签的人几乎都会遇到的报错。原因非常简单:签名和验签的底层加密库要求传入字节类型,而你把通知里的待验签字符串直接传进去了。
我记得第一次实现时,代码是这样写错的:
from Crypto.PublicKey import RSA from Crypto.Signature import PKCS1_v1_5 from Crypto.Hash import SHA256 import base64 message = "app_id=xxx&out_trade_no=xxx..." # 这是 str h = SHA256.new(message) # 报错:argument should be integer or bytes-like object正确做法是先编码成字节:
message = "app_id=xxx&out_trade_no=xxx..." h = SHA256.new(message.encode("utf-8")) # 指定格式编码同时要注意验签用的公钥一定是“支付宝公钥”,不是应用公钥,也不是应用私钥。很多人拿错公钥之后,签名验不过,第一反应是以为是编码问题,结果排了半天才发现是公钥配错了。
回调里还有两个我自己的习惯:
- 收到通知先验签,再查单,最后修改订单状态,顺序不能反过来;
- 校验
out_trade_no和total_amount是否和本地订单一致,防止伪造通知。
4. 实测中高频踩坑问题与排查思路
4.1 跳小程序失败,为什么配置分包路径不行
有一个热词是“明文scheme拉起此小程序 配置分包路径不行”。这个问题我帮人排查过很多次。支付宝小程序的分包机制和微信类似,主包之外的页面路径需要写成分包根目录/页面路径,并且必须保证这个分包在app.json的subPackages里已声明。
当你说“配置分包路径不行”时,我建议按下面顺序排查:
- 确认你写的 page 路径是否完整,比如
/packageA/pages/detail/detail,而不是pages/detail/detail; - 确认分包名称大小写敏感,路径拼错一个字母都会导致拉起失败;
- 确认小程序版本已上传并发布了分包,本地调试通过不代表线上可用;
- 确认使用 scheme 的 AppId 是否在小程序后台的“允许跳转名单”里。
曾有一个项目,测试环境分包路径没问题,一到生产就拉不起来,最后发现是生产环境的小程序版本没有包含那个分包,重新发版后立刻正常。所以遇到这类问题,优先自查“线上版本是否真的有这个页面”。
4.2 Python 验签报错到底怎么解
前面已经说了argument should be integer or bytes-like object, not 'str'的核心原因。这里再给一个更完整的处理模板,方便你直接参考:
import base64 from Crypto.PublicKey import RSA from Crypto.Signature import PKCS1_v1_5 from Crypto.Hash import SHA256 def alipay_verify(sign, sign_str, alipay_public_key): key = RSA.import_key(alipay_public_key) verifier = PKCS1_v1_5.new(key) digest = SHA256.new(sign_str.encode("utf-8")) # 关键 return verifier.verify(digest, base64.b64decode(sign))很多网上资料会告诉你“把参数排序后拼接”,但没提醒类型转换。我建议大家把“字符串编码成 bytes”这一步当成固定动作,不管是 SHA256 还是 MD5,凡是进加密库的文本参数,全部先.encode(),能避免大半报错。
4.3 支付宝模拟器 1:1 高还原,能不能当生产环境用
热词里“支付宝模拟器1:1 高还原”听着很诱人,但它的定位是辅助联调工具,不是生产环境替代品。模拟器可以高度还原支付宝的 UI 和部分交互,验证 scheme 是否能被正确识别、跳转参数是否完整,这些都没问题。但它无法真实走完支付流程,更不能模拟支付宝服务端的扣款、退款、风控判定。
我的建议是:把模拟器用于前端联调和演示,真正的支付闭环在支付宝开放平台“沙箱环境”里测。沙箱会提供专用的买家账号和卖家账号,还有一套独立的 AppId,能完成从下单、支付、回调到退款的全流程验证。唯一要留意的是沙箱环境的部分接口字段和正式环境有细微差异,联调通过后切到正式环境仍需回归一遍。
4.4 scheme 拉起无响应、白屏或被拦截
这类问题的排查路径比较固定。首先要区分是“协议没被识别”还是“支付宝被拉起但页面白屏”。
- 协议没被识别:大概率是 URL 编码错误、协议头写错
alipays少写了s,或者手机没装支付宝。可以在浏览器地址栏手动粘贴 scheme 验证,如果浏览器也不能拉起,就是 scheme 本身的问题。 - 支付宝被拉起但白屏:多半是参数里的 appId 不被当前支付宝账号/版本支持,或者对应的能力没有签约。
- 最近版本的系统对跨 App 跳转会弹确认,用户点了拒绝也会导致无响应,这种属于系统行为,最好在页面里做好“拉起失败”的兜底提示。
我个人的排查顺序是:先用日志打印最终跳转的完整 scheme 链接,然后检查编码,再看 AppId 和 page 路径,最后用支付宝开发的扫码/真机日志工具抓启动日志。不要上来就怀疑是支付宝的问题,大多数情况是自己拼的参数有问题。
4.5 关于费率,提醒一句
热词里提到“腾讯支付宝收费费率是多少”。这类信息不建议参考任何“网络报价”,因为费率跟商户行业类目、交易规模、签约渠道强相关,同一家服务商在不同时期给到的政策也可能不同。准确做法是在开放平台后台看签约协议,或者咨询自己的客户经理。这条放在这里主要是提醒,别因为费率信息不准导致收益测算偏差。
4.6 安全边界与合规自检
最后说一点经验层面的提醒。scheme 本质是一个“入口”,如果参数里带敏感业务信息,比如订单号、金额、用户标识,建议不要明文拼在 scheme 里。能做服务端二次校验的,就不要只依赖前端的回调结果。涉及用户授权和隐私字段的,更要确认自己已拿到支付宝开放平台的合规授权,避免超范围采集。
我自己的习惯是,在项目里维护一张 scheme 使用清单,写下每个协议对应的业务线、AppId、是否已签约、失效日期、下次复核时间。这样即使人员变动,后续接手的人也不至于对着一条裸 scheme 两眼一抹黑。
实际整理这份清单时我最大的体会是:支付宝开放 scheme 的坑,大多数不是协议本身,而是 URL 编码、参数类型、AppId 权限这些细节。把每条 scheme 拆成“协议头 + 路由 + 参数 + 编码”四段看待,排查问题会轻松很多。如果你也正好在对接这类跳转,建议先把沙箱环境跑通一遍,再逐步替换成正式环境参数,能省下不少联调时间。
本文还有配套的精品资源,点击获取