1Pay

Scratch Card Charging


Các bước thực hiện

1 End User gửi thông tin thẻ cào đến Merchant

2 Merchant thực hiện redirect đến 1Pay

3 1Pay xử lý và trả kết quả cho Merchant

4 Đối với các thẻ lỗi (hoặc không nhận được kết quả giao dịch), merchant gọi request đến 1Pay

5 1Pay xử lý và trả kết quả cho Merchant

6 Merchant trả kết quả cho End User

I. Gửi thông tin và thực hiện giao dịch thẻ với 1Pay (Topup Api)

Địa chỉ nhận Request Charging:

POST  https://api.1pay.vn/card-charging/v5/topup

Giao thức truyền dữ liệu: HTTP/HTTPS POST
Max request time out: 30 giây

Tham số Mô tả
access_key Đại diện cho sản phẩm của Merchant khai báo trong hệ thống 1pay.vn
type Loại thẻ, nhận một trong các giá trị: viettel, mobifone, vinaphone, gate, vcoin, zing (*), vnmobile (*)
pin Mã pin của thẻ
serial Mã serial của thẻ
transRef Chuỗi duy nhất do merchant sinh ra để đăng ký một giao dịch.
signature Chữ ký, merchant có thể sử dụng signature để kiểm soát an ninh.
Signature là một chuỗi string: access_key=$access_key&pin=$pin&serial=$serial&transRef=$transRef&type=$type được hmac bằng thuật toán SHA256

(*) Lưu ý: Riêng thẻ zing và vnmobile có chu kỳ thanh toán dài hơn.

Response

Trong trường hợp kiểm tra chữ ký không hợp lệ, hệ thống sẽ trả về trạng thái http 403 Forbidden. Nếu tham số không hợp lệ (thiếu tham số, hoặc độ dài tham số không phù hợp), hệ thống sẽ trả về trạng thái http 400 Bad request.

{"transId":"mã giao dịch do 1pay cung cấp","transRef":"[mã giao dịch do merchant đăng ký]", "serial":"[số serial]", "status": "[mã trạng thái]", "amount":"[giá trị giao dịch]", "description":"[mô tả trạng thái giao dịch]"}

II.Đăng ký nhận trạng thái thẻ trễ (dành cho thẻ lỗi).

URL nhận thẻ trễ (Là URL mà Merchant dùng để đón nhận trạng thái thẻ lỗi đã được xử lý từ phía 1Pay).

Merchant cần xây dựng webservice xử lý do hệ thống 1Pay gửi sang sẽ ở dạng HTTP GET, với các tham số như sau:

Tham số Mô tả
amount Giá trị thẻ nạp.
type Loại thẻ, Là 1 trong các loại thẻ: viettel, mobifone, vinaphone, gate, vcoin, zing, vnmobile
request_time Thời gian user nạp thẻ, ở dạng iso, ví dụ: 2015-10-02T15:43:50Z.
serial Mã serial của thẻ
status Trạng thái xử lý, nhận giá trị: 1 – Thành công; 0 – Thất bại.
trans_ref Mã của giao dịch(là trans_ref của giao dịch ở trên trang tra cứu sản lượng).
trans_id Mã giao dịch do 1pay cung cấp ở bước I.

III. Truy vấn lại kiểm tra kết quả giao dịch (Query Api)

Địa chỉ nhận Request Charging:

POST  https://api.1pay.vn/card-charging/v5/query

Tham số Mô tả
access_key Đại diện cho sản phẩm của merchant khai báo trong hệ thống 1pay.vn
type Loại thẻ, nhận một trong các giá trị: viettel, mobifone, vinaphone, gate, vcoin, zing, vnmobile
pin Mã pin của thẻ
serial Mã serial của thẻ
transId Mã số giao dịch nhận được từ 1Pay khi thực hiện api nạp thẻ cào (Nếu giao dịch không nhận được kết quả trả về sau 30s (time out), gán giá trị rỗng cho tham số transId để check lại giao dịch)
transRef Mã số giao dịch nhận duy nhất do merchant sinh ra ở bước 1 (Topup Api)
signature Chữ ký, là một chuỗi string:
access_key=$access_key&pin=$pin&serial=$serial&transId=$transId&transRef=$transRef&type=$type được hmac bằng thuật toán SHA256

