mom-factura-payments

📁 ithustle/momenu-skills 📅 9 days ago
1
总安装量
1
周安装量
#46008
全站排名
安装命令
npx skills add https://github.com/ithustle/momenu-skills --skill mom-factura-payments

Agent 安装分布

opencode 1
cursor 1
github-copilot 1
claude-code 1
gemini-cli 1

Skill 文档

Mom Factura Payments Integration

Process payments for Angolan payment methods with automatic SAFT-AO invoice generation.

Base URL: https://api.momenu.online

Authentication

All requests require the x-api-key header.

Content-Type: application/json
x-api-key: <MERCHANT_API_KEY>

Optional headers:

  • x-env-qa: true – QA test environment (any origin)
  • x-dev-mode: true – Bypass domain validation (localhost only)

Payment Methods

1. Multicaixa Express (MCX) – Immediate

POST /api/payment/mcx

Immediate payment. Creates order as PAID and generates invoice on success.

Required body:

  • paymentInfo.amount (number) – Kwanzas
  • paymentInfo.phoneNumber (string) – Format: 244XXXXXXXXX

Optional body:

  • products (array) – Items for detailed invoice
  • products[].id (string), products[].productName (string), products[].productPrice (number), products[].productQuantity (number)
  • products[].iva (number) – IVA rate 0-14, default 14
  • customer (object) – name (string), nif (string), phone (string)
  • simulateResult (string) – QA only: success, insufficient_balance, timeout, rejected, invalid_number

Success (200):

{
  "success": true,
  "transactionId": "abc123...",
  "invoiceUrl": "https://invoice-momenu.toquemedia.net/invoices/..."
}

2. E-kwanza – Deferred

POST /api/payment/ekwanza

Deferred payment. Creates order as OPEN, returns QR code. Payment confirmation is delivered via webhook.

Required: paymentInfo.amount, paymentInfo.phoneNumber Optional: products, customer (same as MCX)

Success (200):

{
  "success": true,
  "code": "EKZ123456",
  "qrCode": "data:image/png;base64,...",
  "expirationDate": "2024-01-15T12:00:00Z",
  "paymentTimeout": 180
}

Payment confirmation arrives via webhook. Use code with status endpoint as fallback.

3. Bank Reference – Deferred

POST /api/payment/reference

Generates bank reference. Client pays via ATM or Internet Banking.

Required: paymentInfo.amount Optional: products, customer (same as MCX)

Success (200):

{
  "success": true,
  "operationId": "op-123...",
  "referenceNumber": "123456789",
  "entity": "12345",
  "dueDate": "2024-01-20"
}

Amount Validation

If both paymentInfo.amount and products are provided, they must match:

  • total = SUM(productPrice * productQuantity) for all products
  • Mismatch returns error AMOUNT_MISMATCH
  • Providing only one is valid (amount OR products)
  • Providing neither returns AMOUNT_MISMATCH

Webhook (Payment Confirmation)

All deferred payments (Bank Reference and E-kwanza) are confirmed via webhook. Configure the webhook URL in your apiConfigs document.

When a payment is confirmed, the API sends two sequential events:

Event 1: payment.confirmed — Sent immediately after order status is updated to PAID:

{
  "event": "payment.confirmed",
  "merchantTransactionId": "abc123...",
  "ekwanzaTransactionId": "EKZ456...",
  "operationStatus": "1",
  "operationData": { ... }
}

Event 2: invoice.created — Sent after invoice PDF is generated and uploaded:

{
  "event": "invoice.created",
  "merchantTransactionId": "abc123...",
  "ekwanzaTransactionId": "EKZ456...",
  "operationStatus": "1",
  "operationData": { ... },
  "invoiceUrl": "https://invoice-momenu.toquemedia.net/invoices/..."
}

Non-paid events (operationStatus 3, 4, 5) are sent without the event field for backward compatibility.

operationStatus values: "1" Paid · "3" Cancelled/Expired · "4" Failed/Refused · "5" Error

Fallback (status endpoints):

E-kwanza: GET /api/payment/ekwanza/status/:code – Returns status: "paid" or "pending" Reference: GET /api/payment/reference/status/:operationId – Returns payment.status

When paid, both return invoiceUrl.

Error Codes

Code Description
MISSING_API_KEY x-api-key header missing
INVALID_API_KEY Key invalid or inactive
DOMAIN_NOT_ALLOWED Origin not registered
INVALID_AMOUNT Invalid amount
AMOUNT_MISMATCH amount != SUM(products)
MISSING_PHONE Phone required (MCX/E-kwanza)
MISSING_RESTAURANT_ID Merchant not identified
RATE_LIMIT_EXCEEDED 100 req/min exceeded
PAYMENT_RATE_LIMIT_EXCEEDED 20 payment req/min exceeded
INTERNAL_ERROR Server error

Error format: { "success": false, "error": "message", "code": "ERROR_CODE" }

Fees

2% processing fee on all payments: feeAmount = totalAmount * 0.02

Notes

  • Phone format: 244XXXXXXXXX (12 digits)
  • IVA defaults to 14%. Use 0 for exempt.
  • Invoice PDFs hosted on CDN, returned as invoiceUrl
  • MCX is immediate; Reference and E-kwanza are confirmed via webhook (status polling as fallback)