Tài liệu tích hợp API Nappay
Charging v2 · Recharge · Softcard · Card Partner
Tổng hợp 3 module API dành cho Merchant: gửi thẻ cào (Charging v2), nạp tiền dịch vụ (Recharge) và mua mã thẻ điện tử (Softcard). Mỗi module có công thức chữ ký, tham số, ví dụ request/response (JSON, cURL, PHP, Python, Node.js) và bảng mã trạng thái riêng.
Charging API v2 API mới
Hướng dẫn kết nối gửi thẻ cào — dùng cho Merchant cần gửi thẻ, kiểm tra trạng thái giao dịch và lấy biểu phí theo tài khoản.
01Tổng quan tích hợp
| Endpoint chính | https://nappay.vn/chargingws/v2 |
| API biểu phí | https://nappay.vn/chargingws/v2/getfee?partner_id=YOUR_PARTNER_ID |
| Method khuyến nghị | POST |
| Kiểu dữ liệu khuyến nghị | application/x-www-form-urlencoded hoặc JSON |
| Lệnh hỗ trợ | charging, check |
02Điều kiện trước khi gọi API
- Bạn cần có
partner_idvàpartner_keytừ khu vực Merchant trước khi gọi API. - Nếu Merchant bật IP whitelist thì request phải gửi từ đúng IP đã cấu hình.
- Với command
charging,request_idphải là duy nhất theo từngpartner_id. - Với command
check, hãy dùng lại đúngrequest_idcủa giao dịch đã gửi trước đó. - Nên gửi
telco,serial,codeở dạng sạch, đúng chuẩn để hệ thống xử lý nhanh và dễ đối soát.
03Công thức tạo sign
md5(partner_key . code . command . partner_id . request_id . serial . telco)
md5(partner_key . command . partner_id . request_id)
md5(partner_key . code . serial)
04Tham số cho lệnh charging
| Trường | Bắt buộc | Ví dụ | Mô tả |
|---|---|---|---|
| command | Bắt buộc | charging | Lệnh gửi thẻ lên hệ thống. |
| partner_id | Bắt buộc | YOUR_PARTNER_ID | Mã Merchant của bạn. |
| request_id | Bắt buộc | NAPTHE_20260403_001 | Mã giao dịch phía bạn tự sinh và không được trùng. |
| telco | Bắt buộc | VIETTEL | Mã nhà mạng. |
| amount | Bắt buộc | 100000 | Mệnh giá bạn khai báo. |
| serial | Bắt buộc | 10006139342354 | Serial của thẻ. |
| code | Bắt buộc | 114384960423544 | Mã nạp hoặc PIN của thẻ. |
| sign | Bắt buộc | md5(...) | Chữ ký xác thực request. |
05Tham số cho lệnh check
| Trường | Bắt buộc | Ví dụ | Mô tả |
|---|---|---|---|
| command | Bắt buộc | check | Lệnh kiểm tra trạng thái giao dịch. |
| partner_id | Bắt buộc | YOUR_PARTNER_ID | Mã Merchant của bạn. |
| request_id | Bắt buộc | NAPTHE_20260403_001 | request_id đã dùng ở lệnh charging. |
| sign | Bắt buộc | md5(...) | Khuyến nghị dùng md5(partner_key . command . partner_id . request_id). |
| telco / serial / code | Không bắt buộc | VIETTEL / 10006139342354 / 114384960423544 | Có thể truyền thêm để tương thích ngược. |
06Ví dụ & code mẫu
command = charging
{
"command": "charging",
"partner_id": "YOUR_PARTNER_ID",
"request_id": "NAPTHE_20260403_001",
"telco": "VIETTEL",
"amount": "100000",
"serial": "10006139342354",
"code": "114384960423544",
"sign": "a1b2c3d4e5f6..."
}
# Tạo sign trước: md5(partner_key + code + command + partner_id + request_id + serial + telco) curl -X POST 'https://nappay.vn/chargingws/v2' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ -d '{ "command": "charging", "partner_id": "YOUR_PARTNER_ID", "request_id": "NAPTHE_20260403_001", "telco": "VIETTEL", "amount": "100000", "serial": "10006139342354", "code": "114384960423544", "sign": "a1b2c3d4e5f6..." }' # Hoặc dùng form-urlencoded: curl -X POST 'https://nappay.vn/chargingws/v2' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'command=charging' \ -d 'partner_id=YOUR_PARTNER_ID' \ -d 'request_id=NAPTHE_20260403_001' \ -d 'telco=VIETTEL' \ -d 'amount=100000' \ -d 'serial=10006139342354' \ -d 'code=114384960423544' \ -d 'sign=a1b2c3d4e5f6...'
<?php $partner_id = 'YOUR_PARTNER_ID'; $partner_key = 'YOUR_PARTNER_KEY'; $request_id = 'NAPTHE_20260403_001'; $telco = 'VIETTEL'; $amount = '100000'; $serial = '10006139342354'; $code = '114384960423544'; $command = 'charging'; // Công thức sign $sign = md5($partner_key . $code . $command . $partner_id . $request_id . $serial . $telco); $payload = [ 'command' => $command, 'partner_id' => $partner_id, 'request_id' => $request_id, 'telco' => $telco, 'amount' => $amount, 'serial' => $serial, 'code' => $code, 'sign' => $sign, ]; $ch = curl_init('https://nappay.vn/chargingws/v2'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_TIMEOUT => 30, ]); $response = curl_exec($ch); curl_close($ch); $result = json_decode($response, true); print_r($result);
import hashlib import requests import json PARTNER_ID = "YOUR_PARTNER_ID" PARTNER_KEY = "YOUR_PARTNER_KEY" REQUEST_ID = "NAPTHE_20260403_001" TELCO = "VIETTEL" AMOUNT = "100000" SERIAL = "10006139342354" CODE = "114384960423544" COMMAND = "charging" # Tạo sign raw = PARTNER_KEY + CODE + COMMAND + PARTNER_ID + REQUEST_ID + SERIAL + TELCO sign = hashlib.md5(raw.encode()).hexdigest() payload = { "command": COMMAND, "partner_id": PARTNER_ID, "request_id": REQUEST_ID, "telco": TELCO, "amount": AMOUNT, "serial": SERIAL, "code": CODE, "sign": sign, } resp = requests.post( "https://nappay.vn/chargingws/v2", json=payload, headers={"Content-Type": "application/json"}, timeout=30 ) print(resp.json())
const crypto = require('crypto'); const axios = require('axios'); const PARTNER_ID = 'YOUR_PARTNER_ID'; const PARTNER_KEY = 'YOUR_PARTNER_KEY'; const REQUEST_ID = 'NAPTHE_20260403_001'; const telco = 'VIETTEL'; const amount = '100000'; const serial = '10006139342354'; const code = '114384960423544'; const command = 'charging'; const sign = crypto .createHash('md5') .update(`${PARTNER_KEY}${code}${command}${PARTNER_ID}${REQUEST_ID}${serial}${telco}`) .digest('hex'); const payload = { command, partner_id: PARTNER_ID, request_id: REQUEST_ID, telco, amount, serial, code, sign }; axios.post('https://nappay.vn/chargingws/v2', payload, { headers: { 'Content-Type': 'application/json' }, timeout: 30000 }).then(res => console.log(res.data)) .catch(err => console.error(err.response?.data || err.message));
command = check
{
"command": "check",
"partner_id": "YOUR_PARTNER_ID",
"request_id": "NAPTHE_20260403_001",
"sign": "a1b2c3d4e5f6..."
}
# sign = md5(partner_key + command + partner_id + request_id) curl -X POST 'https://nappay.vn/chargingws/v2' \ -H 'Content-Type: application/json' \ -d '{ "command": "check", "partner_id": "YOUR_PARTNER_ID", "request_id": "NAPTHE_20260403_001", "sign": "a1b2c3d4e5f6..." }'
<?php $partner_id = 'YOUR_PARTNER_ID'; $partner_key = 'YOUR_PARTNER_KEY'; $request_id = 'NAPTHE_20260403_001'; $command = 'check'; $sign = md5($partner_key . $command . $partner_id . $request_id); $payload = ['command'=>$command,'partner_id'=>$partner_id,'request_id'=>$request_id,'sign'=>$sign]; // ... gửi tương tự charging
raw = PARTNER_KEY + "check" + PARTNER_ID + REQUEST_ID sign = hashlib.md5(raw.encode()).hexdigest() payload = {"command":"check","partner_id":PARTNER_ID,"request_id":REQUEST_ID,"sign":sign} # requests.post(...) tương tự charging
const sign = crypto.createHash('md5').update(`${PARTNER_KEY}check${PARTNER_ID}${REQUEST_ID}`).digest('hex'); const payload = { command: 'check', partner_id: PARTNER_ID, request_id: REQUEST_ID, sign }; // axios.post(...) tương tự charging
07Cấu trúc phản hồi
| trans_id | ID giao dịch trong hệ thống. |
| request_id | Mã giao dịch phía Merchant gửi sang. |
| amount | Số tiền thực nhận về ví sau khi xử lý. |
| value | Mệnh giá thật được xác nhận. |
| declared_value | Mệnh giá Merchant khai báo lúc gửi thẻ. |
| telco | Nhà mạng của thẻ. |
| serial | Serial thẻ đã gửi. |
| code | Mã thẻ đã gửi. |
| status | Trạng thái thẻ hoặc mã lỗi API. |
| callback_sign | Chữ ký phản hồi: md5(partner_key . code . serial). |
| message | Mô tả trạng thái hoặc lỗi. |
08Ví dụ response
Pending
{
"trans_id": 123456,
"request_id": "NAPTHE_20260403_001",
"amount": 0,
"value": 0,
"declared_value": "100000",
"telco": "VIETTEL",
"serial": "10006139342354",
"code": "114384960423544",
"status": 99,
"callback_sign": "md5(partner_key . code . serial)",
"message": "PENDING"
}
Success
{
"trans_id": 123456,
"request_id": "NAPTHE_20260403_001",
"amount": 81000,
"value": 100000,
"declared_value": 100000,
"telco": "VIETTEL",
"serial": "10006139342354",
"code": "114384960423544",
"status": 1,
"callback_sign": "1d55e0d5f8b4e8f815a3efbb9f5c7b21",
"message": "VALID_CARD"
}
Error
{
"status": 102,
"message": "Dữ liệu xác thực không hợp lệ hoặc chữ ký sign sai."
}
09Trạng thái thẻ
| Status | Tên | Mô tả |
|---|---|---|
| 99 | PENDING | Thẻ đang chờ xử lý hoặc chờ nhà cung cấp trả kết quả. |
| 1 | VALID_CARD | Thẻ đúng, giao dịch thành công. |
| 2 | CARD_WRONG_VALUE | Thẻ đúng nhưng sai mệnh giá khai báo. |
| 3 | INVALID_CARD | Thẻ không hợp lệ hoặc dữ liệu thẻ sai. |
| 4 | MAINTENANCE | Nhà mạng hoặc cổng xử lý đang bảo trì. |
10Mã lỗi ở mức request
| Mã | Mô tả |
|---|---|
| 100 | Lỗi xử lý chung hoặc không thể tạo giao dịch. |
| 101 | Không tìm thấy giao dịch khi gọi command check. |
| 102 | Sai xác thực request, sai IP, sai sign hoặc dữ liệu đầu vào không hợp lệ. |
| 103 | Có ngoại lệ trong quá trình xử lý request. |
| 104 | Command không hợp lệ. Chỉ hỗ trợ charging và check. |
11API biểu phí và mệnh giá hỗ trợ
Dùng endpoint sau để lấy biểu phí theo Merchant:
telco, value, fees và penalty.curl -X GET 'https://nappay.vn/chargingws/v2/getfee?partner_id=YOUR_PARTNER_ID' \ -H 'Accept: application/json'
Recharge API Card Partner
Hướng dẫn nạp tiền dịch vụ — dành cho Merchant cần topup, kiểm tra trạng thái, lấy số dư, danh sách sản phẩm và bảng phí.
01Tổng quan tích hợp
| Endpoint chính | https://nappay.vn/api/rechargews |
| Method khuyến nghị | POST |
| Kiểu dữ liệu khuyến nghị | application/json |
| Lệnh hỗ trợ | topup, getstatus, getbalance, productlist, canceltopup, feetopup |
02Điều kiện trước khi gọi API
- Bạn cần có
partner_idvàpartner_keytừ Merchant trước khi gọi API. - Merchant và ví thanh toán phải đang hoạt động.
- IP gửi request phải nằm trong whitelist được phép.
- Với lệnh
topup,request_idphải là duy nhất để tránh tạo trùng giao dịch. - Nên gọi
productlisttrước để biết đúngservice_codevà cấu trúcaccount_infocần truyền.
03Công thức tạo sign
md5(partner_key . partner_id . command . request_id)
md5(partner_key . partner_id . command)
md5(partner_key . partner_id . command)
04Chi tiết từng lệnh
04.1Lệnh topup
Tạo giao dịch nạp tiền dịch vụ cho tài khoản đích.
| Trường | Bắt buộc | Ví dụ | Mô tả |
|---|---|---|---|
| command | Bắt buộc | topup | Tên lệnh gọi API. |
| partner_id | Bắt buộc | YOUR_PARTNER_ID | Mã Merchant của bạn. |
| request_id | Bắt buộc | TOPUP_20260403_001 | Mã giao dịch do phía bạn tự sinh. |
| service_code | Bắt buộc | VINA-DATA | Mã dịch vụ lấy từ productlist. |
| amount | Bắt buộc | 100000 | Giá trị cần nạp. |
| account_info | Bắt buộc | {"phone":"0987654321"} | Thông tin tài khoản nhận nạp, tùy theo sản phẩm. |
| sign | Bắt buộc | md5(...) | Chữ ký xác thực request. |
{
"command": "topup",
"partner_id": "YOUR_PARTNER_ID",
"request_id": "TOPUP_20260403_001",
"service_code": "VINA-DATA",
"amount": 100000,
"account_info": { "phone": "0987654321" },
"sign": "a1b2c3d4e5f6..."
}
# sign = md5(partner_key + partner_id + command + request_id) curl -X POST 'https://nappay.vn/api/rechargews' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ -d '{ "command": "topup", "partner_id": "YOUR_PARTNER_ID", "request_id": "TOPUP_20260403_001", "service_code": "VINA-DATA", "amount": 100000, "account_info": {"phone": "0987654321"}, "sign": "a1b2c3d4e5f6..." }'
<?php $partner_id = 'YOUR_PARTNER_ID'; $partner_key = 'YOUR_PARTNER_KEY'; $request_id = 'TOPUP_20260403_001'; $command = 'topup'; $sign = md5($partner_key . $partner_id . $command . $request_id); $payload = [ 'command' => $command, 'partner_id' => $partner_id, 'request_id' => $request_id, 'service_code' => 'VINA-DATA', 'amount' => 100000, 'account_info' => ['phone' => '0987654321'], 'sign' => $sign, ]; $ch = curl_init('https://nappay.vn/api/rechargews'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_POSTFIELDS => json_encode($payload), ]); $result = json_decode(curl_exec($ch), true);
import hashlib, requests PARTNER_ID, PARTNER_KEY = "YOUR_PARTNER_ID", "YOUR_PARTNER_KEY" REQUEST_ID, COMMAND = "TOPUP_20260403_001", "topup" sign = hashlib.md5((PARTNER_KEY+PARTNER_ID+COMMAND+REQUEST_ID).encode()).hexdigest() payload = {"command":COMMAND,"partner_id":PARTNER_ID,"request_id":REQUEST_ID, "service_code":"VINA-DATA","amount":100000, "account_info":{"phone":"0987654321"},"sign":sign} r = requests.post("https://nappay.vn/api/rechargews", json=payload)
const sign = crypto.createHash('md5').update(`${PARTNER_KEY}${PARTNER_ID}topup${REQUEST_ID}`).digest('hex'); axios.post('https://nappay.vn/api/rechargews', { command: 'topup', partner_id: PARTNER_ID, request_id: REQUEST_ID, service_code: 'VINA-DATA', amount: 100000, account_info: { phone: '0987654321' }, sign });
{
"status": "success",
"message": "Thành công",
"data": {
"time": "2026-04-03 14:30:00",
"request_id": "TOPUP_20260403_001",
"account": { "phone": "0987654321" },
"order_code": "RE240403001",
"pay_amount": 95000,
"discount": 5,
"service_code": "VINA-DATA",
"amount": 100000,
"status": "pending"
}
}
04.2Lệnh getstatus
Tra cứu trạng thái giao dịch recharge đã tạo trước đó.
| Trường | Bắt buộc | Ví dụ | Mô tả |
|---|---|---|---|
| command | Bắt buộc | getstatus | Tên lệnh gọi API. |
| partner_id | Bắt buộc | YOUR_PARTNER_ID | Mã Merchant của bạn. |
| request_id | Bắt buộc | TOPUP_20260403_001 | request_id của giao dịch đã gửi. |
| order_code | Bắt buộc | RE240403001 | Mã đơn hàng hệ thống trả về sau khi tạo giao dịch. |
| sign | Bắt buộc | md5(...) | Chữ ký xác thực request. |
{
"command": "getstatus",
"partner_id": "YOUR_PARTNER_ID",
"request_id": "TOPUP_20260403_001",
"order_code": "RE240403001",
"sign": "md5(partner_key . partner_id . command . request_id)"
}
{
"status": "success",
"message": "Thành công",
"data": {
"account": { "phone": "0987654321" },
"request_value": 100000,
"amount": 100000,
"request_id": "TOPUP_20260403_001",
"order_code": "RE240403001",
"status": "completed"
}
}
04.3Lệnh getbalance
Lấy số dư ví Merchant đang dùng để thanh toán recharge.
| Trường | Bắt buộc | Ví dụ | Mô tả |
|---|---|---|---|
| command | Bắt buộc | getbalance | Tên lệnh gọi API. |
| partner_id | Bắt buộc | YOUR_PARTNER_ID | Mã Merchant của bạn. |
| sign | Bắt buộc | md5(...) | Chữ ký không dùng request_id. |
{
"command": "getbalance",
"partner_id": "YOUR_PARTNER_ID",
"sign": "md5(partner_key . partner_id . command)"
}
{
"status": "success",
"message": "Thành công",
"data": {
"balance": 1200000,
"currency": "VND"
}
}
04.4Lệnh productlist
Lấy danh sách dịch vụ, mệnh giá, giá bán và các option nhập liệu.
| Trường | Bắt buộc | Ví dụ | Mô tả |
|---|---|---|---|
| command | Bắt buộc | productlist | Tên lệnh gọi API. |
| partner_id | Bắt buộc | YOUR_PARTNER_ID | Mã Merchant của bạn. |
| sign | Bắt buộc | md5(...) | Chữ ký không dùng request_id. |
{
"command": "productlist",
"partner_id": "YOUR_PARTNER_ID",
"sign": "md5(partner_key . partner_id . command)"
}
{
"status": "success",
"message": "Thành công",
"data": [
{
"name": "Nạp data VinaPhone",
"service_code": "VINA-DATA",
"items": [
{
"name": "Gói 100.000đ",
"value": 100000,
"price": 95000,
"discount": 5
}
],
"options": [
{ "key": "phone", "name": "Số điện thoại", "type": "text" }
]
}
]
}
productlist trước mỗi lần triển khai mới — danh sách dịch vụ thực tế có thể nhiều hơn ví dụ minh họa ở trên (data, ví game, nạp điện thoại trả trước/trả sau theo từng nhà mạng…).04.5Lệnh canceltopup
Yêu cầu hủy giao dịch recharge khi nghiệp vụ cho phép.
| Trường | Bắt buộc | Ví dụ | Mô tả |
|---|---|---|---|
| command | Bắt buộc | canceltopup | Tên lệnh gọi API. |
| partner_id | Bắt buộc | YOUR_PARTNER_ID | Mã Merchant của bạn. |
| request_id | Bắt buộc | TOPUP_20260403_001 | request_id của giao dịch cần hủy. |
| order_code | Bắt buộc | RE240403001 | Mã đơn hàng cần hủy. |
| sign | Bắt buộc | md5(...) | Theo logic hiện tại, sign kiểm theo md5(partner_key . partner_id . command). |
{
"command": "canceltopup",
"partner_id": "YOUR_PARTNER_ID",
"request_id": "TOPUP_20260403_001",
"order_code": "RE240403001",
"sign": "md5(partner_key . partner_id . command)"
}
{
"status": "success",
"message": "Thành công",
"data": {
"request_id": "TOPUP_20260403_001",
"order_code": "RE240403001",
"status": "canceled"
}
}
04.6Lệnh feetopup
Lấy bảng giá và chiết khấu theo Merchant.
| Trường | Bắt buộc | Ví dụ | Mô tả |
|---|---|---|---|
| command | Bắt buộc | feetopup | Tên lệnh gọi API. |
| partner_id | Bắt buộc | YOUR_PARTNER_ID | Mã Merchant của bạn. |
| sign | Bắt buộc | md5(...) | Chữ ký không dùng request_id. |
{
"command": "feetopup",
"partner_id": "YOUR_PARTNER_ID",
"sign": "md5(partner_key . partner_id . command)"
}
{
"status": "success",
"message": "Thành công",
"data": [
{
"key": "VINA-DATA",
"value": 100000,
"price": 95000,
"discount": 5
}
]
}
05Ghi chú về phản hồi
- Recharge API trả về khung JSON gồm
status,messagevàdata. - Trường
statuscó thể là chuỗi hoặc số nguyên tùy nhánh xử lý. - Nên xử lý luồng nghiệp vụ theo
status, không chỉ dựa vàomessage.
06Trạng thái thường gặp
| Mã / Status | Tên | Mô tả |
|---|---|---|
| success | — | Request hợp lệ và xử lý thành công. |
| command_invalid | command_invalid | Lệnh command không nằm trong danh sách hỗ trợ. |
| wrong_post_data | wrong_post_data | Thiếu hoặc sai dữ liệu đầu vào bắt buộc. |
| product_not_found | product_not_found | Không tìm thấy service_code tương ứng. |
| account_info_not_correct | account_info_not_correct | account_info không đúng định dạng mong muốn. |
| payment_fail | payment_fail | Thanh toán ví thất bại. |
| order_not_found | order_not_found | Không tìm thấy đơn hàng cần tra cứu hoặc hủy. |
| wrong_signature | wrong_signature | Sai chữ ký sign. |
| 114 | — | IP gọi API không nằm trong whitelist cho phép. |
07Card Partner API — Ví dụ thực tế (legacy)
Các ví dụ dưới đây lấy từ tài liệu Card Partner API cũ, endpoint vẫn dùng https://nappay.vn/api/rechargews.
Lấy trạng thái giao dịch (getstatus)
Tra cứu trạng thái đơn hàng đã tạo. Chữ ký: md5(partner_key + partner_id + command + request_id)
{
"partner_id": "3681148751",
"command": "getstatus",
"request_id": "116",
"order_code": "R625931CC50F71",
"sign": "43567456546dfs32465asdkg123"
}
curl --location 'https://nappay.vn/api/rechargews' \ --header 'Content-Type: application/json' \ --data '{ "partner_id": "3681148751", "command": "getstatus", "request_id": "116", "order_code": "R625931CC50F71", "sign": "43567456546dfs32465asdkg123" }'
{
"status": "success",
"data": {
"account": { "phone": "0943793984" },
"request_value": 10000,
"amount": 10000,
"request_id": "116",
"order_code": "R625931CC50F71",
"status": "pending"
}
}
Lấy danh sách sản phẩm (productlist)
Lấy toàn bộ sản phẩm đang bán. Chữ ký: md5(partner_key + partner_id + command)
{
"partner_id": "45974491332",
"command": "productlist",
"sign": "43567456546dfs32465asdkg123"
}
curl --location 'https://nappay.vn/api/rechargews' \ --header 'Content-Type: application/json' \ --data '{ "partner_id": "3681148751", "command": "productlist", "sign": "43567456546dfs32465asdkg123" }'
productlist trả về mảng sản phẩm gồm nạp Viettel/Vina/Mobi trả trước-trả sau, game (Avatar, Ninja, Ngọc Rồng…) với service_code, items (mệnh giá, giá, chiết khấu).Lấy số dư (getbalance)
Chữ ký: md5(partner_key + partner_id + command)
{
"partner_id": "3681148751",
"command": "getbalance",
"sign": "43567456546dfs32465asdkg123"
}
curl --location 'https://nappay.vn/api/rechargews' \ --header 'Content-Type: application/json' \ --data '{ "partner_id": "3681148751", "command": "getbalance", "sign": "43567456546dfs32465asdkg123" }'
{
"status": "success",
"data": {
"balance": 85465019,
"currency": "VND"
}
}
Softcard API
Hướng dẫn mua mã thẻ điện tử — mua card, tải lại đơn, kiểm tra tồn kho, lấy số dư ví và danh sách sản phẩm.
01Tổng quan tích hợp
| Endpoint chính | https://nappay.vn/api/cardws |
| API danh sách sản phẩm | https://nappay.vn/api/cardws/products?partner_id=YOUR_PARTNER_ID |
| Method | POST cho /api/cardws, GET cho /api/cardws/products |
| Kiểu dữ liệu khuyến nghị | application/json |
| Lệnh hỗ trợ | buycard, redownload, checkavailable, getbalance |
02Điều kiện trước khi gọi API
- Merchant phải được cấp quyền dùng module Softcard và đang hoạt động.
- Nếu bật
checksignthì sign phải khớp công thức của từng lệnh. - IP gọi API phải nằm trong whitelist Merchant hoặc whitelist hệ thống.
- Với
buycardvàredownload, request_id phải là mã riêng để tránh trùng đơn. wallet_numberphải là ví đúng Merchant và còn hoạt động.
03Công thức tạo sign
md5(partner_key . partner_id . command . request_id)
md5(partner_key . partner_id . command)
04Lệnh buycard
Mua mã thẻ điện tử và nhận card ngay nếu hệ thống xử lý thành công.
| Trường | Bắt buộc | Ví dụ | Mô tả |
|---|---|---|---|
| command | Bắt buộc | buycard | Tên lệnh gọi API. |
| partner_id | Bắt buộc | YOUR_PARTNER_ID | Mã Merchant của bạn. |
| request_id | Bắt buộc | CARD_20260403_001 | Mã giao dịch do phía bạn tự sinh. |
| service_code | Bắt buộc | VIETTEL | Mã sản phẩm cần mua. |
| value | Bắt buộc | 100000 | Mệnh giá thẻ. |
| qty | Bắt buộc | 2 | Số lượng thẻ cần mua, phải là số nguyên dương. |
| wallet_number | Bắt buộc | VND123456789 | Ví thanh toán của Merchant. |
| sign | Bắt buộc | md5(...) | Chữ ký xác thực request. |
{
"command": "buycard",
"partner_id": "YOUR_PARTNER_ID",
"request_id": "CARD_20260403_001",
"service_code": "VIETTEL",
"value": 100000,
"qty": 2,
"wallet_number": "VND123456789",
"sign": "a1b2c3d4e5f6..."
}
# sign = md5(partner_key + partner_id + command + request_id) curl -X POST 'https://nappay.vn/api/cardws' \ -H 'Content-Type: application/json' \ -d '{ "command": "buycard", "partner_id": "YOUR_PARTNER_ID", "request_id": "CARD_20260403_001", "service_code": "VIETTEL", "value": 100000, "qty": 2, "wallet_number": "VND123456789", "sign": "a1b2c3d4e5f6..." }'
<?php $partner_id = 'YOUR_PARTNER_ID'; $partner_key = 'YOUR_PARTNER_KEY'; $request_id = 'CARD_20260403_001'; $command = 'buycard'; $sign = md5($partner_key . $partner_id . $command . $request_id); $payload = [ 'command' => $command, 'partner_id' => $partner_id, 'request_id' => $request_id, 'service_code' => 'VIETTEL', 'value' => 100000, 'qty' => 2, 'wallet_number' => 'VND123456789', 'sign' => $sign, ]; // curl POST https://nappay.vn/api/cardws
sign = hashlib.md5((PARTNER_KEY+PARTNER_ID+"buycard"+REQUEST_ID).encode()).hexdigest() payload = {"command":"buycard","partner_id":PARTNER_ID,"request_id":REQUEST_ID, "service_code":"VIETTEL","value":100000,"qty":2, "wallet_number":"VND123456789","sign":sign} requests.post("https://nappay.vn/api/cardws", json=payload)
const sign = crypto.createHash('md5').update(`${PARTNER_KEY}${PARTNER_ID}buycard${REQUEST_ID}`).digest('hex'); axios.post('https://nappay.vn/api/cardws', { command: 'buycard', partner_id: PARTNER_ID, request_id: REQUEST_ID, service_code: 'VIETTEL', value: 100000, qty: 2, wallet_number: 'VND123456789', sign });
{
"status": 1,
"message": "Mua thẻ thành công",
"data": {
"cards": [
{
"name": "Thẻ Viettel 100.000",
"serial": "10006139342354",
"code": "114384960423544",
"expired": "2027-12-31"
}
],
"request_id": "CARD_20260403_001",
"order_code": "SC240403001"
}
}
05Lệnh redownload
Tải lại thông tin card của đơn hàng đã mua trước đó.
| Trường | Bắt buộc | Ví dụ | Mô tả |
|---|---|---|---|
| command | Bắt buộc | redownload | Tên lệnh gọi API. |
| partner_id | Bắt buộc | YOUR_PARTNER_ID | Mã Merchant của bạn. |
| request_id | Bắt buộc | CARD_20260403_001 | request_id đã dùng khi mua thẻ. |
| sign | Bắt buộc | md5(...) | Chữ ký xác thực request. |
{
"command": "redownload",
"partner_id": "YOUR_PARTNER_ID",
"request_id": "CARD_20260403_001",
"sign": "md5(partner_key . partner_id . command . request_id)"
}
{
"status": 1,
"message": "Mua thẻ thành công",
"data": {
"cards": [
{
"name": "Thẻ Viettel 100.000",
"serial": "10006139342354",
"code": "114384960423544",
"expired": "2027-12-31"
}
],
"request_id": "CARD_20260403_001",
"order_code": "SC240403001"
}
}
06Lệnh checkavailable
Kiểm tra tồn kho sản phẩm trước khi mua.
| Trường | Bắt buộc | Ví dụ | Mô tả |
|---|---|---|---|
| command | Bắt buộc | checkavailable | Tên lệnh gọi API. |
| partner_id | Bắt buộc | YOUR_PARTNER_ID | Mã Merchant của bạn. |
| service_code | Bắt buộc | VIETTEL | Mã sản phẩm cần kiểm tra. |
| value | Bắt buộc | 100000 | Mệnh giá thẻ cần kiểm tra. |
| qty | Bắt buộc | 5 | Số lượng muốn kiểm tra tồn kho. |
| sign | Bắt buộc | md5(...) | Chữ ký xác thực request. |
{
"command": "checkavailable",
"partner_id": "YOUR_PARTNER_ID",
"service_code": "VIETTEL",
"value": 100000,
"qty": 5,
"sign": "md5(partner_key . partner_id . command)"
}
{
"stock_available": true,
"VIETTEL-100000": "Còn hàng"
}
07Lệnh getbalance
Lấy số dư của ví Merchant đang dùng để mua card.
| Trường | Bắt buộc | Ví dụ | Mô tả |
|---|---|---|---|
| command | Bắt buộc | getbalance | Tên lệnh gọi API. |
| partner_id | Bắt buộc | YOUR_PARTNER_ID | Mã Merchant của bạn. |
| wallet_number | Bắt buộc | VND123456789 | Ví cần lấy số dư. |
| sign | Bắt buộc | md5(...) | Chữ ký xác thực request. |
{
"command": "getbalance",
"partner_id": "YOUR_PARTNER_ID",
"wallet_number": "VND123456789",
"sign": "md5(partner_key . partner_id . command)"
}
{
"balance": 2500000,
"currency_code": "VND"
}
08API danh sách sản phẩm
Dùng endpoint sau để lấy danh sách sản phẩm và mệnh giá hỗ trợ:
curl -X GET 'https://nappay.vn/api/cardws/products?partner_id=YOUR_PARTNER_ID' \ -H 'Accept: application/json'
[
{
"name": "Viettel",
"slug": "viettel",
"service_code": "VIETTEL",
"image": "/uploads/softcard/viettel.png",
"cardvalue": [
{ "service_code": "VIETTEL", "value": 100000, "id": 10 }
]
}
]
06Ghi chú về phản hồi
buycardvàredownloadtrả về JSON theo khungstatus,message,data.checkavailabletrả về JSON trực tiếp gồmstock_availablevà thông tin tồn kho.getbalancetrả về JSON trực tiếp gồmbalancevàcurrency_code.- API
/api/cardws/productstrả về mảng sản phẩm JSON trực tiếp.
07Bảng mã trạng thái
| Mã | Mô tả |
|---|---|
| 1 | Mua thẻ thành công hoặc tải lại card thành công. |
| 2 | Đơn hàng đang chờ xử lý. |
| 3 | Đơn hàng đã hủy và hoàn tiền. |
| 102 | Số dư ví không đủ. |
| 109 | request_id đã tồn tại. |
| 114 | Merchant gọi sai IP đăng ký. |
| 116 | Sai chữ ký sign. |
| 118 | Sản phẩm đã hết. |
| 129 | Đơn hàng không tồn tại. |
| 130 | Lỗi lấy thẻ từ nguồn cung cấp. |