Các bước thực hiện
1 KH soạn tin nhắn theo cú pháp NAPxxx MaCP MaGame TaikhoangameKH gửi đến 9505
2 mPay9505 phân tích cú pháp, nếu đúng cú pháp sẽ chuyển sang bước tiếp theo, nếu sai cú pháp mPay9505 sẽ trả thông báo tương ứng cho KH
3 mPay9505 gọi API của CPđể check account game của KH.
4 CPcheck account game của KH trong hệ thống, kết quả trả về cho mPay9505
5 mPay9505 căn cứ vào kết quả do CPtrả về.
•Nếu account game không đúng: mPay9505 sẽ trả thông báo cho KH
•Nếu account game là hợp lệ: mPay9505 sẽ tiến hành trừ cước tài khoản điện thoại của KH
Nếu trừ cước không thành công, mPay9505 sẽ thông báo cho KH
Nếu trừ cước thành công: mPay sẽ báo kết quả sang Merchant, đồng thời gửi thông báo cho KH
Api CPcần xây dựng
- CP cần xây dựng API này để cổng mPay9505 gọi sau khi giao dịch thanh toán của KH thành công
- Hình thức kết nối qua giao thức HTTP, phương thức GET
- Địa chỉ API có dạng:
http://cpdomain/recivechangingresult?requestId={0}&cpCode={1}&gameCode={2}&totalAmount={3}&account={4}&provider={5}&channel={6}&isdn={7}&requestTime={8}&resultCode={9}&accessKey={10}&signature={11}
Tham số đầu vào:
STT
|
Tên tham số
|
Kiểu dữ liệu
|
Mô tả
|
1
|
requestId
|
String(50)
|
Mã giao dịch do MPAY trả về
|
2
|
cpCode
|
String(5)
|
Mã CP, mã này được mPay cấp cho CP, CP có thể vào CMS để xem
|
3
|
gameCode
|
String(3)
|
Mã game, mã này được mPay cấp cho CP, CP có thể vào CMS để xem
|
4
|
totalAmount
|
Int
|
Số tiền nạp, ví dụ: 10000, 20000, …
|
5
|
account
|
String(30)
|
Tài khoản game của KH
|
6
|
provider
|
String(10)
|
Nhà mạng (VIETTEL, MOBI)
|
7
|
channel
|
String(10)
|
Kênh giao dịch(SMS, OTP)
|
8
|
isdn
|
String(15)
|
Số điện thoại, ví dụ: 098123123, …
|
9
|
requestTime
|
String(19)
|
Thời gian gửi giao dịch định dạng yyyy-MM-dd HH:mm:ss
|
10
|
resultCode
|
String(2)
|
Kết quả giao dịch với resultCode=”00” là thành công
|
11
|
accessKey
|
String(50)
|
Khóa truy cập CP api, CP phải check mã này trước khi check chữ ký(signature). Khóa này được mPay cấp cho CP, CP có thể vào CMS để xem
|
12
|
signature
|
String
|
Chữ ký điện tử dùng để xác thực dữ liệu giữa MPAY và CP, thuật toán mã hóa là
HMACSHA256
Cách sinh chữ ký:
plaintext="requestId={0}&cpCode={1}&gameCode={2}&totalAmount={3}
&account={4}&provider={5}&channel={6}&isdn={7}&
requestTime={8}&resultCode={9}&accessKey={10}"
Ví dụ:
plaintext =
"requestId=T123456&cpCode=CPC1&gameCode=GC&totalAmount=10000&
account=doladola&provider=VIETTEL&channel=SMS&isdn=0988888888&
requestTime=2017-03-03 00:00:00&resultCode=00&accessKey= abcdef12345ghijklmn";
signature = HMACSHA256(plaintext, secretKey)
- secretKey được mPay cấp cho CP, CP có thể vào CMS để xem
|
Kết quả trả về
Kết quả trả về theo format sau: resultCode|Text_mo_ta
STT
|
Tên tham số
|
Kiểu dữ liệu
|
Mô tả
|
1
|
resultCode
|
String(2)
|
Mã lỗi: “00” là thành công, khác “00” là lỗi
|
2
|
Text_mo_ta
|
String(200)
|
Text mô tả ngắn cho resultCode
|
Lưu ý:
-Thời gian timeout cho lệnh gọi API này là 15s
-Trường hợp lỗi mạng, mPay không gọi được API này của CP để báo kết quả giao dịch, mPay sẽ retry lệnh gọi, tối đa 3 lần, mỗi lệnh gọi cách nhau 1 phút.
-Do đó CP cần check requestId trong lệnh gọi, nếu requestId đã được update trong hệ thống của CP thì CP cần có xử lý thích hợp, tránh double giao dịch cho KH
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace Test
{
public class HmacSha256
{
public string hash(string data, string secretKey)
{
var byteKey = Encoding.UTF8.GetBytes(secretKey);
var byteData = Encoding.UTF8.GetBytes(data);
HMACSHA256 hmacSHA256 = new HMACSHA256(byteKey);
var hashDataByte = hmacSHA256.ComputeHash(byteData);
var encrypted = this.ByteToString(hashDataByte);
return encrypted.ToLower();
}
private string ByteToString(byte[] buff)
{
string sbinary = "";
for (int i = 0; i < buff.Length; i++)
{
sbinary += buff[i].ToString("X2"); // hex format
}
return (sbinary);
}
}
}
private function getData()
{
$plainText = $this->cpCode . "|" . $this->requestId . "|" . $this->gameCode . "|" . $this->returnUrl . "|" . $this->account . "|" . $this->accessKey;
$signature = hash_hmac("sha256", $plainText, $this->secretKey);
$plainText = $plainText . "|" . $signature;
$strBase64Encode = base64_encode($plainText);
return $strBase64Encode;
}