คุณกำลังหาวิธีสร้างระบบชำระเงิน QR Code (PromptPay) อยู่หรือป่าว บทความนี้จะมาแนะนำวิธีการทำระบบชำระเงิน PromptPay ด้วย Payment Gayway ที่ชื่อว่า GBPrimePay ซึ่งก็รองรับการชำระเงินหลากหลายรูปแบบเช่น PromptPay , TrueWallet, ShopeePay, LinePay, บัตรเครดิต และอื่นๆอีกเยอะ ลองเข้าได้ดูรายละเอียดที่เว็บ GBPrimePay ได้เลย
โค้ดตัวอย่าง
gbprimepay.php
ไฟล์นี้ผมได้เขียนเป็น class เอาไว้และมีฟังชั่นของ truewallet, linepay และ shopeepay อยู่ด้วย แต่บทความนี้จะเน้นไปที่ฟังชั่น promptpay เท่านั้น อาจจะมีตัวอย่างการใช้ของ ฟังชั่นอื่นๆให้ดู
<?phpclass 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 ส่งข้อมูลมาให้เรา
<?phprequire_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 โหมดให้เลือก
- ส่งคืนเป็นรูป
- ส่งคืนเป็นข้อมูลให้ไปสร้าง 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;