业务场景对接方案

针对特定业务需求(如在线销售自动化、纯后端集成)提供的高级对接模式

概述

除了标准集成模式中提供的页面内嵌和普通小程序跳转方式外,云银签还针对特定的业务场景提供了更高效、更自动化的对接方案。

本页将重点介绍以下两种场景:

  • 在线销售直连方案: 特别适合在线教育、电商、会员服务等需要用户在线完成购买、签约、支付一体化流程的场景。核心是通过调用一个专用 API,自动处理内部流程,并直接返回给最终用户签约/支付的小程序链接,极大简化用户操作路径。
  • 纯后端 API 集成方案: 适用于希望完全通过服务器端 API 调用来驱动和管理整个合同生命周期的场景,不依赖云银签提供的前端界面,实现最大程度的定制化和系统集成。

请根据您的具体业务需求选择合适的对接方案。


在线销售直连方案 (模板 + 小程序)

适用场景: 在线课程购买、虚拟商品销售、会员开通、在线服务预定等。用户在您的平台(App/H5)选择商品/服务并点击"购买/支付"后,希望一步到位地进入小程序完成签约和付款。

核心优势: 通过精细的后台配置和两步服务端API 调用,可实现客户内部环节(如填写、审批、盖章)的高度自动化,最终用户仅需一次点击即可从小程序完成签约支付,极大优化体验。

流程示意图