Response trả về có dạng json

{"transId":"mã giao dịch do 1pay cung cấp", "transRef":"[mã giao dịch do merchant đăng ký]","serial":"[số serial]", "status": "[mã trạng thái]", "amount":"[giá trị giao dịch]", "description":"[mô tả trạng thái giao dịch]"}

Trong đó:

Mã trạng thái Mô tả
00 Giao dịch thành công
01 Lỗi, địa chỉ IP truy cập API bị từ chối
02 Lỗi, tham số gửi từ merchant tới chưa chính xác (thường sai tên tham số hoặc thiếu tham số)
03 Lỗi, merchant không tồn tại hoặc merchant đang bị khóa kết nối.
04 Mật khẩu hoặc chữ ký xác thực không chính xác.
05 Trùng mã giao dịch (transRef).
06 Mã giao dịch không tồn tại hoặc sai định dạng.
07 Thẻ đã được sử dụng, hoặc thẻ sai.
08 Thẻ bị khóa
09 Thẻ hết hạn sử dụng.
10 Thẻ chưa được kích hoạt hoặc không tồn tại.
11 Mã thẻ sai định dạng.
12 Sai số serial của thẻ.
13 Mã thẻ và số serial không khớp.
14 Thẻ không tồn tại
15 Thẻ không sử dụng được.
16 Số lần thử (nhập sai liên tiếp) của thẻ vượt quá giới hạn cho phép
17 Hệ thống đơn vị phát hành (Telco) bị lỗi hoặc quá tải, thẻ chưa bị trừ.
18 Hệ thống đơn vị phát hành (Telco) bị lỗi hoặc quá tải, thẻ có thể bị trừ, cần phối hợp với 1pay để tra soát
19 Đơn vị phát hành không tồn tại
20 Đơn vị phát hành không hỗ trợ nghiệp vụ này
21 Không hỗ trợ loại card này
22 Kết nối tới hệ thống đơn vị phát hành (Telco) bị lỗi, thẻ chưa bị trừ (thường do lỗi kết nối với Telco, ví dụ sai tham số kết nối, mà không liên quan đến merchant).
23 Kết nối 1Pay tới hệ thống đơn vị cung cấp bị lỗi, thẻ chưa bị trừ.
99 Lỗi, tuy nhiên lỗi chưa được định nghĩa hoặc chưa xác định được nguyên nhân

Giá trị giao dịch nhận các giá trị: 0 trong trường hợp có lỗi xảy ra, hoặc nhận giá trị là mệnh giá thẻ nếu thành công.

Địa chỉ nhận Request Charging:

POST  https://api.1pay.vn/card-charging/v2/topup

Giao thức truyền dữ liệu: HTTP/HTTPS POST
Max request time out: 30 seconds

Tham số Mô tả
access_key Đại diện cho sản phẩm của merchant khai báo trong hệ thống 1pay.vn
type Loại thẻ, nhận một trong các giá trị: viettel, mobifone, vinaphone, gate, vcoin, zing (*), vnmobile (*)
pin Mã pin của thẻ
serial Mã serial của thẻ
signature Chữ ký, merchant có thể sử dụng signature để kiểm soát an ninh
Signature là một chuỗi string: access_key=$access_key&pin=$pin&serial=$serial& type=$type được hmac bằng thuật toán SHA256

(*) Lưu ý: Riêng thẻ zing và vnmobile có chu kỳ thanh toán dài hơn.

Response

Trong trường hợp kiểm tra chữ ký không hợp lệ, hệ thống sẽ trả về trạng thái http 403 Forbidden. Nếu tham số không hợp lệ (thiếu tham số, hoặc độ dài tham số không phù hợp), hệ thống sẽ trả về trạng thái http 400 Bad request.

