模拟并撤销交易
了解事务,以及如何模拟和撤销授权交易。
交易 是指进行支付的过程。我们可以使用 Marqeta 支付卡来完成支付。授权交易 请求包含用户提供的授权信息,并生成一个电子消息,其中包含用于支付处理的信息。
在本课程中,我们将学习如何模拟一次授权交易及其撤销操作。
模拟授权交易
我们可以通过向 {BASE_URL}/simulate/authorization 端点发送 POST 请求来模拟授权交易。该端点需要携带 card_token 和其他授权详情。
注意: 此端点仅在沙箱环境(测试环境)中可用,不适用于生产环境。其目的是让我们能够测试在沙箱中创建的卡片、用户及其他对象。
请求参数
上述端点使用以下参数:
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
| card_token | 字符串 | 必须 | 交易中使用的卡片令牌,最大长度:255 个字符 |
| amount | 十进制数 | 必须 | 交易金额 |
| mid | 字符串 | 必须 | 参与交易的商户标识符,最大长度:50 个字符 |
| network_fees | 数组 | 可选 | 包含针对交易收取的不同类型费用 |
| webhook | 对象 | 可选 | 用于异步将信息发送到我们环境中的端点 |
| cash_back_amount | 十进制数 | 可选 | 如果交易模拟的是从 POS 系统获取现金返还,则表示现金金额 |
| is_pre_auth | 布尔值 | 可选 | 设置为 true 表示仅授权金额,否则为 false;默认值:false |
| pin | 字符串 | 可选 | 卡片的 PIN 码(如适用),最大长度:4 个字符 |
| card_options | 对象 | 可选 | 包含关于卡片使用的信息 |
| card_acceptor | 对象 | 可选 | 包含商户的描述信息 |
| transaction_options | 对象 | 可选 | 包含关于交易的附加信息 |
注意: 有关
card_acceptor、card_options、transaction_options、network_fees和webhook对象的详细信息,请参阅课程附录中的“附加参数和响应字段”部分。
点击下方代码框中的“运行”按钮以查看输出结果。
1// 导入库 2import fetch from "node-fetch" 3 4// 定义端点 URL 5const endpointUrl = new URL('{{BASE_URL}}simulate/authorization'); 6 7const tokens = '{{APPLICATION_TOKEN}}:{{ADMIN_ACCESS_TOKEN}}' 8const encoded = Buffer.from(tokens, 'ascii').toString('base64') 9 10const headerParameters = { 11 'Content-Type': 'application/json', 12 'Authorization': `Basic ${encoded}` 13}; 14 15// 定义请求体参数 16const bodyParameters = JSON.stringify({ 17 "amount": "100", 18 "mid": "123456789", 19 "card_token": "{{CARD_TOKEN}}" 20}); 21 22// 设置 API 调用选项 23const options = { 24 method: "POST", 25 headers: headerParameters, 26 body: bodyParameters 27}; 28 29// 发起 API 调用的函数 30async function createCardProduct() { 31 try { 32 const response = await fetch(endpointUrl, options); 33 // 输出响应 34 printResponse(response); 35 } catch (error) { 36 // 输出错误信息 37 printError(error); 38 } 39} 40 41// 调用函数发起 API 调用 42createCardProduct();
在上述代码中:
- 第 5 行: 将端点 URL 存储在
endpointUrl变量中。 - 第 16–20 行: 在
bodyParameters变量中添加amount、mid和card_token。由于我们仅在测试环境中模拟交易,因此为mid属性设置了任意数值123456789。 - 第 24 行: 将请求方法设置为
POST,用于创建新的交易。 - 第 32 行: 使用
fetch函数发起 API 调用。
响应字段
当代码成功执行后,输出将显示包含所有请求数据字段的完整交易对象。我们还会提取 token 和 amount 值,并分别存储为 TRANSACTION_TOKEN 和 TRANSACTION_AMOUNT。若出现失败,则会显示相应的错误信息。
一些重要的响应字段如下:
| 字段名 | 类型 | 描述 |
|---|---|---|
| transaction.token | 字符串 | 授权交易的唯一 ID,允许值:1–36 个字符 |
| transaction.user_token | 字符串 | 用户的唯一 ID,允许值:1–36 个字符 |
| transaction.card_token | 字符串 | 卡片的唯一 ID,允许值:1–36 个字符 |
| transaction.card_product_token | 字符串 | 卡片产品的唯一 ID,允许值:1–36 个字符 |
| transaction.gpa | 对象 | 返回用户/企业的通用账户(GPA)余额 |
| transaction.created_time | 字符串 | 卡片创建的 UTC 时间日期格式:yyyy-MM-ddThh:mm:ssZ |
| transaction.amount | 十进制数 | 用户账户批准的金额,格式:0.00 |
| transaction.request_amount | 十进制数 | 请求的金额,格式:0.00 |
| transaction.currency_code | 字符串 | 三位货币代码(ISO 4217) |
| transaction.card.last_four | 字符串 | 卡片 PAN(主账号)的最后四位数字 |
模拟交易撤销
我们可以通过向 {BASE_URL}/simulate/reversal 端点发送 POST 请求来模拟授权交易的撤销。该端点需要提供 original_transaction_token 和 amount 的值。交易撤销会将资金退还至最初扣款的账户,这通常发生在授权交易所冻结的资金被释放时。
请求参数
上述端点使用以下参数:
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
| original_transaction_token | 字符串 | 必须 | 要撤销的交易的令牌 |
| amount | 十进制数 | 必须 | 交易金额 |
| network_fees | 数组 | 可选 | 包含针对交易收取的不同类型费用 |
| webhook | 对象 | 可选 | 用于异步将信息发送到我们环境中的端点 |
注意: 有关
network_fees和webhook对象的详细信息,请参阅课程附录中的“附加参数和响应字段”部分。
点击下方代码框中的“运行”按钮以查看输出结果。
1// 导入库 2import fetch from "node-fetch" 3 4// 定义端点 URL 5const endpointUrl = new URL('{{BASE_URL}}simulate/reversal'); 6 7const tokens = '{{APPLICATION_TOKEN}}:{{ADMIN_ACCESS_TOKEN}}' 8const encoded = Buffer.from(tokens, 'ascii').toString('base64') 9 10const headerParameters = { 11 'Content-Type': 'application/json', 12 'Authorization': `Basic ${encoded}` 13}; 14 15// 定义请求体参数 16const bodyParameters = JSON.stringify({ 17 "original_transaction_token": "{{TRANSACTION_TOKEN}}", 18 "amount": "{{TRANSACTION_AMOUNT}}" 19}); 20 21// 设置 API 调用选项 22const options = { 23 method: "POST", 24 headers: headerParameters, 25 body: bodyParameters 26}; 27 28// 发起 API 调用的函数 29async function createCardProduct() { 30 try { 31 const response = await fetch(endpointUrl, options); 32 // 输出响应 33 printResponse(response); 34 } catch (error) { 35 // 输出错误信息 36 printError(error); 37 } 38} 39 40// 调用函数发起 API 调用 41createCardProduct();
在上述代码中:
- 第 5 行: 将端点 URL 存储在
endpointUrl变量中。 - 第 16–19 行: 在
bodyParameters变量中提供original_transaction_token和amount。 - 第 23 行: 将请求方法设置为
POST,用于创建新的撤销交易。 - 第 31 行: 使用
fetch函数发起 API 调用。
响应字段
当代码成功执行后,输出将显示包含所有请求数据字段的完整交易对象。若出现失败,则会显示相应的错误信息。
请参考模拟交易的响应字段表,了解本次 API 调用的响应字段信息。