联想联运三方账号支付接口设计方案
论文信息
| 字段 | 内容 |
|---|---|
| 标题 | 应用联运三方账号接入文档 v2.3.1 |
| 作者 | 刘诗敏 |
| 机构 | 联想(参考接口域名联想云) |
| 论文地址 | 内部文档,无公开来源 |
| 代码地址 | 无 |
| 发表时间 | 2025.3.25 |
一句话概要
本文档面向CP开发者,定义了联想联运服务中三方账号支付的RESTful接口规范。核心设计包括:提供无账号支付能力,使用户无需登录即可完成支付;引入周期扣款能力通过支付宝/微信代扣协议实现自动续费;基于RSA2签名算法确保数据完整性与身份认证;同时提供完整的开票接口。文档通过明确的错误码与状态码体系规范了异常处理流程,并对商户订单号唯一性、金额单位(分)、签名算法等关键约束进行了详细说明。
背景与研究动机
移动应用联运模式下,应用商店作为分发平台,需要向第三方应用(CP)提供统一的支付接入能力。文档背景中指出,联运服务旨在降低CP的支付集成复杂度,使其无需自行对接多家支付渠道。文档提出的目标读者为研发工程师、测试工程师与产品经理,表明该规范需要兼顾技术实现与业务理解。
文档明确了接入流程:CP需先联系联想运营获取商户ID、应用ID以及公私钥,随后接入支付API。这一标准化入口设计表明,文档试图解决多类应用在支付环节的碎片化问题。核心动机可归纳为:在保障交易安全的前提下,为不具备自建支付体系的CP提供一套即开即用的支付方案。
值得注意的是,文档特别强调“无账号支付”能力,即用户无需登录联想账号即可完成支付。这可能意味着传统联运模式中账号体系常成为支付转化率的瓶颈。通过移除登录前置条件,文档试图提升支付完成率。
现有方法的瓶颈
文档并未直接点明既有方案的缺陷,但从变更日志和接口设计细节可以反推其迭代逻辑。
瓶颈一:账号体系绑定导致支付入口受限。 文档中明确提到“联运服务提供无账号支付能力,即用户无需登录就可实现支付”,这反向暗示早期版本可能强制要求用户登录联想账号(LID)才能支付。对于非联想生态用户或临时访客,登录门槛会直接导致支付流失。
瓶颈二:缺乏持续性扣款能力。 版本更新日志显示,V2.2.0新增了“周期扣费支付产品类型”。这说明之前的版本只支持单次支付,无法满足连续包月、订阅制等业务场景。文档为周期扣款设计了专门的协议通知、协议查询与解约接口,表明系统需从无协议状态扩展到代扣协议管理。
瓶颈三:接口地址与产品类型的兼容性不足。 V2.2.0修改了原创单支付接口地址以兼容无联想账号接入形式,这说明旧接口设计可能耦合了账号身份校验,导致修改时需要调整整体架构。同时,文档中提供了多种productCode(COMMON_CASHIER、COLLECT_CODE、ALI_DK_SC等),这些枚举型的产品编码意味着支付类型扩展时需要同步更新枚举定义,缺乏动态配置能力。
瓶颈四:退款与开票能力缺失或不完善。 文档明确指出“无账号支付不支持应用内退款能力”,但未说明传统有道账号的支付是否支持退款。开票接口说明中提到“支付时间超过3个月的订单不支持开票”,界面设计要求限制纳税人识别号不能包含空格、中文、小写字母且位数≤20,这些硬性约束可能给国际化或非标准税号用户带来额外负担。
瓶颈五:缺乏测试环境。 常见问题部分明确指出“无测试环境,开发者可将商品设为较低的金额(比如1分钱)进行测试”。这意味着所有开发者必须使用真实生产环境进行调试,对支付流程的端到端验证存在风险,且可能产生真实交易流水。
核心洞察与贡献
文档的贡献点可概括为以下四个方面。
贡献一:提出无账号支付模式。 通过消除联想账号登录前置条件,将支付流程简化为“创建订单→获取支付URL→用户扫码支付→异步通知”,使得非生态用户也可以直接完成交易。这一模式降低了CP的集成门槛,同时扩大了潜在支付用户群。
贡献二:构建周期扣款全流程管理。 文档设计了从签约(创单时传入代扣字段)到协议通知,再到查询与解约的完整生命周期。关键字段包括扣款周期(deductionPeriod)、首次扣款日期(firstDeductionDate)、周期扣款金额(deductionFee)以及协议通知地址(contractNotify)。通过支付宝/微信的代扣协议实现自动续费,将支付由一次性操作转化为持续性服务。
贡献三:统一签名算法规范。 文档定义了基于RSA2(SHA256WithRSA)的签名流程:筛选并排序所有参数(剔除sign与空值),拼接为参数对字符串,再使用应用私钥签名。签名方式固定在RSA2,确保了不同语言实现的一致性和互操作性。同时文档提供了验签工具链接,降低了调试成本。
贡献四:提供开票自助化接口。 文档引入申请开票接口,CP可以在应用内引导用户填写发票抬头、税号、邮箱等信息,通过API提交开票申请后,联想在24小时内以邮件形式发送电子发票。接口对税号的输入做了多项强制性约束,且限定仅支持增值税电子普通发票,明确了服务边界。
方法详解
总体架构与接口风格
文档指出,API采用REST风格设计,请求地址面向资源,使用规范的HTTP响应码(200成功、401签名错误、500错误信息)。请求参数分为2部分:Head(鉴权)与Body。Body包含基础参数(mchId、appId、nonce、timestamp、version、sign、signType)和业务参数。基础参数为所有接口必填,业务参数随场景变化。响应格式统一为JSON对象:
{
"code": 10000,
"data": "",
"message": "Success"
}
code为10000表示成功,非10000时data返回null,message返回错误描述。这一设计简化了错误处理逻辑。
核心支付流程
文档中概述了支付流程:CP调用创单支付接口(POST /api/v1/pay/trade)传入业务参数,接口返回包含tradeUrl的data对象。CP需自行开发页面容器或使用浏览器打开该URL,用户在URL中扫码支付。支付成功后,联运云端异步POST通知到CP的payNotify地址;同时支付页面显示成功。CP收到异步通知后需要返回“SUCCESS”字符串,否则联运云端会重试最多10次。
周期扣款设计
周期扣款能力依赖支付宝/微信的签约代扣协议。CP在创单时需传入以下参数:productCode为ALI_DK_SC(支付宝代扣)或COLLECT_DK_CODE/COMMON_DK_CASHIER;userId与userAccount(若未接入联想登录SDK则必须传);productId;deductionPeriod(单位:自然月);firstDeductionDate;deductionFee;contractNotify(异步接收签约/解约通知)。签约完成后,联运云端通过协议通知接口告知CP协议状态(1签约/2解约)。扣款周期最小为1个月。常见问题中说明,支付宝限制每用户单笔≤100元、当日≤1000元、月≤30000元。后续扣款通知中商户订单号为初次签约支付时的订单号,CP据此区分初次支付与续费扣款。
签名算法实现细节
文档在章节3.4中完整描述了RSA2签名算法。步骤为:
- 筛选并排序:获取所有请求参数(排除字节类型参数、sign字段及值为空的参数),按参数名字符的ASCII码递增排序。同首字符时按第二字符排序,以此类推。
- 拼接:组合成“参数=参数值”格式并用&连接。例如:
appId=2018071360678029&sign_type=RSA2&version=1.0。 - 签名:使用私钥(应用私钥)通过SHA256WithRSA函数对待签名字符串进行签名。
- 将签名赋值给sign参数,拼接到请求参数中。
- 验签:可使用平台公钥通过验签工具校验。
这一流程确保了请求未被篡改,且只有持有正确私钥的CP才能发起合法请求。平台公钥用于CP验签平台通知的签名,保护CP端不受伪造通知的攻击。
接口详细设计
文档共定义了8个主要接口(含周期扣款相关)。除创单支付外,关键接口包括:
- 支付查询:POST /api/v1/pay/query/trade,传入tradeNo,返回支付状态(0待支付、1已支付)、支付时间等。
- 协议通知:POST到contractNotify地址,参数包括协议状态(1已完成、2已解约)、变更时间。CP需返回SUCCESS。
- 协议查询:POST /api/v1/contract/query,支持以contractId或mchNo查询协议状态。
- 解约接口:POST /api/v1/contract,传入tradeNo(初始支付订单号)和解约原因,进行解约操作。
- 每日订单查询:POST /api/v1/app/query/trade,传入date(最近1个月),返回包含下载文件URL的data。
- 申请开票:POST /api/v1/invoice/apply,传入tradeNo、title、tin、email。文档特别要求税号的输入约束需在前端强制校验。
所有接口共享同一套基础参数与签名机制,保持了设计一致性。
实验与结果
本文为技术接入规范文档,未包含传统意义上的实验验证或性能评估。文档中可被视作“实验”的内容包括两部分:一是错误返回样例如{"code":401,"message":"unauthorizedException","data":null},这为开发者提供了认证失败时的预期响应;二是常见问题部分提供了问答形式的测试建议,例如建议开发者设置1分钱的商品进行真实支付测试(因为无测试环境)。文档还指出二维码有效期2小时、支付URL有效期24小时,这些时间约束可视为通过实际运营经验设定。
从功能完备性角度看,文档覆盖了支付、查询、通知、开票、对账(每日订单查询)四个核心场景,缺失的是退款接口(文档明确不支持应用内退款)。在版本迭代上,从V1.0.0(2022.4.20)到V2.3.1(2025.3.25),共经历8次版本更新,说明该规范在实际运营中不断修订。最新版本增加了对代扣支付的支持,并调整了接口地址。
可以理解为该文档的设计已经过生产环境的验证,但缺乏A/B测试、可用性测试或安全性审计等公开数据。文档中关于开票规则(税号限制、3个月内订单限制)和扣款通道限制(支付宝金额上限)的描述,反映了运营商的实际经验约束,但未解释这些约束背后的技术原因,可能存在适用性局限。
优势与局限性
优势
- 无账号设计:消除了用户登录障碍,有望提升支付转化率,是一种轻量级支付集成模式。
- 统一的RESTful接口与签名规范:降低CP学习成本;RSA2非对称签名机制提供了较高的安全性,且验签工具降低了接口联调难度。
- 标准化错误码:使用code+message的模式,便于CP进行自动化异常处理。
- 完整周期扣款管理:从签约到解约的闭环设计,使得订阅业务可以无缝对接。
- 开票接口自助化:减少了人工开票成本,且通过邮件分发电子发票,效率较高。
局限性
- 缺少测试环境:开发者只能通过设置极低金额(如1分钱)在生产环境测试,无法进行充分的端到端调试,存在真正的交易风险。文档给出的替代方案风险较高,尤其对于高并发场景的压力测试无法进行。
- 不支持退款:无账号支付不支持应用内退款,这意味着支付纠纷处理需要线下协调,这可能增加客服成本,并降低用户信任度。
- 税号约束过于严格:禁止小写字母、空格、中文且位数≤20,对于港澳台或国际税号可能无法兼容;且前端验证责任完全压在CP侧,若CP验证逻辑有漏洞,则会导致接口调用失败或数据错误。
- 开票时限3个月:超期订单需联系客服申请,这一限制对于长期订阅用户(例如年费会员)不够灵活。
- 周期扣款金额上限依赖支付通道:文档提到支付宝单笔≤100元、单日≤1000元等限制,这些外部限制意味着CP在设置订阅价格时需自行评估通道能力,且文档未提供实时查询各通道限额的接口。
- 产品编码为枚举值:COMMON_CASHIER、COLLECT_CODE等为固定字符串,新增支付类型需要文档迭代,扩展性相对有限。
未来方向与开放问题
该文档未直接设涉及未来计划,但从版本历史可推测两个潜在方向:一是继续优化支付体验,例如支持更多支付通道(如银联、国际信用卡);二是可能增加退款能力,特别是周期扣款场景下的部分退款或按比例退款。另一个开放问题是:文档中未涉及汇率与跨境支付,若应用面向海外用户,则当前仅支持人民币交易的限制会成为瓶颈。此外,文档未提及负载均衡与容灾设计,对于高并发支付场景(如秒杀、大促)的服务可靠性未作说明。这些可能是后续迭代需要补充的内容。
组会预判问答
Q1:该设计如何保证支付通知不丢失?
文档指出,通知最多重试10次,CP需在回调接口返回“SUCCESS”字符串确认接收。如果CP未正确返回,联运云端会持续重试,最多10次后不再触发。这属于“至少一次”语义,但未提供幂等性保证。CP端需要自行对同一笔支付订单进行去重处理,例如在本地记录tradeNo并校验。文档未明确说明重试间隔策略,开发者需要自行测试或向联想运营确认。
Q2:周期扣款中,如果用户支付宝余额不足,扣款失败如何处理?
文档仅描述了签约和成功扣款的通知,未提及扣款失败的场景。常见问题中也未说明容重试或告警机制。这意味着CP可能需要在收到支付通知的超时后主动查询状态,或依赖用户自行处理。这一缺失可能导致订阅业务中用户的续费体验不连续。
Q3:签名算法对性能的影响如何?RSA2私钥长度是否有要求?
文档未提供性能数据,但RSA2(SHA256WithRSA)计算开销较大,在高并发场景下可能成为瓶颈。文档未明确私钥长度,但通常RSA2建议使用2048位或更高。CP需要关注签名耗时,并在高并发时考虑异步签名或复用签名结果(注意timestamp和nonce必须变化)。同样,验签过程对平台端也有计算压力。
Q4:每日订单查询接口返回的文件格式是xlsx,CP如何解析?如果文件过大如何处理?
文档未描述文件内字段结构,仅给出日期和文件URL。CP需自行下载并解析Excel文件。若订单量极大,文件可能超过Excel行数限制(约104万行),需担心数据完整性问题。文档未提及分页或流式传输方案,这是可能的改进点。
本报告由立理AI生成,仅供参考,请以原文为准。