{"status": "[mã trạng thái]", "amount":"[Giá trị giao dịch]", "description":"[mô tả trạng thái giao dịch]"}

Trong đó:

Mã trạng thái Mô tả
00 Giao dịch thành công
01 Lỗi, địa chỉ IP truy cập API bị từ chối
02 Lỗi, tham số gửi từ merchant tới chưa chính xác (thường sai tên tham số hoặc thiếu tham số)
03 Lỗi, merchant không tồn tại hoặc merchant đang bị khóa kết nối.
04 Mật khẩu hoặc chữ ký xác thực không chính xác.
05 Trùng mã giao dịch (transRef).
06 Mã giao dịch không tồn tại hoặc sai định dạng.
07 Thẻ đã được sử dụng, hoặc thẻ sai.
08 Thẻ bị khóa
09 Thẻ hết hạn sử dụng.
10 Thẻ chưa được kích hoạt hoặc không tồn tại.
11 Mã thẻ sai định dạng.
12 Sai số serial của thẻ.
13 Mã thẻ và số serial không khớp.
14 Thẻ không tồn tại
15 Thẻ không sử dụng được.
16 Số lần thử (nhập sai liên tiếp) của thẻ vượt quá giới hạn cho phép
17 Hệ thống đơn vị phát hành (Telco) bị lỗi hoặc quá tải, thẻ chưa bị trừ.
18 Hệ thống đơn vị phát hành (Telco) bị lỗi hoặc quá tải, thẻ có thể bị trừ, cần phối hợp với 1pay để tra soát
19 Đơn vị phát hành không tồn tại
20 Đơn vị phát hành không hỗ trợ nghiệp vụ này
21 Không hỗ trợ loại card này
22 Kết nối tới hệ thống đơn vị phát hành (Telco) bị lỗi, thẻ chưa bị trừ (thường do lỗi kết nối với Telco, ví dụ sai tham số kết nối, mà không liên quan đến merchant).
23 Kết nối 1Pay tới hệ thống đơn vị cung cấp bị lỗi, thẻ chưa bị trừ.
99 Lỗi, tuy nhiên lỗi chưa được định nghĩa hoặc chưa xác định được nguyên nhân

Giá trị giao dịch nhận các giá trị: 0 trong trường hợp có lỗi xảy ra, hoặc nhận giá trị là mệnh giá thẻ nếu thành công

Lên đầu trang

Ver 5



import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.net.ssl.HttpsURLConnection;

public class CodeFormatter {
 private final String USER_AGENT = "Mozilla/5.0";

 public static void main(String[] args) throws Exception {
  CodeFormatter http = new CodeFormatter();
  System.out.println("\nTesting 5 - Send Http POST request");
//      http.sendPost(access_key, type, pin, serial, transRef);   // thay cac gia tri tuong ung vao

 }

 private void sendPost(String access_key, String type, String pin,
   String serial, String transRef) throws Exception {
  String url = "https://api.1pay.vn/card-charging/v5/topup";
  String secretKey = ""; //secret key do 1 pay cung cap
  String signature = generateSignature(access_key, type, pin, serial, transRef, secretKey);
  URL obj = new URL(url);
  HttpURLConnection con = (HttpURLConnection) obj.openConnection();
  con.setRequestMethod("POST");
  con.setRequestProperty("User-Agent", USER_AGENT);
  con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
  String urlParameters = "access_key=%access_key%&type=%type%&pin=%pin%&serial=%serial%&transRef=%transRef%&signature=%signature%";
  urlParameters = urlParameters.replaceFirst("%access_key%", access_key); //access key do 1 pay cung cap
  urlParameters = urlParameters.replaceFirst("%type%", type);
  urlParameters = urlParameters.replaceFirst("%pin%", pin);
  urlParameters = urlParameters.replaceFirst("%serial%", serial);
  urlParameters = urlParameters.replaceFirst("%transRef%", transRef); //Mã giao dịch do MC tự sinh
  urlParameters = urlParameters.replaceFirst("%signature%", signature);

  con.setDoOutput(true);
  DataOutputStream wr = new DataOutputStream(con.getOutputStream());
  wr.writeBytes(urlParameters);
  wr.flush();
  wr.close();

  int responseCode = con.getResponseCode();
  System.out.println("URL : " + url);
  System.out.println("Parameters : " + urlParameters);
  System.out.println("Response Code : " + responseCode);
  BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8"));
  String inputLine;
  StringBuffer response = new StringBuffer();
  while ((inputLine = in.readLine()) != null) {
   response.append(inputLine);
  }
  in.close();
  String json = response.toString();
  System.out.println(json);  
 }

