767 words
4 minutes
สร้าง QR Code พร้อมเพย์ รับชำระเงินอัตโนมัติ ทุกธนาคาร

คุณกำลังหาวิธีสร้างระบบชำระเงิน QR Code (PromptPay) อยู่หรือป่าว บทความนี้จะมาแนะนำวิธีการทำระบบชำระเงิน PromptPay ด้วย Payment Gayway ที่ชื่อว่า GBPrimePay ซึ่งก็รองรับการชำระเงินหลากหลายรูปแบบเช่น PromptPay , TrueWallet, ShopeePay, LinePay, บัตรเครดิต และอื่นๆอีกเยอะ ลองเข้าได้ดูรายละเอียดที่เว็บ GBPrimePay ได้เลย

โค้ดตัวอย่าง#

gbprimepay.php

ไฟล์นี้ผมได้เขียนเป็น class เอาไว้และมีฟังชั่นของ truewallet, linepay และ shopeepay อยู่ด้วย แต่บทความนี้จะเน้นไปที่ฟังชั่น promptpay เท่านั้น อาจจะมีตัวอย่างการใช้ของ ฟังชั่นอื่นๆให้ดู

<?php
class GBPrimePay
{
private string $url;
private string $token;
private string $public_key;
private string $secret_key;
private bool $isToken = true;
/**
* Documents
* https://doc.gbprimepay.com/
* @param env
*/
public function __construct(string $env = 'production')
{
if ($env == 'production') {
$this->url = 'https://api.gbprimepay.com';
} else {
$this->url = 'https://api.globalprimepay.com';
}
}
public function parse_data(array $data)
{
$fields = '';
$index = 0;
foreach ($data as $key => $value) {
$index += 1;
$fields .= $key . '=' . urlencode($value);
if ($index != count($data)) {
$fields .= '&';
}
}
if ($this->isToken) {
$fields .= '&token=' . urlencode($this->token);
} else {
$fields .= '&publicKey=' . $this->public_key;
$concatstring = $data['amount'] . $data['referenceNo'] . $data['responseUrl'] . $data['backgroundUrl'];
$checksum = hash_hmac('sha256', $concatstring, $this->secret_key, false);
$fields .= '&checksum=' . $checksum;
}
return $fields;
}
public function request(string $path, array $data)
{
$fields = $this->parse_data($data);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $this->url . '' . $path,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $fields,
CURLOPT_HTTPHEADER => array(
'Content-Type: application/x-www-form-urlencoded'
),
));
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
/**
* Documents
* https://doc.gbprimepay.com/qrcash
* @param mode qrcode or text
*/
public function promptpay(array $data, string $token, string $mode = 'qrcode')
{
$this->isToken = true;
$this->token = $token;
if ($mode == 'qrcode') {
$path = '/v3/qrcode';
} else {
$path = '/v3/qrcode/text';
}
$response = $this->request($path, $data);
if ($mode == 'qrcode') {
return 'data:image/png;base64,' . base64_encode($response);
} else {
return $response;
}
}
/**
* Documents
* https://doc.gbprimepay.com/truewallet
*/
public function truewallet(array $data, string $public_key, string $secret_key)
{
$this->isToken = false;
$this->public_key = $public_key;
$this->secret_key = $secret_key;
$response = $this->request('/v2/trueWallet', $data);
return $response;
}
/**
* Documents
* https://doc.gbprimepay.com/linepay
*/
public function linepay(array $data, string $public_key, string $secret_key)
{
$this->isToken = false;
$this->public_key = $public_key;
$this->secret_key = $secret_key;
$response = $this->request('/v2/linepay', $data);
return $response;
}
/**
* Documents
* https://doc.gbprimepay.com/shopeepay
*/
public function shopeepay(array $data, string $public_key, string $secret_key)
{
$this->isToken = false;
$this->public_key = $public_key;
$this->secret_key = $secret_key;
$response = $this->request('/v1/shopeePay', $data);
return $response;
}
}

gbprimepay.webhook.php

ไฟล์นี้เป็นไฟล์สำหรับ webhook รอข้อมูลจาก GBPrimePay ส่งมาให้เราว่าการชำระเงินนั้นถูกต้องจริงๆ ในโค้ดตัวอย่างเป็นเพียงแค่การเก็บ Log เป็นไฟล์ text เท่านั้น ในการใช้งานจริงอาจจะต้องเขียนติดต่อกับฐานข้อมูลเพื่ออัพเดตข้อมูลการสั่งซื้อ

<?php
// ถ้าเป็น ip ของ GBPrimePay ถึงจะให้ทำงานโค้ดใน if
$white_list = [
'203.151.205.45',
'203.151.205.33',
'18.143.213.62',
'13.215.225.183',
'54.254.171.101',
'18.141.54.201',
'54.151.232.117',
'54.255.79.153'
];
if (in_array($_SERVER['REMOTE_ADDR'], $white_list)) {
$respFile = fopen("resp-log.json", "w") or die("Unable to open file!");
$json_str = file_get_contents('php://input');
fwrite($respFile, $json_str . "nn");
$json_obj = json_decode($json_str);
// $result = $db->query("SELECT user_id FROM topup WHERE refcode = '{$json_obj->referenceNo}'");
// $db->query("UPDATE users SET point = point + {$json_obj->amount} WHERE id = {$result->user_id}");
fwrite($respFile, $json_obj);
fclose($respFile);
} else {
die('Access Denied');
}

index.php

