针对特定业务需求(如在线销售自动化、纯后端集成)提供的高级对接模式
除了标准集成模式中提供的页面内嵌和普通小程序跳转方式外,云银签还针对特定的业务场景提供了更高效、更自动化的对接方案。
本页将重点介绍以下两种场景:
请根据您的具体业务需求选择合适的对接方案。
适用场景: 在线课程购买、虚拟商品销售、会员开通、在线服务预定等。用户在您的平台(App/H5)选择商品/服务并点击"购买/支付"后,希望一步到位地进入小程序完成签约和付款。
核心优势: 通过精细的后台配置和两步服务端API 调用,可实现客户内部环节(如填写、审批、盖章)的高度自动化,最终用户仅需一次点击即可从小程序完成签约支付,极大优化体验。
POST
/signTask/contract/appletForParticipant)第 1 步:(关键前提) 在云银签后台进行精细化配置
此方案的自动化能力高度依赖于您在云银签管理后台的预先配置:
autoFill 设置为
1,就可以通过 fillComponents 字段,传入这些 `componentKey`
和对应的预填值,从而实现自动填充签署方一需要填写的内容。
只有正确配置了印章的自动授权规则(并开启自动落章),且模板中签署方一被设置为无需手动填写(或通过API自动填写完成),系统才能在调用API后尽可能自动完成签署方一的盖章环节。
第 2 步:(核心) 调用"模板发起"专用 API
POST /signTask/startSignFlowflowType 参数,可以支持不同的签署方信息处理模式。
appId, accessToken,
userId (此 `userId` 通常是代表您系统操作的固定账号或管理员账号)
flowType 参数的重要说明:
此接口引入了 flowType 参数,用于定义合同流程的类型,特别是针对买家(签署方二)信息的处理方式:
flowType = 0 (正常签署流程):
participantList
中为所有参与方(包括代表您系统的签署方一和最终买家签署方二)提供准确、最终的信息(如手机号、姓名)。flowType = 2 (临时签署流程 / 买家信息后补):
participantList 中,仍需提供签署方一(例如,代表您系统的销售方)的准确信息。请根据您的业务场景选择合适的 flowType 值。
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| 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 | 否 | 外部单号 (例如,您自己业务系统中的订单号)。如果提供,云银签系统会记录此单号,并在发起成功后的响应中原样返回。 |
{
"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 等
}
flowId (新创建的合同流程ID) 以及完整的参与方列表
participantList 的响应。如果您的请求中包含了 sourceOrderCode,响应的
data 中通常也会包含此字段。
data.participantList 中,根据您传入的买家信息(例如手机号或
`participantFlag`,即使是临时的),找到代表**买家**的那一项,并获取其 participantId。这个
`participantId` 在下一步至关重要。flowType = 2): 即便买家信息是临时的,此步骤仍会返回一个有效的
participantId 给该买家。后续买家在小程序授权更新信息后,其身份信息会与此 participantId
关联更新。
| 参数名 | 类型 | 描述 |
|---|---|---|
| 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
|
{
"code": "200",
"msg": "成功",
"data": {
"flowId": 12001,
"flowStatus": 0, // 或 1,取决于流程配置
"flowTitle": "在线课程购买合同",
// ...其他流程信息...
"participantList": [
{
"participantId": 20101, // 卖家/甲方的 participantId
"participantFlag": "甲方",
"psnName": "系统销售代表",
// ...
},
{
"participantId": 20102, // 这是您需要提取的买家的 participantId
"participantFlag": "乙方",
"psnName": "买家姓名",
// ...
}
]
}
}
第 3 步:调用"获取小程序跳转链接" API
POST
/signTask/contract/appletForParticipantappId, accessToken,
userId (代表您系统操作的账号)
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| participantId | integer (int64) | 是 | 买家的参与方ID (从上一步 /signTask/startSignFlow 响应的
data.participantList 中获取)。
|
| type | integer (int32) | 是 | 小程序类型:0-微信小程序,1-支付宝小程序。 |
{
"participantId": 20102, // (必填) 从上一步获取的买家的 participantId
"type": 0 // (必填) 类型:0-微信小程序,1-支付宝小程序
}
第 4 步:处理 API 响应,获取小程序链接
/appletForParticipant):
data: 小程序链接。| 参数名 (Map中的Key) | 类型 | 描述 |
|---|---|---|
| data | string | 直接给买家使用的小程序跳转链接。 |
{
"code": "200",
"msg": "成功",
"data": "weixin://dl/business/"
//或者"https://ds.alipay.com/?scheme=alipays%3A%2F%2Fplatformapi%2Fstartapp%"
}
第 5 步:前端引导用户跳转小程序
第 6 步:用户在小程序操作 & 处理回调
POST /signTask/detail (查看详情)appId, accessToken,
userId (系统操作员/管理员)
signFlowId (从回调参数或第3步响应获取)/signTask/startSignFlow 的请求参数:
templateId 或 templateCode 的正确性。flowType 的使用,以及根据 flowType 正确传递 participantList
中买卖双方的信息。**特别强调,当 flowType = 2
时,签署方一(卖家)信息需准确,签署方二(买家)的手机号和姓名虽然可以是占位符,但字段本身必须传入,后续会在小程序端通过授权和实名认证进行更新。**autoFill = 1,确保 fillComponents 中的
componentKey 与模板中配置的控件编码一致。
sourceOrderCode 为可选,按需传入。participantId 用于下一步时,请确保逻辑的健壮性。flowType = 2
(临时签署流程),请确保用户知晓其在小程序中的授权行为(获取手机号)和实名认证行为将用于完善合同中的个人信息。同时,您需要理解,即使签署方一(卖家)的自动盖章等操作已配置,这些操作可能需要等待签署方二(买家)信息通过小程序最终确认后才能准确执行或完成。具体行为请与云银签确认或根据实际测试为准。
/signTask/contract/appletForParticipant 接口请求体所需的确切参数。userId (HTTP Header中) 具有相应操作权限。flowType = 2
的初始阶段),云银签小程序端会引导用户完成信息的补充和确认。背景:
在使用"在线销售直连方案"或涉及到小程序内支付的场景时,当买家(签署方二)在云银签小程序中成功完成支付操作后,微信或支付宝的支付结果会首先通知到云银签的服务器。随后,为了确保商家(API对接方)能够及时、可靠地获取到这一支付状态,云银签系统会向商家预先配置的后端通知地址发送一个异步HTTP POST请求。
由于移动端(App/H5)在小程序支付完成后跳转回原应用存在诸多限制和不确定性,依赖此服务端到服务端的异步通知是保证业务流程完整性和数据一致性的关键环节。
POSTapplication/x-www-form-urlencoded以下是云银签系统在支付成功后,向您配置的回调地址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文档为准,或与技术支持确认最准确的参数列表和含义。
您的后端服务在接收到云银签系统的异步通知后,应执行以下操作:
flowId, sourceOrderCode,
tradeState, payAmount
等),更新您自己系统中的订单状态、合同状态、支付状态等。例如,标记对应订单为已支付,触发后续的发货/开通服务流程。
success"**
(全小写,不包含任何其他字符、引号或HTML标签)。success
success" 响应是告知云银签系统:"我已收到通知,并且处理完毕了(或者至少是接收到了,后续我会处理)"。为确保您能够可靠地接收到支付结果通知,云银签系统内置了完善的自动重试机制:
success"
(例如,由于网络波动、您的接口响应超时或返回非 "success" 内容等原因),系统将判定为通知失败,并启动重试。success" 字符串,云银签系统将立即停止对该笔通知的任何后续重试。payOrderId 或 channelOrderNo
等唯一业务标识来判断),即使因为重试而多次接收到,您的后端业务逻辑也应确保只处理一次,避免重复入账或执行重复操作。建议在处理通知前,先检查该通知是否已被成功处理过。
success",避免长时间阻塞导致云银签系统判定为超时而发起重试。如果业务逻辑复杂,可以考虑先接收通知并记录,然后异步处理业务,但仍需及时返回
"success"。背景与用途:
除了通过异步通知回调被动接收支付结果外,云银签还提供了收款单查询API,允许您(卖家/API对接方)主动从云银签服务器拉取与您相关的支付订单数据。此功能非常适用于以下场景:
sourceOrderCode)的支付状态,而无需等待异步通知。
POST /signFlowBill/payeeBillListappId, accessToken,
userId (代表您系统操作的账号)
您可以通过以下一个或多个参数的组合来筛选收款单。如果所有筛选参数均不填写,则默认查询您名下的所有收款单记录。
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| 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对接方)主动发起退款请求。此功能适用于以下场景:
POST /signFlowBill/refundappId, accessToken,
userId (代表您系统操作的账号)
发起退款时,需要提供以下参数:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| 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
}
refundAmount 字段会显示已退款金额。orderType 为 "refund"),请参考异步通知回调说明。适用场景: 希望将电子签约流程完全融入自身后端业务逻辑,例如批量合同处理、服务器间自动签署、或需要构建高度定制化前端界面的场景。
核心特点: 开发者对整个流程拥有最大控制权,不依赖云银签提供的任何标准 UI 界面。
上图仅为示例流程,实际 API 调用顺序和逻辑需根据您的具体业务需求进行编排。
POST /signTask/startSignFlow (模板发起)POST /signTask/directSignFlow (直接发起)appId, accessToken,
userId (发起人)
data.signFlowIdPOST /signTask/detailappId, accessToken,
userId (查询操作者)
signFlowIddata.flowStatus,
data.participantList (含 signStatus,
payStatus 等)
POST /signTask/getSignUrl (查看详情)appId, accessToken,
userId (通常是系统操作员)
signFlowId, participantId
data.url (或类似字段)POST /signTask/downloadFile (查看详情)appId, accessToken,
userId (下载操作者)
signFlowId, (可选)fileTypePOST /payment/createPayOrder (查看详情)appId, accessToken,
userId