 public String generateSignature(String access_key, String type, String pin,
   String serial, String transRef, String secret) {
  String urlParameters = "";
  String signature = "";
  if ((access_key != null) && (type != null) && (pin != null)
    && (serial != null) && (transRef != null)) {
   urlParameters = "access_key=%access_key%&pin=%pin%&serial=%serial%&transRef=%transRef%&type=%type%";
   urlParameters = urlParameters.replaceFirst("%access_key%", access_key);
   urlParameters = urlParameters.replaceFirst("%type%", type);
   urlParameters = urlParameters.replaceFirst("%pin%", pin);
   urlParameters = urlParameters.replaceFirst("%serial%", serial);
   urlParameters = urlParameters.replaceFirst("%transRef%", transRef);
   signature = hmacDigest(urlParameters, secret, "HmacSHA256");
   System.out.println("Signature:" + signature);
  }
  return signature;
 }

 public static String hmacDigest(String msg, String keyString, String algo) {
  String digest = "";
  try {
   if (keyString != null && keyString.length() > 0) {
    SecretKeySpec key = new SecretKeySpec(
      (keyString).getBytes("UTF-8"), algo);
    Mac mac = Mac.getInstance(algo);
    mac.init(key);
    byte[] bytes = mac.doFinal(msg.getBytes("ASCII"));
    StringBuffer hash = new StringBuffer();
    for (int i = 0; i < bytes.length; i++) {
     String hex = Integer.toHexString(0xFF & bytes[i]);
     if (hex.length() == 1) {
      hash.append('0');
     }
     hash.append(hex);
    }
    digest = hash.toString();
   }
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (NoSuchAlgorithmException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InvalidKeyException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return digest;
 }
}
		

  File formCard.html


<form method="post" action="./card1pay_v5.php" id="form">
<table width="100%" border="0" cellpadding="3" cellspacing="3">
	<tr>
    	<td colspan="2" align="center">
        	<h2>Nạp thẻ điện thoại</h2>
        </td>
        
    </tr>
    <tr>
    	<td align="right" width="40%">
        	Nhà Mạng :
        </td>
        <td>
        	<select id="lstTelco" name="lstTelco">
                    <option value="viettel">Viettel</option>
                    <option value="mobifone">MobiFone</option>
                    <option value="vinaphone">Vinaphone</option>
                    <option value="gate">Gate</option>
                    <option value="vcoin">Vcoin</option>
                    <option value="zing">Zing</option>
                    <option value="bit">Bit</option>
                    <option value="vnmobile">vietnamobile</option>
                </select>
        </td>
    </tr>
    <tr>
    	
    	<td align="right">
        	Số Seri :
        </td>
        <td>
        	<input type="text" id="txtSeri" name="txtSeri" />
        </td>
    </tr>
    <tr><td align="right">
        	Mã số :
        </td>
        <td>
        	<input type="text" id="txtCode" name="txtCode" />
        </td>
    </tr>
     <tr>
    	<td align="right">
        	
        </td>
        <td>
        	<input type="submit" value="Nạp thẻ" />
        </td>
    </tr>
</table>
</form>
            

  File card1pay_v5.php


$transRef = ''; //merchant's transaction reference

$access_key = ''; //require your access key from 1pay
$secret = ''; //require your secret key from 1pay
$type = $_POST["lstTelco"]; 
$pin = $_POST["txtCode"];
$serial = $_POST["txtSeri"]; 
$data = "access_key=" . $access_key . "&pin=" . $pin . "&serial=" . $serial . "&transRef=" . $transRef . "&type=" . $type;
$signature = hash_hmac("sha256", $data, $secret);
$data.= "&signature=" . $signature;

//function POST
function execPostRequest($url, $data)
{

 // open connection
 $ch = curl_init();

 // set the url, number of POST vars, POST data
 curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,0); 
 curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
    curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

 // execute post
 $result = curl_exec($ch);

 // close connection
 curl_close($ch);
 return $result;
}

//do some thing
 $json_cardCharging = execPostRequest('https://api.1pay.vn/card-charging/v5/topup', $data);
 $decode_cardCharging=json_decode($json_cardCharging,true);  // decode json
 if (isset($decode_cardCharging)) {
 $description = $decode_cardCharging["description"];   // transaction description
 $status = $decode_cardCharging["status"];       
 $amount = $decode_cardCharging["amount"];       // card's amount
 $transId = $decode_cardCharging["transId"]; 
// xử lý dữ liệu của merchant
}
else {
// run query API's endpoint
    $data_ep = "access_key=" . $access_key . "&pin=" . $pin . "&serial=" . $serial . "&transId=&transRef=" . $transRef . "&type=" . $type;
    $signature_ep = hash_hmac("sha256", $data_ep, $secret);
    $data_ep.= "&signature=" . $signature_ep;
    $query_api_ep = execPostRequest('https://api.1pay.vn/card-charging/v5/query', $data_ep);
    $decode_cardCharging=json_decode($json_cardCharging,true);  // decode json
    $description_ep = $decode_cardCharging["description"];   // transaction description
    $status_ep = $decode_cardCharging["status"];    
    $amount_ep = $decode_cardCharging["amount"];       // card's amount
// Merchant handle SQL
}
            
