导入
创建付款
学习如何使用 Square API 进行各种类型的支付。
代码示例
1https://connect.squareupsandbox.com/v2/payments
| 参数 | 类型 | 类别 | 描述 |
|---|---|---|---|
| amount_money | 对象 | 必填 | 包含整数金额和表示货币的字符串的 Money 对象,用于指定本次支付接受的金额。 |
| app_fee_money | 对象 | 可选 | 表示开发者作为中介为卖家处理支付所收取费用的 Money 对象。 |
| autocomplete | 布尔值 | 可选 | 若设置为 true,支付将在可能的情况下自动完成;若设置为 false,支付将保持在已批准状态,直到显式完成或取消。 |
| billing_address | 对象 | 可选 | 买家的账单地址。为 Address 对象,包含 address_line_1、address_line_2、country 和 postal_code 等字符串字段。 |
| buyer_email_address | 字符串 | 可选 | 买家的电子邮件地址。 |
| idempotency_key | 字符串 | 必填 | 唯一标识 CreatePayment 请求的字符串,最大长度为 45 个字符。 |
| source_id | 字符串 | 必填 | 本次支付的资金来源 ID。根据支付类型,可以是卡凭证(card nonce)、CASH 或 EXTERNAL。 |
| tip_money | 对象 | 可选 | 表示额外小费金额的 Money 对象,与 amount_money 一同使用。 |
1import fetch from 'node-fetch'; 2 3const headerParameters = { 4 'Authorization': 'Bearer {{ACCESS_TOKEN}}', 5 'Content-Type': 'application/json' 6}; 7 8const url = new URL('https://connect.squareupsandbox.com/v2/payments'); 9 10const bodyParameters = JSON.stringify({ 11 'source_id': 'CASH', 12 'idempotency_key': getRandomString(), 13 'amount_money': { 14 'amount': 100, 15 'currency': 'USD' 16 }, 17 'cash_details': { 18 'buyer_supplied_money': { 19 'amount': 100, 20 'currency': 'USD' 21 } 22 } 23}); 24 25const options = { 26 method: 'POST', 27 headers: headerParameters, 28 body: bodyParameters 29}; 30 31async function invokeEndpoint() { 32 try { 33 const response = await fetch(url, options); 34 // 自定义函数用于打印 API 响应 35 printResponse(response); 36 } catch (error) { 37 console.log(`Error: ${err}`); 38 } 39} 40 41invokeEndpoint();
| 字段 | 类型 | 描述 |
|---|---|---|
| id | 字符串 | 支付的唯一 ID。 |
| amount_money | 对象 | 本次支付接受的金额,为包含整数金额和字符串货币的 Money 对象。 |
| status | 字符串 | 支付状态,可能值包括 PENDING、APPROVED、COMPLETED、CANCELED 或 FAILED。 |
| source_type | 字符串 | 支付来源类型,例如 CARD。 |
| location_id | 字符串 | 与该支付关联的位置 ID。 |
| order_id | 字符串 | 关联订单的 ID。 |
| total_money | 对象 | 以 Money 对象形式表示的总支付金额,包含整数金额和字符串货币。 |
| receipt_number | 字符串 | 支付收据编号,若支付被取消,则不返回此字段。 |
| receipt_url | 字符串 | 支付收据的 URL,仅对 COMPLETED 状态的支付返回。 |
...
创建支付的不同场景
我们可以使用 `CreatePayment` 端点通过信用卡、借记卡或 Square 礼品卡完成支付。Square 保持 PCI 合规性,并在处理支付时检测欺诈行为。当发出 `CreatePayment` 请求时,Square 会从指定卡片中扣除相应金额,并将该金额存入账户的 Square 余额。

1import fetch from 'node-fetch'; 2 3const headerParameters = { 4 'Authorization': 'Bearer {{ACCESS_TOKEN}}', 5 'Content-Type': 'application/json' 6}; 7 8const url = new URL('https://connect.squareupsandbox.com/v2/payments'); 9 10const bodyParameters = JSON.stringify({ 11 'source_id': 'cnon:card-nonce-ok', 12 'idempotency_key': getRandomString(), 13 'amount_money': { 14 'amount': 100, 15 'currency': 'USD' 16 } 17}); 18 19const options = { 20 method: 'POST', 21 headers: headerParameters, 22 body: bodyParameters 23}; 24 25async function invokeEndpoint() { 26 try { 27 const response = await fetch(url, options); 28 // 自定义函数用于打印 API 响应 29 printResponse(response); 30 } catch (error) { 31 console.log(`Error: ${err}`); 32 } 33} 34 35invokeEndpoint();
| source_id | 支付方式 |
|---|---|
| cnon:card-nonce-ok | 卡片 |
| ccof:customer-card-id-ok | 保存的卡片 |
| cnon:gift-card-nonce-ok | Square 礼品卡 |
| source_id | 错误映射 |
|---|---|
| 交易现场:cnon:card-nonce-rejected-cvv | CVV 错误 |
| 交易现场:cnon:card-nonce-rejected-postalcode 保存的卡片:ccof:customer-card-id-rejected-postalcode | 邮政编码错误 |
| 交易现场:cnon:card-nonce-rejected-expiration 保存的卡片:ccof:customer-card-id-rejected-expiration | 有效期错误 |
| 交易现场:cnon:card-nonce-declined 保存的卡片:ccof:customer-card-id-declined | 卡片被拒 |
| 交易现场:cnon:card-nonce-declined | 卡片支付令牌已被使用 |
| 交易现场:cnon:gift-card-nonce-insufficient-funds | 礼品卡余额不足 |
| 交易现场:cnon:gift-card-nonce-insufficient-permission | 礼品卡权限不足 |
ACH 银行转账支付
应用程序可使用 CreatePayment 端点接收自动清算中心(ACH)银行转账支付。当 Square 收到 CreatePayment 请求时,会从指定银行账户扣款,并将资金存入账户的 Square 余额。
要发起 ACH 银行转账支付,可以在上述代码中提供以下任一支付令牌作为 source_id。
| source_id | 错误映射 | 预期行为 |
|---|---|---|
| bnon:bank-nonce-ok | — | 请求成功。 |
| bnon:bank-nonce-failure | GENERIC_DECLINE | 请求失败。 |
| bnon:bank-nonce-account-unusable | ACCOUNT_UNUSABLE | 请求失败。 |
| bnon:bank-nonce-insufficient-funds | INSUFFICIENT_FUNDS | 请求失败。 |
| bnon:bank-nonce-invalid-account | INVALID_ACCOUNT | 请求失败。 |
| bnon:bank-nonce-buyer-refused-payment | BUYER_REFUSED_PAYMENT | 请求失败。 |
除了 Square 直接处理支付外,我们还可以记录在 Square 外部处理的支付。这可以通过现金支付或任何外部支付方式实现。我们已在本课前面讨论过现金支付。接下来了解如何记录外部支付。
外部支付
由外部实体(非 Square 或卖家)完成的支付称为 外部支付。例如,一位买家通过外卖服务下单,该服务收集付款并支付给卖家。其他场景还包括卖家通过加密货币钱包或非 Square 礼品卡收款。卖家可以使用 CreatePayment 记录这些外部支付。
与现金支付不同,我们需将 source_id 设置为 EXTERNAL,同时必须提供 external_details 字段,用于描述外部支付的具体信息。
1import fetch from 'node-fetch'; 2 3const headerParameters = { 4 'Authorization': 'Bearer {{ACCESS_TOKEN}}', 5 'Content-Type': 'application/json' 6}; 7 8const url = new URL('https://connect.squareupsandbox.com/v2/payments'); 9 10const bodyParameters = JSON.stringify({ 11 'source_id': 'EXTERNAL', 12 'idempotency_key': getRandomString(), 13 'amount_money': { 14 'amount': 100, 15 'currency': 'USD' 16 }, 17 'external_details': { 18 'type': 'OTHER', 19 'source': '外卖配送服务', 20 'source_fee_money': { 21 "amount": 500, 22 'currency': 'USD' 23 } 24 } 25}); 26 27const options = { 28 method: 'POST', 29 headers: headerParameters, 30 body: bodyParameters 31}; 32 33async function invokeEndpoint() { 34 try { 35 const response = await fetch(url, options); 36 // 自定义函数用于打印 API 响应 37 printResponse(response); 38 } catch (error) { 39 console.log(`Error: ${err}`); 40 } 41} 42 43invokeEndpoint();