开发者

预览版

一个下午,为 POS 加上刷掌结账。

您的 POS 请求同一终端上的 VenaPass 应用识别顾客,返回您自己的客户 ID,以及支付服务商可信赖的签名令牌。

Android POS:启动支付界面

VenaPass 显示金额、扫描手掌并返回结果。金额以最小货币单位表示,并附 ISO 4217 货币代码。

val pay = Intent("com.venapass.action.PAY")
    .putExtra("amount", 500000L)        // NGN 5,000.00
    .putExtra("currency", "NGN")
    .putExtra("terminal_id", "LEKKI-POS-1")
    .putExtra("request_id", UUID.randomUUID().toString())
startActivityForResult(pay, PAY_WITH_PALM)

// Result extras: success, customer_ref,
// assertion, receipt_id (gateway mode), message

网关 URL:调用终端上的应用

适用于可配置支付网关地址的 POS 软件。重试时请使用相同的 request_id,切勿使用新的。

POST http://127.0.0.1:9090/api/pay_direct
{ "amount": 500000, "currency": "NGN",
  "terminal_id": "LEKKI-POS-1",
  "request_id": "6f1c2e9a-…" }

200 OK
{ "success": true,
  "customer_ref": "CUST-1042",
  "assertion": "eyJhbGciOiJFZERTQSIs…",
  "receipt_id": null,
  "message": "Identity verified" }

面向支付服务商:验证令牌

该断言是标准的签名 JWT(EdDSA)。任何 JWT 库都可以用我们的公钥进行验证:

https://api.venapass.com/.well-known/venapass-keys

其 sub 是您自己的客户编号,因此您可直接从已为该客户留存的支付方式扣款。

  1. 1签名可通过当前有效的 VenaPass 密钥验证。
  2. 2令牌未过期(有效期约两分钟)。
  3. 3txn 与您即将扣款的金额和币种完全一致。
  4. 4terminal_id 与发起该笔交易的 POS 终端一致。
  5. 5您此前从未接受过此 jti 。

网关模式:接收来自 VenaPass 的扣款请求

如果您选择网关模式,我们会将每笔已识别的交易推送到您的 URL,并使用仅由您和我们持有的密钥签名。请将 request_id 作为幂等键处理。

POST https://your-provider.example/venapass
X-VenaPass-Signature: sha256=<HMAC of the body>
{ "assertion": "eyJ…", "customer_ref": "CUST-1042",
  "amount": 500000, "currency": "NGN",
  "terminal_id": "LEKKI-POS-1", "request_id": "6f1c…" }

Reply: { "approved": true, "reference": "PSP-88213",
         "message": "Approved" }

从您的 POS 注册顾客

启动 com.venapass.action.ENROLL ,并传入您的 customer_ref。VenaPass 会引导完成三次掌部扫描并返回成功结果。不会向我们发送任何姓名或电话号码。

申请沙盒访问权限