  Download 1pay.dll

using System;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using _1Pay;

namespace CardCharging
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            String result = "";
            String access_key = "";
            String secret_key = "";
            String type = "";
            String pin = "";
            String serial = "";
            String transRef = ""; //do merchant sinh ra để đăng ký một giao dịch
            result = sendPost(access_key, secret_key,type,pin,serial,transRef);
        }

        public String sendPost(String access_key, String secret_key, String type, String pin, String serial, String transRef)
        {
            String result = "";
            String url = "https://api.1pay.vn/card-charging/v5/topup";
            My1Pay my1Pay = new My1Pay();
            String signature = my1Pay.generateSignature_Card_V5_TopupApi(access_key, pin, serial, transRef, type, secret_key); //create signature
            String urlParameter = String.Format("access_key={0}&type={1}&pin={2}&serial={3}&signature={4}&transRef={5}",access_key, type,pin,serial,signature,transRef);
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.KeepAlive = false;
                request.ProtocolVersion = HttpVersion.Version10;
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.UserAgent = "Mozilla/5.0";
                WebHeaderCollection headerReader = request.Headers; 
                headerReader.Add("Accept-Language", "en-US,en;q=0.5");
                var data = Encoding.ASCII.GetBytes(urlParameter);
                request.ContentLength = data.Length;
                Stream requestStream = request.GetRequestStream();
                // send url param
                requestStream.Write(data, 0, data.Length);
                requestStream.Close();
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                result = new StreamReader(response.GetResponseStream()).ReadToEnd();
                response.Close();
            }
            catch (Exception e)
            {
                result = e.GetBaseException().ToString();
            }
            return result;
        } 
    }
}
  Download hmac-sha256.cpp   Download http-post.cpp

