File manager - Edit - /home/webapp69.cm.in.th/u69319090001/Shop 001/generate_promptpay_qr.php
Back
<?php /** * ไฟล์สร้าง QR Code PromptPay แบบไม่ต้องพึ่งไลบรารีภายนอก * ใช้ EMVCo QR Code สำหรับระบบ PromptPay ของประเทศไทย * อ้างอิง: https://www.bot.or.th/Thai/PaymentSystems/StandardPS/Documents/ThaiQRCode_Payment_Standard.pdf */ /** * สร้าง PromptPay QR Code Payload string ตามมาตรฐาน EMVCo * @param string $phoneOrId เบอร์โทรศัพท์ หรือเลขบัตรประชาชน (13 หลัก) * @param float|null $amount จำนวนเงิน (ถ้าไม่ระบุ ลูกค้าพิมพ์เองได้) * @return string payload string สำหรับสร้าง QR Code */ function generatePromptPayPayload(string $phoneOrId, ?float $amount = null): string { // ทำความสะอาดเบอร์โทร: ลบอักขระที่ไม่ใช่ตัวเลข $id = preg_replace('/[^0-9]/', '', $phoneOrId); // แปลงเบอร์โทรเป็นรูปแบบสากล (+66...) if (strlen($id) === 10 && $id[0] === '0') { $id = '0066' . substr($id, 1); } elseif (strlen($id) === 13) { // เลขบัตรประชาชน ใช้ได้ตรง } else { // ถ้าไม่ตรงรูปแบบให้ใช้ดิบ $id = '0066' . $id; } // Helper: สร้าง TLV (Tag Length Value) string $f = function(string $tag, string $val): string { return $tag . str_pad(strlen($val), 2, '0', STR_PAD_LEFT) . $val; }; // กำหนด GUID PromptPay สำหรับ Thailand $guid = 'A000000677010111'; // เบอร์โทร if (strlen(preg_replace('/[^0-9]/', '', $phoneOrId)) === 13) { $guid = 'A000000677010113'; // เลขบัตรประชาชน } $accountInfo = $f('00', $guid) . $f('01', $id); $payload = ''; $payload .= $f('00', '01'); // Payload Format Indicator $payload .= $f('01', '12'); // Point of Initiation (12 = dynamic if amount set, 11 = static) $payload .= $f('29', $accountInfo); // Merchant Account Info (PromptPay) $payload .= $f('52', '0000'); // Merchant Category Code $payload .= $f('53', '764'); // Transaction Currency (764 = THB) if ($amount !== null && $amount > 0) { $amountStr = number_format($amount, 2, '.', ''); $payload .= $f('54', $amountStr); // Transaction Amount // เปลี่ยน Point of Initiation เป็น dynamic (11=static, 12=dynamic) $payload = str_replace($f('01', '12'), $f('01', '12'), $payload); } else { // Static QR (ลูกค้าพิมพ์จำนวนเองได้) $payload = str_replace($f('01', '12'), $f('01', '11'), $payload); } $payload .= $f('58', 'TH'); // Country Code $payload .= $f('59', 'PromptPay'); // Merchant Name (max 25 chars) $payload .= $f('60', 'Bangkok'); // Merchant City // CRC16-CCITT checksum $payload .= '6304'; // CRC field header (will compute below) $payload .= crc16($payload); return $payload; } /** * คำนวณ CRC-16 CCITT (เหมือน EMVCo standard) */ function crc16(string $str): string { $crc = 0xFFFF; $len = strlen($str); for ($i = 0; $i < $len; $i++) { $crc ^= ord($str[$i]) << 8; for ($j = 0; $j < 8; $j++) { if ($crc & 0x8000) { $crc = ($crc << 1) ^ 0x1021; } else { $crc <<= 1; } $crc &= 0xFFFF; } } return strtoupper(str_pad(dechex($crc), 4, '0', STR_PAD_LEFT)); } /** * สร้าง QR Code image โดยใช้ QR Server API (ไม่ต้องติดตั้งไลบรารีเพิ่ม) * @param string $payload PromptPay payload string * @param int $size ขนาด QR Code pixel * @return string URL ของรูป QR Code */ function getPromptPayQrUrl(string $payload, int $size = 300): string { return 'https://api.qrserver.com/v1/create-qr-code/?size=' . $size . 'x' . $size . '&data=' . urlencode($payload) . '&margin=10&ecc=M'; } // === ถ้าเรียกใช้ไฟล์นี้โดยตรง (API endpoint) === if (basename(__FILE__) === basename($_SERVER['PHP_SELF'] ?? '')) { header('Content-Type: application/json'); $phone = isset($_GET['phone']) ? trim($_GET['phone']) : '0970566414'; $amount = isset($_GET['amount']) ? (float)$_GET['amount'] : null; $size = isset($_GET['size']) ? (int)$_GET['size'] : 300; $payload = generatePromptPayPayload($phone, $amount); $qrUrl = getPromptPayQrUrl($payload, $size); echo json_encode([ 'status' => 'success', 'payload' => $payload, 'qr_url' => $qrUrl, 'phone' => $phone, 'amount' => $amount, ]); }
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.45 |
proxy
|
phpinfo
|
Settings