接口文档
本文详细介绍了支付应用相关接口的信息。
付款
当买家完成订单,触发付款请求时,SHOPLINE 将向支付应用发起付款接口调用(具体的工作流程)。
请求方式
使用 HTTP POST 请求。
请求头
SHOPLINE 请求付款接口时,会携带以下请求头:
| 字段 | 是否必填 | 含义 |
|---|---|---|
| pay-api-version | 是 | 配置支付应用拓展时选择的 API 版本。 |
| pay-api-idempotency-key | 是 | 幂等 Key。幂等 Key 相同的请求,支付应用应该视为重复请求。 |
| pay-api-signature | 是 | 请求体的签名值。支付应用在接收请求后,需要 校验签名值 是否匹配;若不匹配则应视为请求非法。 |
| pay-api-timestamp | 是 | 请求发起的时间,格式为 yyyyMMddHHmmss。 |
| pay-api-store-handle | 是 | 发起付款的店铺的 handle,即店铺唯一标识。 |
示例:
pay-api-version: 2.0.0
pay-api-idempotency-key: TESTKEYKEYKEY
pay-api-signature: SIGNSIGNSIGN
pay-api-timestamp: 20250304175916
pay-api-store-handle: HANDLE01
请求体
SHOPLINE 在请求付款接口时,将在请求体携带以下参数:
| 字段 | 类型 | 是否必填 | 含义 |
|---|---|---|---|
| orderTransactionId | string | 是 | 支付交易流水号,付款请求唯一标识。 |
| referenceOrderId | string | 是 | 业务订单号。建议将这个单号展示在支付应用后台(如果你有)的业务单号字段。商家能通过这个单号,在 SHOPLINE 商家后台 > 订单列表 搜索到该订单。 |
| kind | string | 是 | 支付类型。有效枚举值包含:
|
| amount | integer | 是 | 交易金额,大于 0。传递的精度根据币种会有不同,具体请查看 币种精度。 |
| currency | string | 是 | 交易金额币种,具体请查看 币种精度。 |
| redirectUrl | string | 是 | 完成支付 URL。买家完成支付后,支付应用需要将买家重定向到该 URL 指向的 SHOPLINE 页面。 最大长度限制:512 |
| cancelUrl | string | 是 | 取消支付 URL。买家取消支付时,支付应用需要将买家重定向到该 URL 指向的 SHOPLINE 页面。 最大长度限制:512 |
| notifyUrl | string | 是 | 异步结果的通知 URL。当支付状态变更,需要通知 SHOPLINE 时,你可以调用 支付状态通知接口;SHOPLINE 将为每个支付应用分配 channel_id 和 payment_method,这两个参数也是 支付状态通知接口 的必要路径参数,而此 URL 直接包含了这两个参数。最大长度限制:512 |
| billing | object | 否 | 账单信息,买家在结算页填写的账单信息。 |
| billing.personalInfo | object | 是 | 买家填写的账单个人信息。 |
| billing.firstName | string | 否 | 名字。 |
| billing.lastName | string | 是 | 姓氏。 |
| billing.email | string | 否 | 邮箱地址。 |
| billing.identityType | string | 否 | 身份证件类型。 |
| billing.identityNumber | string | 否 | 身份证件号码。 |
| billing.gender | string | 否 | 性别。 |
| billing.phoneNumber | string | 否 | 电话号码。 |
| billing.homeTelephone | string | 否 | 家庭电话号码。 |
| billing.birthDay | string | 否 | 生日,格式为 YYYY-MM-DD。 |
| billing.address | object | 是 | 买家填写的账单地址信息。 |
| billing.countryCode | string | 是 | 国家或地区编码。 |
| billing.state | string | 否 | 州或省。 |
| billing.stateCode | string | 否 | 州或省编码。 |
| billing.city | string | 否 | 城市。 |
| billing.district | string | 否 | 区域。 |
| billing.street | string | 否 | 街道(主要街道地址,包含完整的街道名和门牌号)。 |
| billing.street2 | string | 否 | 街道 2(补充信息,如单元号、楼层等)。 |
| billing.street3 | string | 否 | 街道 3(额外备注,如附近地标、特别说明等)。 |
| billing.postcode | string | 否 | 邮政编码。 |
| shipping | object | 否 | 物流信息。 |
| shipping.personalInfo | object | 是 | 物流地址填写的个人信息。 |
| shipping.firstName | string | 否 | 名字。 |
| shipping.lastName | string | 是 | 姓氏。 |
| shipping.email | string | 否 | 邮箱地址。 |
| shipping.identityType | string | 否 | 身份证件类型。 |
| shipping.identityNumber | string | 否 | 身份证件号码。 |
| shipping.gender | string | 否 | 性别。 |
| shipping.phoneNumber | string | 否 | 电话号码。 |
| shipping.homeTelephone | string | 否 | 家庭电话号码。 |
| shipping.birthDay | string | 否 | 生日,格式为 YYYY-MM-DD。 |
| shipping.address | object | 是 | 地址信息。 |
| shipping.countryCode | string | 是 | 国家或地区编码。 |
| shipping.state | string | 否 | 州或省。 |
| shipping.stateCode | string | 否 | 州或省编码。 |
| shipping.city | string | 否 | 城市。 |
| shipping.district | string | 否 | 区域。 |
| shipping.street | string | 否 | 街道(主要街道地址,包含完整的街道名和门牌号)。 |
| shipping.street2 | string | 否 | 街道 2(补充信息,如单元号、楼层等)。 |
| shipping.street3 | string | 否 | 街道 3(额外备注,如附近地标、特别说明等)。 |
| shipping.postcode | string | 否 | 邮政编码。 |
| shipping.shippingMethod | string | 是 | 物流方式。 |
| shipping.carrier | string | 否 | 物流承运商,如 FedEx。 |
| products | object[] | 是 | 买家购买的商品列表。 |
| products.id | string | 是 | 商品编号。 |
| products.name | string | 是 | 商品名称。 |
| products.sku | string | 否 | 货号。 |
| products.desc | string | 否 | 描述。 |
| products.quantity | integer | 是 | 商品数量,大于 0。 |
| products.unitPrice | object | 是 | 单价,大于等于 0。传递的精度根据币种会有不同,具体请查看 币种精度。 |
| products.value | integer | 是 | 金额,大于等于 0。传递的精度根据币种会有不同,具体请查看 币种精度。 |
| products.currency | string | 是 | 币种。具体请查看 币种精度。 |
| amountBreakdown | object | 是 | 本次支付的金额明细。 |
| amountBreakdown.productAmount | integer | 是 | 商品总金额,大于等于 0。传递的精度根据币种会有不同,具体请查看 币种精度。 |
| amountBreakdown.discount | integer | 是 | 总折扣,大于等于 0。传递的精度根据币种会有不同,具体请查看 币种精度。 |
| amountBreakdown.productTax | integer | 是 | 商品总税费,大于等于 0。传递的精度根据币种会有不同,具体请查看 币种精度。 |
| amountBreakdown.shippingAmount | integer | 是 | 总运费,大于等于 0。传递的精度根据币种会有不同,具体请查看 币种精度。 |
| amountBreakdown.shippingTax | integer | 是 | 总运费税费,大于等于 0。传递的精度根据币种会有不同,具体请查看 币种精度。 |
| amountBreakdown.other | integer | 是 | 其它费用总和,大于 0 代表是费用项,小于 0 代表是抵扣项。传递的精度根据币种会有不同,具体请查看 币种精度。 |
| merchant | object | 是 | 商户信息。 |
| merchant.storeWebsite | string | 是 | 店铺网站域名。 |
| card | object | 否 | 信用卡信息,将在 直连 模式下传递。 |
| card.cardNo | string | 是 | 明文卡号。 |
| card.expirationMonth | string | 是 | 有效期月份,取值范围为 1-12。 |
| card.expirationYear | string | 是 | 有效期年份,取值范围为 00-99。例如,取值为 25 表示 2025 年。 |
| card.cvv | string | 是 | 卡片 CVV 验证码。 |
| card.holderName | string | 否 | 持卡人姓名。 |
| client | object | 否 | 买家发起支付时的客户端信息,将在 直连 模式下传递。 |
| client.ip | string | 是 | 客户端 IP。 |
| client.deviceType | string | 否 | 设备类型。 |
| client.deviceId | string | 否 | 设备 ID。 |
| client.javaScriptEnabled | boolean | 否 | 浏览器是否支持 JavaScript。
|
| client.javaEnabled | boolean | 否 | 浏览器是否支持 Java。
|
| client.colorDepth | string | 否 | 浏览器显示器色深。 |
| client.screenHeight | string | 否 | 持卡人浏览器分辨率高度。 |
| client.screenWidth | string | 否 | 持卡人浏览器分辨率宽度。 |
| client.timeZoneOffset | string | 否 | 浏览器本地时区偏移量。 |
| client.userAgent | string | 否 | 浏览器 User-Agent。 |
| client.language | string | 否 | 浏览器语言。 |
| client.transactionWebSite | string | 否 | 交易网址,即发起支付的当前网址。 |
| client.accept | string | 否 | 浏览器接受报文类型。 |
| paymentOptions | object | 否 | 支付选项,目前用于周期性付款场景。 |
| paymentOptions.recurringPayment | bool | 否 | 是否是周期性付款场景。
|
| paymentOptions.userBehavior | string | 否 | 支付模式,目前用于周期性付款场景。有效枚举值包含:
|
| paymentOptions.paymentInstrumentId | string | 否 | 支付工具信息。周期性付款场景的代扣模式下(userBehavior = Recurring)有值,此时支付应用需通过该支付工具信息处理代扣支付请求。 |
| paymentMethodInstrument | string | 否 | 数字钱包返回的支付工具信息。在 Apple Pay 或 Google Pay 支付模式下必填,支付应用需将该信息传递给支付渠道以完成扣款。 |
示例:
{
{
"orderTransactionId": "2407354205016528273910-001",
"referenceOrderId": "2407354205016528273910-001",
"amount": 47,
"currency": "USD",
"redirectUrl": "https://...",
"cancelUrl": "https://...",
"notifyUrl": "https://...",
"billing": {
"personalInfo": {
"firstName": "fist",
"lastName": "last",
"email": "demo@shopline.com",
"identityType": "xx",
"identityNumber": "xxx",
"gender": "1",
"phoneNumber": "xx",
"homeTelephone": "xx",
"birthDay": "1224"
},
"address": {
"countryCode": "US",
"state": "California",
"stateCode": "US-CA",
"city": "demo city",
"district": "demo district",
"street": "demo street",
"street2": "demo street2",
"street3": "demo street3",
"postcode": "82371-2343"
}
},
"shipping": {
"personalInfo": {
"firstName": "fist",
"lastName": "last",
"email": "demo@shopline.com",
"identityType": "xx",
"identityNumber": "xxx",
"gender": "1",
"phoneNumber": "xx",
"homeTelephone": "xx",
"birthDay": "1224"
},
"address": {
"countryCode": "US",
"state": "California",
"stateCode": "US-CA",
"city": "demo city",
"district": "demo district",
"street": "demo street",
"street2": "demo street2",
"street3": "demo street3",
"postcode": "82371-2343"
},
"shippingMethod": "Standard shipping",
"carrier": "Standard shipping carrier"
},
"products": [
{
"id": "0_18073231123420620812342600",
"name": "product name",
"sku": "item-no",
"desc": "product desc",
"quantity": 1,
"unitPrice": {
"value": 1899,
"currency": "USD"
}
}
],
"amountBreakdown": {
"productAmount": 1899,
"discount": 0,
"productTax": 0,
"shippingAmount": 699,
"shippingTax": 0,
"other": 0
},
"merchant": {
"storeWebsite": "https://...",
},
"card": {
"cardNo": "4444444444444444",
"expirationMonth": "11",
"expirationYear": "24",
"cvv": "123",
"holderName": "test"
},
"client": {
"accept": "application/json",
"colorDepth": "24",
"ip": "xx.xx.xx.xx",
"javaEnabled": false,
"javaScriptEnabled": true,
"language": "en-US",
"screenHeight": "1920",
"screenWidth": "1080",
"timeZoneOffset": "-480",
"transactionWebSite": "xxx",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36"
},
"paymentOptions": {
"recurringPayment": true,
"userBehavior": "bindPayment",
// userBehavior = Recurring 时必须提供,从绑卡支付响应信息中获得
"paymentInstrumentId":"{channelPaymentInstrumentId}"
},
// 数字钱包返回的支付工具信息
"paymentMethodInstrument": "{...}"
}
}
响应头
支付应用响应 SHOPLINE 的付款请求时,需要携带以下响应头:
| 字段 | 是否必填 | 含义 |
|---|---|---|
| pay-api-signature | 是 | 响应体的签名值。SHOPLINE 在收到响应后,将 校验签名值 是否匹配;若不匹配则应视为响应非法。 |
示例:
pay-api-signature: SIGNSIGNSIGN
响应体
支付应用响应 SHOPLINE 的付款请求时,需要返回以下信息:
| 字段 | 类型 | 是否必填 | 含义 |
|---|---|---|---|
| returnCode | string | 是 | 接口响应状态码。有效枚举值包含:
|
| returnMessage | string | 否 | 响应描述。当 returnCode 返回非 SUCCESS 时,代表支付应用不接受此次付款请求,此时可在该字段返回具体的原因。 |
| returnMessageId | string | 否 | 返回的一个随机串,用来标识这次响应。 在后续报告问题需要 SHOPLINE 协助排查时,你可以提供这个随机串,以便 SHOPLINE 工程师更快的定位到该响应。 |
| orderTransactionId | string | 是 | 支付交易流水号,付款请求唯一标识。 |
| channelOrderTransactionId | string | 是 | 这笔支付在支付应用的唯一标识。 |
| paymentUrl | string | 否 | 买家付款 URL。SHOPLINE 将引导买家重定向到该地址,具体使用方式参考 交易流程。 |
| paymentInstrumentInfo | object | 否 | 支付工具信息。如果当前支付单是绑卡支付模式(支付请求中的 userBehavior = bindPayment),需要返回该字段。 |
| paymentInstrumentInfo.paymentInstrumentId | string | 否 | 支付工具信息。周期性付款场景的绑卡支付模式下,必须返回该字段;代扣支付时,SHOPLINE 将在支付请求中携带该支付工具信息进行扣款支付。 |
示例:
{
"returnCode": "SUCCESS",
"returnMessage": "",
"returnMessageId": "randomUuid()",
"orderTransactionId": "2407354205016528273910-001",
"channelOrderTransactionId": "2381238",
"paymentUrl": "https://...",
"paymentInstrumentInfo": {
"paymentInstrumentId": "12313123"
}
}
付款查询
SHOPLINE 将在 多个场景 调用付款查询接口,查询某笔支付的最新信息。
请求方式
使用 HTTP POST 请求。
请求头
SHOPLINE 请求付款查询接口时,会携带以下请求头:
| 字段 | 是否必填 | 含义 |
|---|---|---|
| pay-api-version | 是 | 配置支付应用拓展时选择的 API 版本。 |
| pay-api-idempotency-key | 是 | 幂等 Key。幂等 Key 相同的请求,支付应用应该视为重复请求。 |
| pay-api-signature | 是 | 请求体的签名值。支付应用在接收请求后,需要 校验签名值 是否匹配;若不匹配则应视为请求非法。 |
| pay-api-timestamp | 是 | 请求发起的时间,格式为 yyyyMMddHHmmss。 |
示例:
pay-api-version: 2.0.0
pay-api-idempotency-key: TESTKEYKEYKEY
pay-api-signature: SIGNSIGNSIGN
pay-api-timestamp: 20250304175916
请求体
SHOPLINE 在请求付款查询接口时,将在请求体携带以下参数:
| 字段 | 是否必填 | 含义 |
|---|---|---|
| orderTransactionId | 是 | 支付交易流水号,付款请求唯一标识;代表 SHOPLINE 需要获取该笔支付的最新信息。 |
示例:
{
"orderTransactionId": "2407354205016528273910-001"
}
响应头
支付应用响应 SHOPLINE 的付款查询请求时,需要携带以下响应头:
| 字段 | 是否必填 | 含义 |
|---|---|---|
| pay-api-signature | 是 | 响应体的签名值。SHOPLINE 在收到响应后,将 校验签名值 是否匹配;若不匹配则应视为响应非法。 |
示例:
pay-api-signature: SIGNSIGNSIGN
响应体
支付应用响应 SHOPLINE 的付款查询请求时,需要返回以下信息:
| 字段 | 类型 | 是否必填 | 含义 |
|---|---|---|---|
| returnCode | string | 是 | 接口响应状态码。有效枚举值包含:
|
| returnMessage | string | 否 | 响应描述。当 returnCode 返回非 SUCCESS 时,代表支付应用不接受此次付款查询请求,此时可在该字段返回具体的原因。 |
| returnMessageId | string | 否 | 返回的一个随机串,用来标识这次响应。 在后续报告问题需要 SHOPLINE 协助排查时,你可以提供这个随机串,以便 SHOPLINE 工程师更快地定位到该响应。 |
| orderTransactionId | string | 是 | 支付交易流水号,付款请求唯一标识。 |
| channelOrderTransactionId | string | 是 | 这笔支付在支付应用的唯一标识。 |
| paymentStatus | string | 是 | 此笔支付单当前的 支付状态。 |
| amount | integer | 是 | 金额,大于 0。传递的精度根据币种会有不同,具体请查看 币种精度。 |
| currency | string | 是 | 交易金额币种,具体请查看 币种精度。 |
| failCode | string | 否 | 失败编码。当 paymentStatus 返回 FAILED 时,通过此字段返回具体的失败编码。 |
| failMessage | string | 否 | 失败描述。当 paymentStatus 返回 FAILED 时,通过此字段返回具体的失败描述。 |
| paymentInstrumentInfo | object | 否 | 支付工具信息。如果当前支付单是绑卡支付模式(支付请求中的 userBehavior = bindPayment),需要返回该字段。 |
| paymentInstrumentInfo.paymentInstrumentId | string | 否 | 支付工具信息。周期性付款场景的绑卡支付模式下,必须返回该字段;代扣支付时,SHOPLINE 将在支付请求中携带该支付工具信息进行扣款支付。 |
示例:
{
"returnCode": "SUCCESS",
"returnMessage": "",
"returnMessageId": "randomUuid()",
"orderTransactionId": "2407354205016528273910-001",
"channelOrderTransactionId": "2381238",
"paymentStatus": "FAIL",
"amount": "286143",
"currency": "USD",
"failCode": "PAY_FAIL_CODE",
"failMessage": "The reason for payment failure.",
// 在周期性付款场景的绑卡支付模式下,需要携带该字段
"paymentInstrumentInfo": {
"paymentInstrumentId": "12313123"
}
}
Capture
对于 手动入账 的支付单,当商家操作入账时,SHOPLINE 将向支付应用配置的 Capture URL 发起 Capture 接口调用。
调用该接口时,如果 SHOPLINE 无法获取到响应或者响应验签失败,将在 24 小时内以同样的参数重试多次,直到返回格式正确或超过最大重试次数。需要做好幂等处理。
请求方式
使用 HTTP POST 请求。
请求头
SHOPLINE 请求 Capture 接口时,会携带以下请求头:
| 字段 | 是否必填 | 含义 |
|---|---|---|
| pay-api-version | 是 | 配置支付应用拓展时选择的 API 版本。 |
| pay-api-idempotency-key | 是 | 幂等 Key,幂等 Key 相同的请求,支付应用应该视为重复请求。 |
| pay-api-signature | 是 | 请求体的签名值。支付应用在接收请求后,需要校验签名值是否匹配;若不匹配则应视为请求非法。 |
| pay-api-timestamp | 是 | 请求发起的时间,格式为 yyyyMMddHHmmss。 |
示例:
pay-api-version: 2.0.0
pay-api-idempotency-key: TESTKEYKEYKEY
pay-api-signature: SIGNSIGNSIGN
pay-api-timestamp: 20250304175916
请求体
SHOPLINE 在请求 Capture 接口时,将在请求体携带以下参数:
| 字段 | 类型 | 是否必填 | 含义 |
|---|---|---|---|
| orderTransactionId | string | 是 | 支付交易流水号,付款请求唯一标识。 |
| channelOrderTransactionId | string | 是 | 这笔支付在支付应用的唯一标识。 |
| referenceOrderId | string | 是 | 业务订单号。建议将这个单号展示在支付应用后台(如果你有)的业务单号字段。商家能通过这个单号,在 SHOPLINE 商家后台 > 订单列表 搜索到该订单。 |
| orderTransactionCaptureId | string | 是 | SHOPLINE 为每次 Capture 操作生成的唯一标识。 |
| amount | integer | 是 | 金额,大于 0。传递的精度根据币种会有不同,具体请查看 币种精度。 |
| currency | string | 是 | 交易金额币种,具体请查看 币种精度。 |
示例:
{
"channelOrderTransactionId": "2381238",
"referenceOrderId": "12313",
"orderTransactionId": "2407354205016528273910-001",
"orderTransactionCaptureId": "32012312313",
"amount": 100,
"currency": "USD"
}
响应头
支付应用响应 SHOPLINE 的 Capture 请求时,需要携带以下响应头:
| 字段 | 是否必填 | 含义 |
|---|---|---|
| pay-api-signature | 是 | 响应体的签名值。SHOPLINE 在收到响应后,将 校验签名值 是否匹配;若不匹配则应视为响应非法。 |
示例:
pay-api-signature: SIGNSIGNSIGN