//============================================================================
// Name        : CardCharging.cpp
// Description : C++, Ansi-style
//============================================================================

#include <iostream>
#include "hmac-sha256.cpp"
#include "http-post.cpp"
using namespace std;

int main() {
	string serial=""; 
	string type=""; 
	string pin = ""; 
	string access_key=""; // require your access key from 1pay
	string secret_key=""; // require your secret key from 1pay 
	string transRef=""; 
	string data="access_key="+access_key+"&pin="+pin+"&serial="+serial+"&transRef="+transRef+"&type="+type;
	string signature= hmac(secret_key,data);    
	cout <<signature<<endl;
	data = data + "&signature=" + signature; 
	cout <<data<<endl;
	string response =  sendHttpRequest("https://api.1pay.vn/card-charging/v5/topup", data);
	return 0;
}
		





Ver 2



import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.net.ssl.HttpsURLConnection;

public class HttpURLConnectionExample {
 private final String USER_AGENT = "Mozilla/5.0";

 public static void main(String[] args) throws Exception {
  HttpURLConnectionExample http = new HttpURLConnectionExample();
  System.out.println("\nTesting 2 - Send Http POST request");
  // http.sendPost(access_key, type, pin, serial, signature);
  // thay cac gia tri tuong ung vao
 }

 // HTTP POST request
 private void sendPost(String access_key, String type, String pin,
   String serial) throws Exception {
  String url = "https://api.1pay.vn/card-charging/v2/topup";
  URL obj = new URL(url);
  HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
  // add request header
  con.setRequestMethod("POST");
  con.setRequestProperty("User-Agent", USER_AGENT);
  con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
  String urlParameters = "access_key=%access_key%&pin=%pin%&serial=%serial%"
    + "&type=%type%&signature=%signature%";
  urlParameters = urlParameters.replaceFirst("%access_key%",  access_key);
  urlParameters = urlParameters.replaceFirst("%type%",   type);
  urlParameters = urlParameters.replaceFirst("%pin%",   pin);
  urlParameters = urlParameters.replaceFirst("%serial%",   serial);
  String secretKey = "";
  // secret_key cua san pham do 1Pay cung cap
  String signature = generateSignature(access_key, pin, serial, type, secretKey);
  // access_key va secretKey do 1pay cung cap
  urlParameters = urlParameters.replaceFirst("%signature%", signature);
  // Send post request
  con.setDoOutput(true);
  DataOutputStream wr = new DataOutputStream(con.getOutputStream());
  wr.writeBytes(urlParameters);
  wr.flush();
  wr.close();
  int responseCode = con.getResponseCode();
  System.out.println("\nSending 'POST' request to URL : " + url);
  System.out.println("Post parameters : " + urlParameters);
  System.out.println("Response Code : " + responseCode);
  BufferedReader in = new BufferedReader(new InputStreamReader(
    con.getInputStream()));
  String inputLine;
  StringBuffer response = new StringBuffer();
  while ((inputLine = in.readLine()) != null) {
   response.append(inputLine);
  }
  in.close();
  // print result
  System.out.println(response.toString());
 }

 public String generateSignature(String access_key, String pin,
   String serial, String type, String secret) {
  String urlParameters = "";
  String signature = "";
  if ((access_key != null) && (pin != null) && (serial != null)
    && (type != null) && (secret != null)) {
   urlParameters = "access_key=%access_key%&pin=%pin%&serial=%serial%&type=%type%";
   urlParameters = urlParameters.replaceFirst("%access_key%",  access_key);
   urlParameters = urlParameters.replaceFirst("%pin%",   pin);
   urlParameters = urlParameters.replaceFirst("%serial%",   serial);
   urlParameters = urlParameters.replaceFirst("%type%",   type);
   signature = hmacDigest(urlParameters, secret, "HmacSHA256");
  }
  return signature;
 }