graph TD; subgraph UserApp ["客户平台 (App/H5)"] A["用户选择商品/课程
点击 购买"] --> B(前端将购买信息发送给后端); B --> C["后端接收请求
准备调用 云银签 API"]; I["前端引导用户
跳转到小程序链接"]; end subgraph PlatformBackend ["客户平台后端"] D["调用模板发起API
POST /signTask/startSignFlow
携带模板ID、买家信息等"] D --> E["获取响应含 flowId 和买家participantId"]; E --> F["调用获取小程序链接API
(POST /signTask/contract/appletForParticipant)
传入participantId, type"]; end subgraph 云银签System ["云银签系统"] subgraph Step1APICall ["处理模板发起"] direction LR DS["/signTask/startSignFlow"] end subgraph Step2APICall ["处理获取链接"] direction LR DL["/signTask/contract/appletForParticipant"] end Step1APICall --> RESP1["返回 flowId, 参与方列表"]; Step2APICall --> RESP2["返回小程序 URL"]; end subgraph PlatformBackend2 ["客户平台后端"] G["接收小程序 URL"]; end subgraph MiniProgram ["云银签小程序"] H["用户进入小程序
查看合同、签名、支付"]; H --> J["操作完成"]; J --> K["跳转回客户指定的回调页面
(携带结果参数)"]; end subgraph UserAppCallback ["客户平台回调页面"] L["处理回调, 显示结果
建议后端再查状态确认"]; end %% Connections C --> D; RESP1 --> E; F --> DL; RESP2 --> G; G --> I; I --> H; K --> L; %% Style critical API call style D fill:#cce5ff,stroke:#004085,stroke-width:2px style F fill:#cce5ff,stroke:#004085,stroke-width:2px %% Add click for API call click D "#online-sales-step2" "查看'模板发起'API参数详情" click F "#online-sales-step3" "查看'获取小程序链接'API参数详情"

对接步骤详解

第 1 步:(关键前提) 在云银签后台进行精细化配置

此方案的自动化能力高度依赖于您在云银签管理后台的预先配置:

  • 模板管理配置:
    • 创建或编辑用于此场景的合同模板。
    • **获取模板编码 (`templateCode`)**: 登录云银签系统平台,点击左侧菜单栏的"模板管理",您可以在模板列表中看到每个模板对应的"模板编码"。在调用API时,您可以使用此编码。
    • **定义签署方一 (您的企业或代表):** 明确其在此模板中是仅需 "签署",还是需要先 "填写" 再 "签署"。
    • **定义签署方二 (买家/最终用户):** 明确其角色、是否需要 "填写" 和/或 "签署"。配置默认的收款金额(如果需要支付)。设置支付顺序("先付后签" 或 "先签后付")。
    • **配置组件和位置:** 如果设置了需要填写,需配置相应的表单组件。定义好签署方一、签署方二的签名/盖章区域,以及可能的骑缝章位置。
  • 印章管理与授权 (实现签署方一自动盖章的关键):
    • 确保相关的企业印章(如公章、合同章、财务章)已创建(企业认证后会自动创建)。
    • 在印章管理中,**设置精确的印章授权规则**以实现自动盖章。操作路径一般为:登录云银签平台 -> 管理中心/企业管理 -> 印章管理 -> 选择需要授权的印章,点击"详情"或"授权管理" -> 新增授权。
    • 在新增授权时,你需要配置(通常如下图所示):
      • **授权对象**: 可以是企业下的特定成员,或者全部成员(在API调用场景下,通常是指API调用者所代表的身份)。
      • **授权角色**: 选择"印章使用员"。
      • **授权范围**: 选择"指定模板",然后选择本业务场景中使用的合同模板。
      • **有效期**: 设置一个合理的授权有效期。
      • **开启"自动落章"**: 开启此开关。开启后,当通过API使用此模板发起签署,并且轮到配置的签署方一(通常是您的企业)操作时,系统将根据授权规则自动完成盖章,无需人工手动操作。
    • 请参照您云银签后台的实际界面进行操作,上图仅为典型配置示例。关键是确保授权给正确的操作者、正确的模板,并启用了自动落章。
  • 自动填写规则 (针对签署方一需要先填后签的场景):
    • 如果在模板中,签署方一(例如,您的企业代表)被设置为需要先"填写"再"签署"。
    • 在设计模板、配置填写控件(如文本框、日期选择器等)时,请注意每个控件都可以设置一个**控件编码 (componentKey)**。这个编码在模板设计界面的右下角属性配置区通常可以找到并自定义(例如,您可以将其设置为 "productName", "orderId", "buyerAddress" 等有意义的标识)。
    • 记录下这些 `componentKey`。在后续调用"模板发起"API时,如果将请求参数中的 autoFill 设置为 1,就可以通过 fillComponents 字段,传入这些 `componentKey` 和对应的预填值,从而实现自动填充签署方一需要填写的内容。
  • 获取并记录配置好的模板 `templateId` 或 `templateCode`。

只有正确配置了印章的自动授权规则(并开启自动落章),且模板中签署方一被设置为无需手动填写(或通过API自动填写完成),系统才能在调用API后尽可能自动完成签署方一的盖章环节。

第 2 步:(核心) 调用"模板发起"专用 API

  • 当您的后端收到前端购买请求后,首先调用云银签的"模板发起合同"接口。
  • API 概览 (模板发起):
    • Endpoint: POST /signTask/startSignFlow
    • 描述: 基于预设模板创建合同流程。此API会根据模板配置和传入参数,尽可能自动处理内部环节(如发起方填写、盖章等,依赖于第1步的配置)。通过引入 flowType 参数,可以支持不同的签署方信息处理模式。
    • 重要 Header: appId, accessToken, userId (此 `userId` 通常是代表您系统操作的固定账号或管理员账号)
    • 详细API文档: 模板发起合同 API (如需查看错误码等更完整信息)
  • 关于 flowType 参数的重要说明:

    此接口引入了 flowType 参数,用于定义合同流程的类型,特别是针对买家(签署方二)信息的处理方式:

    • flowType = 0 (正常签署流程):
      • 在此模式下,API调用方(您的后端服务)必须在 participantList 中为所有参与方(包括代表您系统的签署方一和最终买家签署方二)提供准确、最终的信息(如手机号、姓名)。
      • 云银签系统将使用这些信息直接生成合同。买家进入小程序后,信息不可更改,直接进行后续的查看、签署、支付等操作。
      • 适用于您的平台能够明确获取到买家信息的场景。
    • flowType = 2 (临时签署流程 / 买家信息后补):
      • 此模式专为优化用户体验和支持"匿名/未登录购买"等场景设计。
      • API 调用方在 participantList 中,仍需提供签署方一(例如,代表您系统的销售方)的准确信息。
      • 对于签署方二(最终买家),您可以传入临时的、占位的手机号和姓名(例如:"张三", "18111111111")。请注意:即使是占位信息,这两个字段也必须提供。
      • 云银签系统会将此合同标记为"临时状态"。当最终买家通过小程序链接进入并完成微信手机号授权后,云银签系统将自动使用授权获取到的真实手机号替换掉之前传入的临时买家手机号。在进行签署操作前,系统会引导买家完成实名认证,实名认证成功后,其认证的真实姓名将替换掉之前传入的临时买家姓名,并完善合同。
      • 这样可以避免用户在小程序授权后长时间等待合同生成,并允许用户在未登录状态下发起购买流程。

    请根据您的业务场景选择合适的 flowType 值。

  • 请求参数 (Body) 详解:
    参数名 类型 必填 描述
    templateId integer (int64) 模板ID (模板ID和模板编码二选一)
    templateCode string 模板编码 (模板ID和模板编码二选一)
    templateName string 模板名称 (用于最终流程标题,建议填写)
    flowType integer (int32) 流程类型:
    0 - 正常签署流程 (签署方信息需准确完整)。
    2 - 临时签署流程 (签署方二信息可为占位符,将在小程序端授权和实名后自动更新)。
    privaryFlag integer (int32) 模板是否保密 (0: 不保密, 1: 保密)
    encryptFlag integer (int32) 是否加密合同 (0: 普通合同, 1: 加密合同)
    autoFill integer (int32) 是否自动填写(0:否;1:是)。如果为1,且模板配置了发起方控件(签署方一),可以使用 fillComponents 预填内容。请参考第1步中关于"自动填写规则"的说明。
    +participantList array of object 设置签署方。其中应至少包含代表您系统方(卖家)和最终用户(买家)两方的信息。参考 参与方实体类_1
    +attachmentList array of object 选填项设置.合同附件。参考 模板附件实体类
    +fillComponents array of object 控件填充信息 (当 autoFill 为1时使用)。参考 控件实体类
    sourceOrderCode string 外部单号 (例如,您自己业务系统中的订单号)。如果提供,云银签系统会记录此单号,并在发起成功后的响应中原样返回。
  • **请求 Body (JSON 示例):**
    {
    										"templateCode": "TP1374333375002752000", // (必填) 步骤1中获取的模板编码
    										"templateName": "测试自动落章12121", // (建议) 合同流程的标题
    										"flowType": 2, // (必填) 流程类型: 0-正常签署, 2-临时签署(买家信息后补)
    										"autoFill": 1, // (可选) 对于签署方一: 0-不自动填写, 1-自动填写 (需配合fillComponents)
    										"sourceOrderCode": "987654321", // (可选) 对接方系统内部的订单号
    										"participantList": [
    										{
    										"participantFlag": "签署方1", // 甲方/卖家 (信息需准确)
    										"psnAccount": "18675718757", // 签署方一经办人手机号
    										"psnName": "董新峰", // 签署方一经办人姓名
    										"participantCorpName": "云银签测试用租户" // (可选) 签署方一企业名称 (如果签署方一是企业)
    										// ... 其他甲方(卖家)信息,根据模板定义
    										},
    										{
    										"participantFlag": "签署方2", // 乙方/买家
    										// 当 flowType = 0 时, psnAccount 和 psnName 必须是买家真实准确的信息。
    										// 当 flowType = 2 时, psnAccount 和 psnName 必须提供,但可以是临时占位信息。
    										// 例如: "18111111111", "王麻子"。
    										// 后续会在小程序授权(更新手机号)和实名认证(更新姓名)后被系统自动更新。
    										"psnAccount": "18111111111", // 买家手机号 (flowType=2时可为占位)
    										"psnName": "王麻子", // 买家姓名 (flowType=2时可为占位)
    										"payeeContractFlag": 1, // (可选) 是否需要收款: 0-否, 1-是
    										"payee": { // (可选) 若 payeeContractFlag = 1, 则此项为收款信息
    										"amount": 100.00 // 收款金额
    										// ... 其他收款相关参数,如 priority, remark
    										}
    										// ... 其他买家信息
    										}
    										],
    										"fillComponents": [ // (可选) 当 autoFill = 1 且模板中签署方一有待填控件时使用
    										{
    										"componentKey": "name", // 对应模板中配置的控件编码
    										"componentValue": "刘浩" // 要填充的值
    										},
    										{
    										"componentKey": "code",
    										"componentValue": "a978050789"
    										}
    										]
    										// ... 其他参数如 privaryFlag, encryptFlag, attachmentList 等
    										}
  • **处理 API 响应:**
    • API成功调用后,您将收到包含 flowId (新创建的合同流程ID) 以及完整的参与方列表 participantList 的响应。如果您的请求中包含了 sourceOrderCode,响应的 data 中通常也会包含此字段。
    • 您需要从响应的 data.participantList 中,根据您传入的买家信息(例如手机号或 `participantFlag`,即使是临时的),找到代表**买家**的那一项,并获取其 participantId。这个 `participantId` 在下一步至关重要。
    • 特别注意 (针对 flowType = 2): 即便买家信息是临时的,此步骤仍会返回一个有效的 participantId 给该买家。后续买家在小程序授权更新信息后,其身份信息会与此 participantId 关联更新。
  • 响应参数 (data 部分) 详解:
    参数名 类型 描述
    flowId integer (int64) 创建成功的签署流程ID。
    sourceOrderCode string 如果您在请求中传入了外部单号,这里会原样返回。
    flowStatus integer (int32) 流程状态: 0-草稿; 1-签署中; 2-完成; 3-撤销; 5-过期; 6-拒签。
    flowDesc string 签署流程描述。
    flowTitle string 流程标题。
    nextStatus integer (int32) 当前用户下步骤可以操作的状态:(0:查看; 1:填写; 2:签署)。
    +participantList array of object 签署方信息列表。您需要从此列表中找到买家的 participantId。参考 签署人信息_1
  • 示例响应 (来自 `/signTask/startSignFlow`):
    {
    										"code": "200",
    										"msg": "成功",
    										"data": {
    										"flowId": 12001,
    										"flowStatus": 0, // 或 1,取决于流程配置
    										"flowTitle": "在线课程购买合同",
    										// ...其他流程信息...
    										"participantList": [
    										{
    										"participantId": 20101, // 卖家/甲方的 participantId
    										"participantFlag": "甲方",
    										"psnName": "系统销售代表",
    										// ...
    										},
    										{
    										"participantId": 20102, // 这是您需要提取的买家的 participantId
    										"participantFlag": "乙方",
    										"psnName": "买家姓名",
    										// ...
    										}
    										]
    										}
    										}

第 3 步:调用"获取小程序跳转链接" API

  • 拿到上一步返回的 `flowId` 和买家的 `participantId` 后,您的后端服务紧接着调用 `/signTask/contract/appletForParticipant` 接口来获取小程序跳转链接。
  • API 概览 (获取小程序链接):
    • Endpoint: POST /signTask/contract/appletForParticipant
    • 描述: 根据合同参与方ID,获取其进行下一步操作(通常是签署或支付)的小程序跳转链接。
    • 重要 Header: appId, accessToken, userId (代表您系统操作的账号)
  • 请求参数 (Body) 详解:
    参数名 类型 必填 描述
    participantId integer (int64) 买家的参与方ID (从上一步 /signTask/startSignFlow 响应的 data.participantList 中获取)。
    type integer (int32) 小程序类型:0-微信小程序,1-支付宝小程序。
  • **请求 Body (JSON 示例):**
    {
    										"participantId": 20102, // (必填) 从上一步获取的买家的 participantId
    										"type": 0 // (必填) 类型:0-微信小程序,1-支付宝小程序
    										}
  • 此API会返回一个直接指向微信或支付宝小程序的链接。

第 4 步:处理 API 响应,获取小程序链接

  • 如果 `/signTask/contract/appletForParticipant` API 调用成功,您将收到类似以下的响应:
  • 关键响应参数 (来自 /appletForParticipant):
    • data: 小程序链接。
  • 响应参数 (data 部分) 详解:
    参数名 (Map中的Key) 类型 描述
    data string 直接给买家使用的小程序跳转链接。
  • 成功响应 Body 示例 (JSON):
    {
    										"code": "200",
    										"msg": "成功",
    										"data": "weixin://dl/business/"
    										//或者"https://ds.alipay.com/?scheme=alipays%3A%2F%2Fplatformapi%2Fstartapp%"
    										}
  • 您需要从 `data` 中提取小程序跳转链接。

第 5 步:前端引导用户跳转小程序

  • 您的后端将获取到的 `miniProgramUrl` 返回给前端 App 或 H5 页面。
  • 前端通过按钮点击、链接跳转或平台能力(如 App SDK)引导用户打开此小程序链接。

第 6 步:用户在小程序操作 & 处理回调

  • 用户在云银签小程序中完成合同查看、签名、支付等操作。
  • 操作完成后,小程序会携带结果参数跳转回您在第 2 步指定的 `redirectUrl`。
  • 请参考 标准集成模式 - 处理回调 部分的说明,在您的回调页面解析参数,向用户展示结果,并**强烈建议您的后端再次调用合同查询 API 确认最终状态**。
  • 建议后端确认状态 API:
    • Endpoint: POST /signTask/detail (查看详情)
    • 描述: 查询合同流程的详细信息和各方状态。
    • 重要 Header: appId, accessToken, userId (系统操作员/管理员)
    • 关键请求参数: signFlowId (从回调参数或第3步响应获取)

注意事项

  • 此方案的自动化效果**强依赖于第 1 步中后台配置的准确性**(模板设置、印章授权规则、控件编码等)。
  • 重要: 仔细确认 /signTask/startSignFlow 的请求参数:
    • templateIdtemplateCode 的正确性。
    • flowType 的使用,以及根据 flowType 正确传递 participantList 中买卖双方的信息。**特别强调,当 flowType = 2 时,签署方一(卖家)信息需准确,签署方二(买家)的手机号和姓名虽然可以是占位符,但字段本身必须传入,后续会在小程序端通过授权和实名认证进行更新。**
    • 如果使用 autoFill = 1,确保 fillComponents 中的 componentKey 与模板中配置的控件编码一致。
    • sourceOrderCode 为可选,按需传入。
  • 在提取买家的 participantId 用于下一步时,请确保逻辑的健壮性。
  • 对于 flowType = 2 (临时签署流程),请确保用户知晓其在小程序中的授权行为(获取手机号)和实名认证行为将用于完善合同中的个人信息。同时,您需要理解,即使签署方一(卖家)的自动盖章等操作已配置,这些操作可能需要等待签署方二(买家)信息通过小程序最终确认后才能准确执行或完成。具体行为请与云银签确认或根据实际测试为准。
  • **重要:** 仔细确认 /signTask/contract/appletForParticipant 接口请求体所需的确切参数。
  • 确保调用两个API时使用的 userId (HTTP Header中) 具有相应操作权限。
  • 如果买家信息未在调用 `/signTask/startSignFlow` 时完全提供(例如 flowType = 2 的初始阶段),云银签小程序端会引导用户完成信息的补充和确认。
  • 关于支付和小程序操作完成后的回调,除了前端的 `redirectUrl` 跳转外,强烈建议依赖并正确处理下面的"异步通知回调",以确保业务状态的最终一致性。

异步通知回调说明 (支付结果)

背景:

在使用"在线销售直连方案"或涉及到小程序内支付的场景时,当买家(签署方二)在云银签小程序中成功完成支付操作后,微信或支付宝的支付结果会首先通知到云银签的服务器。随后,为了确保商家(API对接方)能够及时、可靠地获取到这一支付状态,云银签系统会向商家预先配置的后端通知地址发送一个异步HTTP POST请求。

由于移动端(App/H5)在小程序支付完成后跳转回原应用存在诸多限制和不确定性,依赖此服务端到服务端的异步通知是保证业务流程完整性和数据一致性的关键环节。

配置回调地址

  • 您需要准备一个能够接收HTTP POST请求的公网可访问的URL接口,作为您的异步通知回调地址。
  • 请将此回调地址提供给您的云银签业务对接人或技术支持,他们会在云银签后台为您完成配置。
  • 重要: 此回调地址必须是稳定可靠的,并且能够正确处理云银签系统发送的通知。

通知机制

  • 触发时机: 买家在云银签小程序内完成支付,且云银签系统已从支付渠道(微信/支付宝)确认支付成功后。
  • 请求方式: POST
  • Content-Type: application/x-www-form-urlencoded
  • 请求体 (Body): JSON格式的支付结果数据。

通知参数详解

以下是云银签系统在支付成功后,向您配置的回调地址POST的JSON数据包中的主要参数说明:

参数名 类型 描述
tradeState string 支付状态。例如:"00000" 表示成功,其他值表示失败或处理中(具体状态码请与云银签确认)。您应主要关注成功的通知。
orderType string 单据类型。例如:"pay" 表示付款通知,"refund" 表示退款通知 (本场景主要关注 "pay")。
payOrderId string 云银签系统的付款单ID。
payOrderNo string 云银签系统的付款单号。
payAmount string 付款金额 (通常是字符串形式,可能需要转换为数字处理)。
payType string 支付方式。例如:
wxJSAPI - 微信JSAPI支付
wxH5 - 微信H5支付
wxQrCode - 微信二维码支付
alipayPC - 支付宝网站支付
alipayMobile - 支付宝手机端支付
(更多类型请参考实际API文档或与云银签确认)
flowId string 关联的签署流程ID (即调用 /signTask/startSignFlow 后获得的 flowId)。
flowDesc string 关联的签署流程描述/合同名称。
sourceOrderCode string 您在调用 /signTask/startSignFlow 时传入的外部单号 (sourceOrderCode),会在此原样返回。用于您将通知与自己系统的订单关联。
channelOrderNo string 支付渠道的订单号 (例如微信支付单号或支付宝交易号)。
paySuccessTime string 付款成功的时间 (具体格式请与云银签确认,通常为如 "YYYY-MM-DD HH:mm:ss" 的字符串)。
refundTotalTimes string (退款相关) 退款总次数。
refundTotalAmount string (退款相关) 退款总金额。
refundOrderId string (退款相关) 退款单ID。

上述参数列表是基于您提供的 PayCallbackNotifyParamCmd.java 文件生成的。请务必以云银签最新的官方API文档为准,或与技术支持确认最准确的参数列表和含义。

处理回调与响应

您的后端服务在接收到云银签系统的异步通知后,应执行以下操作:

  1. 解析参数: 从JSON请求体中获取各项参数值。
  2. 业务处理: 根据获取到的参数(特别是 flowId, sourceOrderCode, tradeState, payAmount 等),更新您自己系统中的订单状态、合同状态、支付状态等。例如,标记对应订单为已支付,触发后续的发货/开通服务流程。
  3. 响应云银签系统:
    • 在您的业务逻辑处理完成后(无论成功与否),您的接口必须向云银签系统返回一个**纯文本字符串 "success"** (全小写,不包含任何其他字符、引号或HTML标签)。
    • success
    • 这个 "success" 响应是告知云银签系统:"我已收到通知,并且处理完毕了(或者至少是接收到了,后续我会处理)"。

重试机制

为确保您能够可靠地接收到支付结果通知,云银签系统内置了完善的自动重试机制:

  • 触发条件: 当云银签系统向您的回调地址发送通知后,若未能收到您接口返回的纯字符串 "success" (例如,由于网络波动、您的接口响应超时或返回非 "success" 内容等原因),系统将判定为通知失败,并启动重试。
  • 总尝试次数: 包括首次发送在内,系统总共会尝试通知您最多 16 次
  • 重试策略与间隔: 系统会按照精心设计的间隔策略进行重试。通常情况下,初始几次重试会发生在较短的时间间隔内(例如,从几分钟到十几分钟不等),如果依旧失败,后续的重试间隔会逐渐拉长(例如,从几十分钟到数小时不等),直至达到16次尝试上限。这样的设计旨在兼顾通知的及时性与系统的稳定性,为您提供充足的机会成功接收和处理通知。
  • 停止条件: 一旦您的回调接口成功返回 "success" 字符串,云银签系统将立即停止对该笔通知的任何后续重试。
  • 重要(接口幂等性): 由于存在重试机制,您的回调接口必须支持幂等性处理。这意味着对于同一笔支付通知(您可以通过通知中的 payOrderIdchannelOrderNo 等唯一业务标识来判断),即使因为重试而多次接收到,您的后端业务逻辑也应确保只处理一次,避免重复入账或执行重复操作。建议在处理通知前,先检查该通知是否已被成功处理过。

注意事项

  • 幂等性: 必须保证您的回调处理逻辑是幂等的,以正确处理可能的重复通知。
  • 及时响应: 您的接口应尽快处理业务逻辑并返回 "success",避免长时间阻塞导致云银签系统判定为超时而发起重试。如果业务逻辑复杂,可以考虑先接收通知并记录,然后异步处理业务,但仍需及时返回 "success"。
  • 日志记录: 详尽记录接收到的回调数据和处理过程,便于问题排查。
  • 测试: 在生产环境上线前,务必与云银签进行充分的联调测试,确保回调流程畅通无误。

收款单查询 (主动对账)

背景与用途:

除了通过异步通知回调被动接收支付结果外,云银签还提供了收款单查询API,允许您(卖家/API对接方)主动从云银签服务器拉取与您相关的支付订单数据。此功能非常适用于以下场景:

  • 主动对账: 定期拉取收款记录,与您自己内部的财务系统进行核对。
  • 状态确认: 在特定业务节点,主动查询某一笔订单(例如通过您自己的sourceOrderCode)的支付状态,而无需等待异步通知。
  • 数据同步: 构建您自己系统内的"支付单列表"页面,为您的运营人员提供查询界面。
  • 容错处理: 如果因某种原因错过了异步通知,可以通过此接口主动拉取数据以确保最终一致性。

API 概览

API 概览 (收款单查询):
  • Endpoint: POST /signFlowBill/payeeBillList
  • 描述: 根据多种条件分页查询作为收款方的支付订单列表。
  • 重要 Header: appId, accessToken, userId (代表您系统操作的账号)

请求参数 (Body) 详解

您可以通过以下一个或多个参数的组合来筛选收款单。如果所有筛选参数均不填写,则默认查询您名下的所有收款单记录。

参数名 类型 必填 描述
sourceOrderCode string 来源订单号 (重点)。您在调用 /signTask/startSignFlow 时传入的外部单号,可用于精确查询。
payOrderCode string 支付单号 (云银签系统的支付单号)。
contractCode string 合同号。
payStatus integer (int32) 支付状态: 1-待支付, 2-支付成功, 3-退款成功 (更多状态请参考具体API文档)。
channelOrderNo string 渠道单号 (如微信或支付宝的交易号)。
payName string 付款方名称 (个人姓名或企业名称)。
participantType integer (int32) 付款方类型: 1-企业, 0-个人。
payeeName string 收款方名称 (通常是您自己或您指定的收款人)。
payeeCorpName string 收款方企业名称。
flowStartTime string (date-time) 查询范围的开始时间 (基于签署流程创建时间)。
flowFinishTime string (date-time) 查询范围的结束时间。
listPageNo integer (int32) 当前页码,从1开始。
listPageSize integer (int32) 每页返回的记录数量。

响应参数详解

成功调用后,API会返回一个包含分页信息和收款单列表的数据结构。

参数名 类型 描述
code string 返回码,例如 "200" 表示成功。
msg string 返回码的描述信息。
totalCount integer (int32) 满足查询条件的总记录数。
listPageCount integer (int32) 总页数。
+data array of object 收款单记录列表。每个对象包含以下字段:

收款单发起退款

背景与用途:

在某些业务场景下,您可能需要对已完成支付的订单进行退款操作。云银签提供了收款单退款API,允许您(收款方/API对接方)主动发起退款请求。此功能适用于以下场景:

  • 订单取消: 用户申请取消订单,需要退还已支付的款项。
  • 服务终止: 因各种原因导致服务无法继续提供,需要退款给用户。
  • 部分退款: 根据实际情况,对订单进行部分金额的退款。
  • 纠纷处理: 处理用户投诉或纠纷时的退款操作。

API 概览

API 概览 (收款单发起退款):
  • Endpoint: POST /signFlowBill/refund
  • 描述: 对指定的收款单发起退款操作。
  • 重要 Header: appId, accessToken, userId (代表您系统操作的账号)

请求参数 (Body) 详解

发起退款时,需要提供以下参数:

参数名 类型 必填 描述
participateId integer (int64) 参与方ID。这是付款方的参与方ID,可以从收款单查询接口的响应中获取。
refundAmount number 退款金额。必须大于0,且不能超过原支付金额。支持部分退款。
refundReason string 退款原因说明。建议填写,便于后续对账和问题追溯。

请求示例

{
							"participateId": 20102,
							"refundAmount": 50.00,
							"refundReason": "用户申请取消订单"
							}

响应参数详解

成功调用后,API会返回标准的响应结构。

参数名 类型 描述
code string 返回码。"200" 表示退款请求提交成功,其他值表示异常。
msg string 返回码的描述信息。
data object 返回的业务数据(具体内容请参考实际API响应)。

响应示例

{
							"code": "200",
							"msg": "退款申请已提交",
							"data": null
							}

注意事项

  • 退款金额限制: 退款金额必须大于0,且不能超过原订单的实际支付金额。支持多次部分退款,但累计退款金额不能超过原支付金额。
  • 退款状态: 退款请求提交成功后,实际退款到账时间取决于支付渠道(微信/支付宝)的处理速度,通常在1-7个工作日内完成。
  • 退款查询: 可以通过收款单查询接口查询退款状态,响应中的 refundAmount 字段会显示已退款金额。
  • 幂等性: 建议在您的系统中记录退款请求,避免对同一订单重复发起退款。
  • 异步通知: 退款完成后,云银签系统可能会通过配置的回调地址发送退款结果通知(orderType 为 "refund"),请参考异步通知回调说明
  • 权限要求: 只有收款方(或具有相应权限的操作员)才能发起退款操作。

纯后端 API 集成方案

适用场景: 希望将电子签约流程完全融入自身后端业务逻辑,例如批量合同处理、服务器间自动签署、或需要构建高度定制化前端界面的场景。

核心特点: 开发者对整个流程拥有最大控制权,不依赖云银签提供的任何标准 UI 界面。

典型流程示意图 (示例)

graph TD; A["后端业务逻辑触发"] --> B("调用'发起合同'API
(/signTask/startSignFlow 或 /directSignFlow)"); B --> C{"发起成功? 获取 flowId"}; C -- 是 --> D("持续(轮询/Webhook)调用
'查询合同详情/状态'API
(/signTask/detail)"); D --> E{"判断当前状态 & 下一步操作者"}; subgraph HandleParticipant ["处理单个参与方"] E -- 需要用户A签署 --> F("调用'获取签署链接'API
(/signTask/getSignUrl)
为用户A生成链接"); F --> G["通过自定义方式发送链接
(如短信/邮件/App内通知)"]; G --> H["用户A点击链接, 在H5/小程序完成"]; H --> I["开发者需自行处理
用户完成后的状态更新
(轮询/Webhook/回调)"]; E -- "需要内部系统B自动签" --> J("调用'自动签署'相关API
(需确认是否有此类API)"); J --> K["更新内部状态"]; E -- "需要支付" --> L("调用'创建支付单'API
(/payment/createPayOrder)"); L --> M("调用'获取支付链接'API
(需确认是否有)"); M --> N["通过自定义方式发送支付链接"]; N --> O["用户完成支付"]; O --> P["开发者处理支付结果"]; end I --> D; K --> D; P --> D; E -- "合同完成" --> Q("调用'下载合同文件'API
(/signTask/downloadFile)"); Q --> R["流程结束, 文件归档"]; E -- "流程异常/终止" --> S["处理异常"]; %% Add API links click B "../api-docs/signtask/creation.html" "查看发起合同 API" click D "../api-docs/signtask/query.html#getContractInfo" "查看查询合同详情 API" click F "../api-docs/signtask/signing.html#getSignUrl" "查看获取签署链接 API" click L "../api-docs/payment/payment.html#createPayOrder" "查看创建支付单 API" click Q "../api-docs/signtask/query.html#downloadFile" "查看下载文件 API" click J "#" "待确认是否有自动签署API" click M "#" "待确认是否有获取支付链接API"

上图仅为示例流程,实际 API 调用顺序和逻辑需根据您的具体业务需求进行编排。

关键 API 调用序列 (参考)

  1. 发起合同: 使用 签署任务创建 API (模板发起或直接发起) 创建合同,获取 `flowId`。
    相关 API:
    • POST /signTask/startSignFlow (模板发起)
    • POST /signTask/directSignFlow (直接发起)
    • 重要 Header: appId, accessToken, userId (发起人)
    • 关键响应: data.signFlowId
  2. 状态监控: 定期调用 查询合同详情 API (`/signTask/detail`) 或列表 API,检查 `flowStatus` 和 `participantList` 中各方状态。**强烈建议使用 Webhook (如果云银签支持) 代替轮询。**
    相关 API:
    • POST /signTask/detail
    • 重要 Header: appId, accessToken, userId (查询操作者)
    • 关键请求参数: signFlowId
    • 关键响应: data.flowStatus, data.participantList (含 signStatus, payStatus 等)
  3. 获取操作链接 (如需): 当判断到某参与方需要操作时,调用对应 API 获取链接。
    相关 API (示例):
    • POST /signTask/getSignUrl (查看详情)
    • (可能还有获取填写/支付链接的 API)
    • 重要 Header: appId, accessToken, userId (通常是系统操作员)
    • 关键请求参数: signFlowId, participantId
    • 关键响应: data.url (或类似字段)
  4. 发送通知 (如需): 通过您自己的渠道将获取到的操作链接发送给参与方。
  5. (重复) 状态监控: 继续监控合同状态。
  6. 文件下载 (可选): 合同完成后,调用下载 API 获取文件。
    相关 API:
    • POST /signTask/downloadFile (查看详情)
    • 重要 Header: appId, accessToken, userId (下载操作者)
    • 关键请求参数: signFlowId, (可选)fileType
    • 关键响应: 文件流或下载链接
  7. 支付处理 (可选): 调用支付相关 API。
    相关 API (示例):
    • POST /payment/createPayOrder (查看详情)
    • (可能还有查询/取消支付单的 API)
    • 重要 Header: appId, accessToken, userId
    • 关键请求/响应: (参考具体支付 API 文档)
  8. 异常处理: 在流程中监控并处理异常状态。

注意事项

  • 此方案需要开发者在后端实现相对复杂的流程控制和状态管理逻辑。
  • 需要非常熟悉云银签提供的各项原子 API 及其参数、响应和错误码。
  • 如果云银签支持 Webhook 事件通知,强烈建议采用 Webhook 来接收状态变更,避免大量无效的轮询。
  • 需要自行处理如何安全、可靠地将操作链接(如果需要发送)传递给最终用户。