Skip to content

API Sự kiện

1. Inbound — IPN (do @nx/mq-pay xử lý)

Các endpoint IPN của nhà cung cấp thanh toán thuộc sở hữu của @nx/mq-pay (được đăng ký làm controller khi chạy ở mode FULL hoặc API). Bản thân package payment không khai báo route IPN.

Nhà cung cấpEndpoint IPNXác thực
VNPAY QR MMS(theo nhà cung cấp)Xác minh chữ ký nhà cung cấp (trong MQ-Pay PaymentVerificationService)
VNPAY PhonePOS(theo nhà cung cấp)Tương tự
SYSTEMn/a (in-platform)n/a

Đường dẫn IPN chính xác được định nghĩa bên trong registry nhà cung cấp của @nx/mq-pay; tham khảo package đó để biết các route.

2. Outbound — HTTP Webhooks

Subscriber đăng ký endpoint của họ thông qua WebhookConfigController (REST). Trên mỗi thay đổi trạng thái MQ-Pay, WebhookEventHandlerHelper truy vấn các webhook đang hoạt động đã đăng ký theo loại sự kiện và điều phối qua WebhookDispatcherService.

Bộ lọc

WebhookEventHandlerHelper.handle() (src/helpers/webhook-event-handler/helper.ts:54-96):

  1. Bỏ qua dispatch cho các sự kiện không actionable (TRANSACTION_CREATED, ATTEMPT_CREATED, ATTEMPT_SENT) — những sự kiện này chỉ dùng cho WS.
  2. Truy vấn WebhookConfigRepository.find({ status=ACTIVATED, eventTypes contains eventType }).
  3. Với mỗi webhook khớp → WebhookDispatcherService.dispatch({ webhookConfig, eventType, payload }).

Loại sự kiện

Từ @nx/mq-pay/src/common/events/index.ts:14-28.

Sự kiệnKiểu payloadKích hoạt bởiWebhook gửi
mq-pay:transaction.createdITransactionCreatedPayloadInsert Transaction✗ (chỉ WS)
mq-pay:transaction.settledITransactionSettledPayloadThanh toán đầy đủ
mq-pay:transaction.cancelledITransactionCancelledPayloadHủy tự động/admin
mq-pay:attempt.createdIAttemptCreatedPayloadInsert Attempt✗ (chỉ WS)
mq-pay:attempt.sentIAttemptSentPayloadGọi nhà cung cấp thành công (đã có QR)✗ (chỉ WS)
mq-pay:attempt.successIAttemptSuccessPayloadIPN xác nhận
mq-pay:attempt.failedIAttemptFailedPayloadGọi nhà cung cấp thất bại
mq-pay:attempt.expiredIAttemptExpiredPayloadQR hết hạn không thanh toán
mq-pay:attempt.cancelledIAttemptCancelledPayloadHủy lan truyền

Cấu trúc payload webhook

ts
{
  event: string,             // e.g. 'mq-pay:attempt.success'
  transaction?: TTransaction,
  attempt?: TPaymentAttempt,
  timestamp: ISO,
  source?: { id: string, type: string }, // typically SaleOrder/SaleCheck
}

Phía subscriber (sale)

PaymentWebhookController của sale nhận chúng tại POST /v1/api/sale/webhooks/payment. Xem sale/payments.md để biết logic handler đầy đủ.

3. Outbound — WebSocket

PaymentSocketEventService (src/services/payment-socket-event.service.ts).

TopicHằng sốKích hoạt
observation/payment/transactionPaymentWebSocketTopics.TRANSACTIONBất kỳ sự kiện transaction nào (*.created, *.settled, *.cancelled)
observation/payment/payment-attemptPaymentWebSocketTopics.ATTEMPTBất kỳ sự kiện attempt nào (*.created, *.sent, *.success, *.failed, *.expired, *.cancelled)

Phân phối room

ts
// Transaction (PaymentWebSocketRooms.getTransactionRooms)
[
  'merchants/<merchantId>',
  'merchants/<merchantId>/transactions',
  'transactions/<transactionId>',
]

// Attempt (PaymentWebSocketRooms.getPaymentAttemptRooms)
[
  'merchants/<merchantId>',
  'merchants/<merchantId>/payment-attempts',
  'payment-attempts/<attemptId>',
  'transactions/<transactionId>/payment-attempts',  // when transactionId present
]

merchantId được trích từ transaction.metadata.merchant.source.id hoặc attempt.metadata.merchant.source.id.

4. BullMQ (nội bộ — bên trong MQ-Pay)

QueueLoạiConcurrencyNguồn
schedulerscheduler jobs (3 partition: P01–P03)10 jobs / partition@nx/mq-pay/src/services/queue/...
confirmationconfirmation jobs (3 partition)10 jobs / partitiontương tự

Queue là nội bộ của @nx/mq-pay. Worker tiêu thụ từ những queue này. Phụ thuộc mode: mode FULLWORKER sinh worker; mode API tạo job nhưng không tiêu thụ.

5. Idempotency & Thứ tự

Bề mặtPhân phốiKhôi phục
Webhook (HTTP)at-most-once mỗi lần dispatch; retry khi lỗi truyềnChính sách retry của WebhookDispatcherService (mặc định: timeoutMs=30000, maxRetries=3 từ WebhookConfig.metadata)
WebSocketbest-effortclient refetch qua REST khi reconnect
BullMQat-least-oncekhóa idempotency theo từng job trong @nx/mq-pay

6. Trang liên quan

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.