 public static String hmacDigest(String msg, String keyString, String algo) {
  String digest = "";
  try {
   if (keyString != null && keyString.length() > 0) {
    SecretKeySpec key = new SecretKeySpec(
      (keyString).getBytes("UTF-8"), algo);
    Mac mac = Mac.getInstance(algo);
    mac.init(key);
    byte[] bytes = mac.doFinal(msg.getBytes("ASCII"));
    StringBuffer hash = new StringBuffer();
    for (int i = 0; i < bytes.length; i++) {
     String hex = Integer.toHexString(0xFF & bytes[i]);
     if (hex.length() == 1) {
      hash.append('0');
     }
     hash.append(hex);
    }
    digest = hash.toString();
   }
  } catch (UnsupportedEncodingException e) {
  } catch (InvalidKeyException e) {
  } catch (NoSuchAlgorithmException e) {
  }
  return digest;
 }

}
            

$access_key = '';

// nhap gia tri nhu huong dan ben tren
$secret = '';
$type = '';
$pin = '';
$serial = '';
$data = "access_key=" . $access_key . "&pin=" . $pin . "&serial=" . $serial . "&type=" . $type;
$signature = hash_hmac("sha256", $data, $secret);
$data.= "&signature=" . $signature;
print_r(execPostRequest('https://api.1pay.vn/card-charging/v2/topup', $data));

function execPostRequest($url, $data)
{

 // open connection
 $ch = curl_init();

 // set the url, number of POST vars, POST data
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

 // execute post
 $result = curl_exec($ch);

 // close connection
 curl_close($ch);
 return $result;
}
		
  Download 1pay.dll

using System;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using _1Pay;

namespace CardCharging
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            String result = "";
            String access_key = "";
            String secret_key = "";
            String type = "";
            String pin = "";
            String serial = "";
            result = sendPost(access_key, secret_key,type,pin,serial);
        }

        public String sendPost(String access_key, String secret_key, String type, String pin, String serial)
        {
            String result = "";
            String url = "https://api.1pay.vn/card-charging/v2/topup";
            My1Pay my1Pay = new My1Pay();
            String signature = my1Pay.generateSignature_Card(access_key, pin, serial, type, secret_key); //create signature
            String urlParameter = String.Format("access_key={0}&type={1}&pin={2}&serial={3}&signature={4}",access_key, type,pin,serial,signature);
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.KeepAlive = false;
                request.ProtocolVersion = HttpVersion.Version10;
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.UserAgent = "Mozilla/5.0";
                WebHeaderCollection headerReader = request.Headers; 
                headerReader.Add("Accept-Language", "en-US,en;q=0.5");
                var data = Encoding.ASCII.GetBytes(urlParameter);
                request.ContentLength = data.Length;
                Stream requestStream = request.GetRequestStream();
                // send url param
                requestStream.Write(data, 0, data.Length);
                requestStream.Close();
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                result = new StreamReader(response.GetResponseStream()).ReadToEnd();
                response.Close();
            }
            catch (Exception e)
            {
                result = e.GetBaseException().ToString();
            }
            return result;
        } 
    }
}	
		
  Download hmac-sha256.cpp   Download http-post.cpp

//============================================================================
// Name        : CardCharging.cpp
// Description : C++, Ansi-style
//============================================================================

#include <iostream>
#include "hmac-sha256.cpp"
#include "http-post.cpp"
using namespace std;

int main() {

    string serial=""; // Ma so serial cua the
 string type=""; // loai the
 string pin = ""; // Ma pin cua the
 string access_key=""; // ma access_key cua dich vu
 string secret_key=""; // ma secret_key cua dich vu 
 string data="access_key="+access_key+"&pin="+pin+"&serial="+serial+"&type="+type;
 string signature= hmac(secret_key,data);  // chu ky xac thuc duoc tao ra
   
 cout <<signature<<endl;
 data = data + "&signature=" + signature; 
 cout <<data<<endl;

    string response =  sendHttpRequest("https://api.1pay.vn/card-charging/v2/topup", data);
 return 0;
}
		

Result