API nạp cước
rechargews
Nạp cước/game#
Nạp tiền điện thoại, data và tài khoản game; tra cứu đơn, số dư, danh sách sản phẩm và bảng phí.
API này đang được triển khai. Đặc tả dưới đây là bản chính thức để bạn chuẩn bị tích hợp.
Tổng quan#
Một endpoint nhận mọi lệnh, phân biệt bằng tham số command. Gửi POST với thân JSON; phản hồi luôn là JSON gồm status, message và (khi thành công) data.
- Endpoint
- https://thepay1s.com/api/rechargews
- Phương thức
- POST
- Kiểu dữ liệu
- application/json
- Lệnh
- topup, getstatus, getbalance, productlist, canceltopup, feetopup
Điều kiện
- Kết nối API có loại Nạp cước/game và đang hoạt động; tài khoản sở hữu và ví không bị khoá.
- Nếu kết nối có danh sách Địa chỉ IP, yêu cầu phải gửi từ các IP đó, nếu không trả status=114.
- request_id của lệnh topup là duy nhất trong tài khoản; gửi trùng trả status=102 và không tạo đơn mới.
- Gọi productlist trước để biết service_code, mệnh giá và các khoá cần gửi trong account_info.
- API không gọi callback về hệ thống của bạn. Sau khi tạo đơn, dùng getstatus để theo dõi tới khi đơn có trạng thái cuối.
Ghi chú tương thích
- Lỗi trả status là mã số dạng chuỗi (101, 104…), không phải mã chữ như wrong_signature hay command_invalid.
- Chỉ đọc thân JSON (application/json); tham số dạng form hoặc query string không được đọc.
- Số lượng gửi ở tham số qty cùng cấp với amount, không đặt trong account_info.
- Mọi phản hồi thành công có message ở cấp ngoài cùng, kể cả topup và getbalance.
Chữ ký#
sign là MD5 của Partner Key ghép với Partner ID, tên lệnh và (với lệnh có request_id) mã đơn của bạn. Thứ tự ghép khác với API đổi thẻ: partner_id đứng trước command.
| Công thức | Lệnh |
|---|---|
| md5(partner_key + partner_id + command + request_id) | topup, getstatus |
| md5(partner_key + partner_id + command) | getbalance, productlist, canceltopup, feetopup |
Ví dụ tính chữ ký
Với Partner Key giả định YOUR_PARTNER_KEY và Partner ID ở các ví dụ:
topup#
Tạo đơn nạp cho tài khoản đích. Tiền được trừ khỏi ví ngay khi tạo đơn; đơn mới ở trạng thái pending.
- commandchuỗiBắt buộcTên lệnh, đúng như tên mục.
- partner_idchuỗiBắt buộcPartner ID của kết nối.
- request_idchuỗiBắt buộcMã đơn phía bạn. Lệnh topup: mã mới, duy nhất trong tài khoản. Lệnh getstatus và canceltopup: request_id đã dùng khi topup.
- service_codechuỗiBắt buộcMã sản phẩm, lấy từ productlist.
- amountsố nguyênBắt buộcSố tiền nạp (VND), số nguyên.
- account_infoobjectBắt buộcObject thông tin nhận nạp, các khoá theo options của sản phẩm (ví dụ phone với nạp điện thoại, account với nạp game).
- qtysố nguyênSố lượng, mặc định 1, không vượt quá quantity_max của sản phẩm (nếu có).
- signchuỗiBắt buộcChữ ký md5(partner_key + partner_id + command + request_id), xem mục Chữ ký.
| Tên | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| command | chuỗi | Có | Tên lệnh, đúng như tên mục. |
| partner_id | chuỗi | Có | Partner ID của kết nối. |
| request_id | chuỗi | Có | Mã đơn phía bạn. Lệnh topup: mã mới, duy nhất trong tài khoản. Lệnh getstatus và canceltopup: request_id đã dùng khi topup. |
| service_code | chuỗi | Có | Mã sản phẩm, lấy từ productlist. |
| amount | số nguyên | Có | Số tiền nạp (VND), số nguyên. |
| account_info | object | Có | Object thông tin nhận nạp, các khoá theo options của sản phẩm (ví dụ phone với nạp điện thoại, account với nạp game). |
| qty | số nguyên | Không | Số lượng, mặc định 1, không vượt quá quantity_max của sản phẩm (nếu có). |
| sign | chuỗi | Có | Chữ ký md5(partner_key + partner_id + command + request_id), xem mục Chữ ký. |
{ "command": "topup", "partner_id": "YOUR_PARTNER_ID", "request_id": "TOPUP20261024001", "service_code": "VIETTEL", "amount": 100000, "account_info": { "phone": "0987654321" }, "qty": 1, "sign": "bea6f2c44abfc7ad97dca6c4e7d9588c" }
- Số tiền trừ ví: pay_amount = amount × (100 − discount) / 100 × qty, với discount là chiết khấu theo nhóm của tài khoản.
- Sản phẩm loại mobile: amount phải là một value trong items của sản phẩm.
- Sản phẩm loại game: amount nằm trong khoảng min_value tới max_value của option amount và là bội của multiple_value; sai trả status=102.
- Gửi lại cùng request_id trả lỗi REQUEST ID DA TON TAI; dùng getstatus để lấy đơn đã tạo.
getstatus#
Tra cứu trạng thái một đơn cước/game đã tạo.
- commandchuỗiBắt buộcTên lệnh, đúng như tên mục.
- partner_idchuỗiBắt buộcPartner ID của kết nối.
- request_idchuỗiBắt buộcMã đơn phía bạn. Lệnh topup: mã mới, duy nhất trong tài khoản. Lệnh getstatus và canceltopup: request_id đã dùng khi topup.
- order_codechuỗiBắt buộcMã đơn hệ thống trả về ở lệnh topup.
- signchuỗiBắt buộcChữ ký md5(partner_key + partner_id + command + request_id), xem mục Chữ ký.
| Tên | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| command | chuỗi | Có | Tên lệnh, đúng như tên mục. |
| partner_id | chuỗi | Có | Partner ID của kết nối. |
| request_id | chuỗi | Có | Mã đơn phía bạn. Lệnh topup: mã mới, duy nhất trong tài khoản. Lệnh getstatus và canceltopup: request_id đã dùng khi topup. |
| order_code | chuỗi | Có | Mã đơn hệ thống trả về ở lệnh topup. |
| sign | chuỗi | Có | Chữ ký md5(partner_key + partner_id + command + request_id), xem mục Chữ ký. |
{ "command": "getstatus", "partner_id": "YOUR_PARTNER_ID", "request_id": "TOPUP20261024001", "order_code": "RE7K2M9Q4XZ1A", "sign": "96fbff46acf8dff0ea4d591f96d74f01" }
- Hỏi cách nhau ít nhất 30 giây và dừng khi đơn ở trạng thái completed, failed hoặc canceled.
getbalance#
Lấy số dư ví của tài khoản sở hữu kết nối, ví dùng để thanh toán đơn cước/game.
- commandchuỗiBắt buộcTên lệnh, đúng như tên mục.
- partner_idchuỗiBắt buộcPartner ID của kết nối.
- signchuỗiBắt buộcChữ ký md5(partner_key + partner_id + command), xem mục Chữ ký.
| Tên | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| command | chuỗi | Có | Tên lệnh, đúng như tên mục. |
| partner_id | chuỗi | Có | Partner ID của kết nối. |
| sign | chuỗi | Có | Chữ ký md5(partner_key + partner_id + command), xem mục Chữ ký. |
{ "command": "getbalance", "partner_id": "YOUR_PARTNER_ID", "sign": "1a4651ad1fc33b21b9a5dabf410c7f79" }
- Lệnh không dùng request_id, không tạo giao dịch.
productlist#
Lấy danh sách sản phẩm đang bán: mệnh giá, giá theo nhóm của tài khoản và các trường cần nhập.
- commandchuỗiBắt buộcTên lệnh, đúng như tên mục.
- partner_idchuỗiBắt buộcPartner ID của kết nối.
- signchuỗiBắt buộcChữ ký md5(partner_key + partner_id + command), xem mục Chữ ký.
| Tên | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| command | chuỗi | Có | Tên lệnh, đúng như tên mục. |
| partner_id | chuỗi | Có | Partner ID của kết nối. |
| sign | chuỗi | Có | Chữ ký md5(partner_key + partner_id + command), xem mục Chữ ký. |
{ "command": "productlist", "partner_id": "YOUR_PARTNER_ID", "sign": "e23aa765d9cc5696811207b0125172c5" }
- Danh sách và giá có thể thay đổi, nên lấy lại định kỳ thay vì lưu cố định. Ý nghĩa từng trường ở mục Phản hồi và trạng thái đơn.
canceltopup#
Huỷ một đơn chưa hoàn tất và hoàn tiền về ví.
- commandchuỗiBắt buộcTên lệnh, đúng như tên mục.
- partner_idchuỗiBắt buộcPartner ID của kết nối.
- request_idchuỗiBắt buộcMã đơn phía bạn. Lệnh topup: mã mới, duy nhất trong tài khoản. Lệnh getstatus và canceltopup: request_id đã dùng khi topup.
- order_codechuỗiBắt buộcMã đơn hệ thống trả về ở lệnh topup.
- signchuỗiBắt buộcChữ ký md5(partner_key + partner_id + command), xem mục Chữ ký.
| Tên | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| command | chuỗi | Có | Tên lệnh, đúng như tên mục. |
| partner_id | chuỗi | Có | Partner ID của kết nối. |
| request_id | chuỗi | Có | Mã đơn phía bạn. Lệnh topup: mã mới, duy nhất trong tài khoản. Lệnh getstatus và canceltopup: request_id đã dùng khi topup. |
| order_code | chuỗi | Có | Mã đơn hệ thống trả về ở lệnh topup. |
| sign | chuỗi | Có | Chữ ký md5(partner_key + partner_id + command), xem mục Chữ ký. |
{ "command": "canceltopup", "partner_id": "YOUR_PARTNER_ID", "request_id": "TOPUP20261024001", "order_code": "RE7K2M9Q4XZ1A", "sign": "a1ae1cf89832e8f58f72060617029fb6" }
- Chỉ huỷ được đơn ở trạng thái pending hoặc processing; số tiền đã trừ (pay_amount) được hoàn về ví và đơn chuyển sang canceled.
- Chữ ký của canceltopup không ghép request_id, dù lệnh có gửi request_id.
feetopup#
Lấy bảng giá và chiết khấu theo nhóm của tài khoản cho từng mệnh giá.
- commandchuỗiBắt buộcTên lệnh, đúng như tên mục.
- partner_idchuỗiBắt buộcPartner ID của kết nối.
- signchuỗiBắt buộcChữ ký md5(partner_key + partner_id + command), xem mục Chữ ký.
| Tên | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| command | chuỗi | Có | Tên lệnh, đúng như tên mục. |
| partner_id | chuỗi | Có | Partner ID của kết nối. |
| sign | chuỗi | Có | Chữ ký md5(partner_key + partner_id + command), xem mục Chữ ký. |
{ "command": "feetopup", "partner_id": "YOUR_PARTNER_ID", "sign": "5fea7c50b47e206c353b79caebafbee3" }
- Mỗi dòng là một mệnh giá của một sản phẩm, key là service_code.
Phản hồi và trạng thái đơn#
Thành công: status là chuỗi success, kèm message và data. Lỗi: status là mã số dạng chuỗi và message, không có data. Luôn trả HTTP 200.
Các trường trong data
- timeKiểuchuỗiLệnhtopupMô tảThời điểm tạo đơn, dạng YYYY-MM-DD HH:mm:ss giờ Việt Nam.
- request_idKiểuchuỗiLệnhtopup, getstatus, canceltopupMô tảrequest_id bạn đã gửi.
- order_codeKiểuchuỗiLệnhtopup, getstatus, canceltopupMô tảMã đơn của hệ thống, dùng cho getstatus và canceltopup.
- service_codeKiểuchuỗiLệnhtopupMô tảMã sản phẩm.
- amountKiểusố nguyênLệnhtopup, getstatusMô tảtopup: số tiền nạp bạn gửi. getstatus: số tiền đã trừ ví.
- request_valueKiểusố nguyênLệnhgetstatusMô tảSố tiền nạp của đơn.
- pay_amountKiểusố nguyênLệnhtopupMô tảSố tiền đã trừ ví.
- discountKiểusốLệnhtopup, feetopupMô tảChiết khấu theo phần trăm.
- accountKiểuobjectLệnhgetstatusMô tảaccount_info của đơn.
- statusKiểuchuỗiLệnhtopup, getstatus, canceltopupMô tảTrạng thái đơn, xem bảng bên dưới.
- balanceKiểusố nguyênLệnhgetbalanceMô tảSố dư ví (VND).
- currencyKiểuchuỗiLệnhgetbalanceMô tảLuôn là VND.
- key, value, priceKiểumảngLệnhfeetopupMô tảMảng các dòng gồm key (service_code), value (mệnh giá), price (giá sau chiết khấu) và discount.
Sản phẩm trong productlist
- nameKiểuchuỗiMô tảTên sản phẩm.
- service_codeKiểuchuỗiMô tảMã sản phẩm, gửi trong service_code của topup.
- typeKiểuchuỗiMô tảmobile: chọn một mệnh giá trong items. game: nhập số tiền theo option amount.
- quantity_maxKiểusố nguyênMô tảSố lượng tối đa mỗi đơn, 0 hoặc 1 nghĩa là chỉ nạp một lần.
- itemsKiểumảngMô tảMệnh giá: name, value, price (giá sau chiết khấu) và discount theo nhóm của tài khoản.
- optionsKiểumảngMô tảCác trường cần nhập: key (khoá trong account_info), name, type; option amount có thêm min_value, max_value, multiple_value.
Trạng thái đơn (data.status)
- pendingÝ nghĩaĐã nhận đơn, tiền đã trừ, đang chờ gửi sang nhà cung cấp. Có thể huỷ.
- processingÝ nghĩaNhà cung cấp đang xử lý. Có thể huỷ nếu nhà cung cấp chưa nạp.
- completedÝ nghĩaNạp thành công.
- failedÝ nghĩaNhà cung cấp báo thất bại. Đơn được quản trị viên đối soát; nếu hoàn tiền, đơn chuyển sang canceled.
- canceledÝ nghĩaĐơn đã huỷ và tiền đã hoàn về ví.
Mã lỗi#
Thông báo được giữ nguyên văn để bạn so khớp, nhưng nên xử lý theo status.
- 100messageAPI KEY KHONG DUNGNguyên nhân và cách xử lýpartner_id không tồn tại hoặc kết nối không có loại Nạp cước/game.
- 100messageApi key chưa được bậtNguyên nhân và cách xử lýKết nối đang tắt.
- 100messageTài khoản bị khóaNguyên nhân và cách xử lýTài khoản sở hữu kết nối đang bị khoá.
- 100messageĐịa chỉ ví bị khóaNguyên nhân và cách xử lýVí của tài khoản đang bị khoá.
- 101messageCHU KY KHONG HOP LENguyên nhân và cách xử lýChữ ký không khớp. Kiểm tra Partner Key, thứ tự ghép và lệnh có ghép request_id hay không.
- 102messageREQUEST ID DA TON TAINguyên nhân và cách xử lýrequest_id đã được dùng cho một đơn khác trong tài khoản.
- 102messageLOI MENH GIA TIENNguyên nhân và cách xử lýamount không phải mệnh giá của sản phẩm, hoặc ngoài khoảng cho phép với sản phẩm loại game.
- 102messageThông tin tài khoản nạp không hợp lệNguyên nhân và cách xử lýaccount_info thiếu khoá bắt buộc theo options, hoặc qty vượt quantity_max.
- 102messageSố tiền trong tài khoản không đủNguyên nhân và cách xử lýSố dư ví không đủ cho pay_amount.
- 102messageSố dư nguồn thẻ không đủ, vui lòng báo admin nạp thêmNguyên nhân và cách xử lýNguồn nạp tạm hết số dư; thử lại sau hoặc liên hệ hỗ trợ.
- 102messageGiao dich khong the huyNguyên nhân và cách xử lýĐơn đã hoàn tất, thất bại hoặc đã huỷ nên không huỷ được.
- 102messageLOI HE THONG, VUI LONG THU LAI SAUNguyên nhân và cách xử lýLỗi phía hệ thống khi tạo đơn; tiền không bị trừ. Thử lại sau với cùng request_id.
- 103messageKhong Tin Thay GDNguyên nhân và cách xử lýKhông có đơn nào của tài khoản với request_id và order_code này.
- 104messagemerchant_not_existed_or_offNguyên nhân và cách xử lýThiếu tham số bắt buộc của lệnh, hoặc thân yêu cầu không phải JSON hợp lệ.
- 104messageCOMMAND KHÔNG HỢP LỆNguyên nhân và cách xử lýcommand không thuộc danh sách lệnh hỗ trợ.
- 105messageITEM KHONG TON TAINguyên nhân và cách xử lýservice_code không tồn tại hoặc sản phẩm đang tắt.
- 114messageĐịa chỉ IP không được phép, vui lòng gửi IP này cho adminNguyên nhân và cách xử lýIP gọi API không nằm trong danh sách Địa chỉ IP của kết nối. Thông báo kèm IP hệ thống nhận được.
Thử bằng key sandbox
Dùng key sandbox (Partner ID bắt đầu bằng sandbox_) với đúng URL này. Sản phẩm, mệnh giá, tài khoản và giá vẫn kiểm tra trên danh mục thật; kết quả chọn bằng đuôi request_id, đọc từ dấu _ cuối cùng, không phân biệt hoa thường.
- (không có)Kết quảThành công ngay (status success, đơn completed), trừ tiền thử
- _pendingKết quảĐơn pending, vài giây sau thành completed, trừ tiền thử
- _processingKết quảĐơn processing (đã gửi nhà cung cấp, không huỷ được), sau đó completed
- _failedKết quảĐơn pending, vài giây sau thành failed và hoàn tiền thử
- _canceledKết quảĐơn pending, vài giây sau thành canceled và hoàn tiền thử
- _stuckKết quảĐơn pending mãi, chỉ đổi khi huỷ bằng canceltopup hoặc đặt kết quả tay
- _rejectedKết quảTrả lỗi 102 (LOI HE THONG), tiền thử trừ rồi hoàn ngay
- _providerbalanceKết quảTrả lỗi 102 nguồn thẻ không đủ, không trừ tiền
- _maintenanceKết quảTrả lỗi 107 dịch vụ bảo trì, không trừ tiền
- _lockedKết quảTrả lỗi 100 tài khoản bị khoá, không trừ tiền
- _walletlockedKết quảTrả lỗi 100 ví bị khoá, không trừ tiền
Code mẫu#
Hàm mẫu tự tính chữ ký theo từng lệnh rồi gửi yêu cầu; ví dụ tạo đơn cước/game rồi tra trạng thái. Tab cURL gửi lệnh topup.
PARTNER_ID='YOUR_PARTNER_ID' PARTNER_KEY='YOUR_PARTNER_KEY' REQUEST_ID='TOPUP20261024001' SIGN=$(printf '%s' "${PARTNER_KEY}${PARTNER_ID}topup${REQUEST_ID}" | md5sum | cut -d ' ' -f 1) curl -X POST 'https://thepay1s.com/api/rechargews' \ -H 'Content-Type: application/json' \ --data-binary @- <<JSON { "command": "topup", "partner_id": "$PARTNER_ID", "request_id": "$REQUEST_ID", "service_code": "VIETTEL", "amount": 100000, "account_info": { "phone": "0987654321" }, "qty": 1, "sign": "$SIGN" } JSON