ไฟล์นี้จะเป็นตัวอย่างการเรียกใช้งาน class ของเรา ในตัวอย่างจะเรียกใช้ไฟล์ class และ new GBPrimePay() เพื่อเรียกใช้ class จากนั้นเรียกใช้ฟังชั่น promptpay และใส่ค่า array ถ้าอยากรู้ว่าใส่อะไรได้บ้างก็สามารถดูเอกสารของ GBPrimePay ได้เลย https://doc.gbprimepay.com/qrcash แต่ค่าที่จำเป็นต้องใส่ก็มีแค่ amount, referenceNo และ token ซึ่ง token เราจะไม่ใส่ลงไปใน array แต่จะใส่ใน param ของฟังชั่นแทน เดี๋ยวฟังชั่น promptpay จะไปจัดการให้เราเอง

ค่าที่ต้องใส่ก็คือ TOKEN สามารถไปเอาได้ที่หน้า Profile ของเว็บ GBPrimePay ได้เลย ทุกคนต้องสมัครและยืนเอกสารต่างๆที่ทางเว็บเขาขอมาก่อน จึงจะได้ token มาใช้งาน ส่วนค่า PUBLIC_KEY และ SECRET_KEY ในบทความนี้ไม่ได้ใช้เพราะฟังชั่น promtpay ไม่ได้ใช้ค่าเหล่านี้ เอาไว้ใช้กับ truewallet, linepay และ shopeepay

backgroundUrl คือ url สำหรับให้ GBPrimePay ส่งข้อมูลมาให้เรา

<?php
require_once 'gbprimepay.php';
$token = "TOKEN";
// $public_key = "PUBLIC_KEY";
// $secret_key = "SECRET_KEY";
$gbprimepay = new GBPrimePay();
$qrcode = $gbprimepay->promptpay([
'amount' => '10.00',
'referenceNo' => 'PP1234',
'backgroundUrl' => 'https://dev.0x01code.me/gbprimepay.webhook.php',
], $token);
echo '<img src="' . $qrcode . '">';
// echo $gbprimepay->truewallet([
// 'amount' => '10.00',
// 'referenceNo' => 'TW1234',
// 'backgroundUrl' => 'https://dev.0x01code.me/gbprimepay.webhook.php',
// 'responseUrl' => 'https://dev.0x01code.me/thankyou.php',
// 'customerTelephone' => '0600000000',
// ], $public_key, $secret_key);
// echo $gbprimepay->linepay([
// 'amount' => '10.00',
// 'referenceNo' => 'LP1234',
// 'detail' => 'test',
// 'responseUrl' => 'https://dev.0x01code.me/thankyou.php',
// 'backgroundUrl' => 'https://dev.0x01code.me/gbprimepay.webhook.php',
// ], $public_key, $secret_key);
// echo $gbprimepay->shopeepay([
// 'amount' => '10.00',
// 'referenceNo' => 'SP1234',
// 'responseUrl' => 'https://dev.0x01code.me/thankyou.php',
// 'backgroundUrl' => 'https://dev.0x01code.me/gbprimepay.webhook.php',
// ], $public_key, $secret_key);

ในฟังชั่น promptpay จะมี 2 โหมดให้เลือก

  1. ส่งคืนเป็นรูป
  2. ส่งคืนเป็นข้อมูลให้ไปสร้าง QR Code เอง

ตัวอย่างการส่งคืนเป็นรูป

โดยที่เราจะใส่ parameter ต่อจาก token ว่า qrcode (หรือจะไม่ใส่ก็ได้ระบบเลือกให้เองอยู่แล้ว) แล้วนำค่าที่ได้ไปแสดงผลใน tag img ตามตัวอย่าง

$gbprimepay = new GBPrimePay();
$qrcode = $gbprimepay->promptpay([
'amount' => '10.00',
'referenceNo' => 'PP1234',
'backgroundUrl' => 'https://dev.0x01code.me/gbprimepay.webhook.php',
], $token, 'text');
echo $qrcode;

ตัวอย่างการส่งคืนเป็นข้อมูลให้ไปสร้าง QR Code เอง

โดยที่เราจะใช้ parameter ตัวสุดท้ายเป็น text ตามตัวอย่าง เราก็ได้เป็นชุดข้อมูลยาวๆมา แล้วก็เอาไปสร้างเป็น QR Code เองได้เลย อาจจะลองเอาข้อมูลนี้ไปใส่ในเว็บ QR Code Generator ก็ได้เพื่อทดสอบ โหมดนี้เหมาะสำหรับคนที่อยากออกแบบ QR Code เอง

$gbprimepay = new GBPrimePay();
$qrcode = $gbprimepay->promptpay([
'amount' => '10.00',
'referenceNo' => 'PP1234',
'backgroundUrl' => 'https://dev.0x01code.me/gbprimepay.webhook.php',
], $token, 'text');
echo $qrcode;

วิดีโอสอน สร้าง QR Code รับชำระเงินอัตโนมัติ ทุกธนาคาร#

วิดีโอสอนทำ qr code เติมเงินแล้วเปลี่ยนหน้าเว็บไปยัง thank you แบบง่ายๆ#

สร้าง QR Code พร้อมเพย์ รับชำระเงินอัตโนมัติ ทุกธนาคาร
https://blog.0x01code.me/posts/create-payment-promptpay-with-gbprimepay/
Author
0x01code
Published at
2023-01-16
License
CC BY-NC-SA 4.0