- 概览
1.1 前置条件
开始集成前,请确保:- 已向 UQPAY 提供你的账户 ID,以启用 POS API 功能
1.2 集成流程
- 终端注册
每台 POS 终端在处理交易前都必须先在 UQPAY 完成注册。这是一次性操作,每台终端只需注册一次。
2.1 API Endpoint
2.2 请求参数
| 字段 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
firm_code | string | 是 | 终端厂商代码 | "03" |
firm_sn | string | 是 | 厂商提供的终端序列号 | "TG676SX1764902333" |
terminal_model | string | 是 | 终端型号 | "P1000" |
| 代码 | 厂商 |
|---|---|
01 | Shengben |
02 | Newland |
03 | Xinguodu |
04 | iMin |
05 | PAX |
2.3 请求示例
2.4 响应
| 字段 | 类型 | 说明 |
|---|---|---|
terminal_id | string | UQPAY 分配的终端标识(TID) |
firm_sn | string | 终端序列号 |
create_time | string | 注册时间 |
注意: 请妥善保存 terminal_id,后续所有 API 调用都需要用到。
- PIN 密钥管理
要安全处理基于 PIN 的交易,你需要获取并管理 PIN 加密密钥。
3.1 生成 AES 私钥
请求 PIN 密钥前,先在终端或服务器上生成一个 AES 私钥:| 要求 | 规格 |
|---|---|
| 算法 | AES |
| 密钥长度 | 最长 256 位(64 个十六进制字符) |
| 格式 | 十六进制字符串 |
重要: 请妥善保存该私钥。后续需要用它解密 Get PIN Key API 返回的 encrypt_pin_key。
3.2 请求 PIN 密钥
API Endpoint:| 字段 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
terminal_id | string | 是 | 注册时返回的终端 ID | "10000254" |
prv_key | string | 是 | 你的 AES 私钥(十六进制格式,最长 64 字符) | "5214abf357f2cc47645c4d942c02fd0180acc6d8de8fae3708849b6a459cba00" |
| 字段 | 类型 | 说明 |
|---|---|---|
terminal_id | string | 终端标识 |
encrypt_pin_key | string | 加密后的 PIN 密钥(Base64 编码) |
pin_key_expire | integer | PIN 密钥过期时间戳(毫秒) |
3.3 解密 PIN 密钥
使用你的 AES 私钥解密encrypt_pin_key,得到实际的 PINKEY。
解密参数:
| 参数 | 值 |
|---|---|
| 算法 | AES-256-GCM |
| 输入 | encrypt_pin_key |
| 密钥 | 你的 prv_key |
| 输出 | PINKEY |
- encrypt_pin_key:
LASDho1ILHoYRf/5YEyIgieoc+SXJkUsHZElXOMNGv7WnC3fZzFPYDH8mJaDbnwvom3QEtdv3NjvaEUtVeetWdQsv2RtQw4XEYh/Cg== - 实际 PINKEY:
26e1734e4d52b905e74574b7bf0897daeec7e217c61b3ac0
解密代码示例见附录。
3.4 密钥过期
留意pin_key_expire 时间戳,在过期前刷新 PIN 密钥。按相同流程重新请求新的 PIN 密钥即可。
- PIN 块加密
处理基于 PIN 的交易时,你需要将持卡人 PIN 加密为 PIN 块。
4.1 概览
PIN 块由以下内容组合生成:- 卡 PAN(Primary Account Number)
- 持卡人 PIN
- PINKEY
4.2 示例
输入:| 参数 | 值 |
|---|---|
| 卡号 | 5554748800260229 |
| PIN | 302312 |
| PINKEY | 26e1734e4d52b905e74574b7bf0897daeec7e217c61b3ac0 |
| 参数 | 值 |
|---|---|
| PINBLOCK | 4F5D12303995DD06 |
PIN 块加密代码示例见附录。
- 创建 Payment Intent
完成终端设置并获取 PINKEY 后,即可处理刷卡交易。
5.1 API Endpoint
5.2 请求示例
POS 交易使用card_present 支付方式类型。需要注意的关键字段:
terminal_id:设置为终端注册时返回的 TIDencrypted_pin:设置为 PIN 加密生成的 PINBLOCKsystem_trace_audit_number:每笔新交易必须唯一(STAN)
5.3 响应示例
- 错误处理
6.1 POS API 错误码
| 错误码 | 错误信息 |
|---|---|
account_pos_api_no_permission | Account pos api no permission |
terminal_not_belong_to_account | Terminal not belong to account |
terminal_register_failed | Terminal register failed |
terminal_info_not_found | Terminal info not found |
pinkey_retrieve_failed | Pinkey retrieve failed |
- 测试
7.1 测试卡
在沙盒环境使用以下测试卡数据:| 字段 | 值 |
|---|---|
| 卡号 | 5554748800161559 |
| 有效期月 | 07 |
| 有效期年 | 2027 |
| PIN(明文) | “ |
| 卡组织 | Mastercard |
注意: 每笔测试交易必须使用唯一的 system_trace_audit_number。
- 附录
8.1 代码示例
AES-256-GCM 解密(Python)
PIN 块加密(Python)
8.2 术语表
| 术语 | 定义 |
|---|---|
| TID | 终端标识,由 UQPAY 分配的唯一 ID |
| PINKEY | 用于加密持卡人 PIN 的密钥 |
| PIN Block | 持卡人 PIN 的加密表示 |
| STAN | 系统跟踪审计号,交易的唯一跟踪编号 |
| EMV | Europay、Mastercard、Visa;芯片卡标准 |
| PAN | Primary Account Number(卡号) |
| CVM | 持卡人验证方式(Cardholder Verification Method) |

