ธนาคารกสิกรมีการอัพเดทระบบ payment gateway ใหม่ไม่แน่ใจว่าช่วงไหน ในคู่มือคือ 17/04/2019 ซึ่งก็ไม่มีตัวอย่างของ php มีแต่ java กับ บอกวิธีการทำงานการส่งค่าและรับค่าต่างๆ
ซึ่งในระบบใหม่นี้ สามารถชำระเงินได้ ทั้งแบบ ตัดบัตร และ qr code ซึ่งก็ช่วยให้การจ่ายเงินสำหรับลูกค้าในเว็บไซต์สะดวกขึ้น
การชำระเงินทั้ง 2 แบบนั้นมีความแต่ต่างกันในด้าน code ผมจึงทำเป็นของตัดบัตรมาก่อนในบทความนี้ และมีตัวอย่าง code ให้
เริ่มต้น
1. หลังจากที่เราสมัครของ payment gateway กับทางธนาคารสำเร็จ (อันนี้ต้องดูเงื่อนไขธนาคารนะครับ) เราจะได้ คู่มือ ,key 2 อันคือ (Public key,Secret key ซึ๋งจะมีทัั้งตัวจริงและตัวเทส เราจะใช้ตัวเทสก่อน เพื่อทดลองจ่ายเงินได้ด้วยเลขบัตรที่ธนาคารให้มา ) , user สำหรับเข้า dashboard
2 หลังจากนั้นเรามาดูเรื่อง server ของเรา สิ่งที่เราต้องมีคือ
-SSL Certificate ที่ออกโดย CA (Certificate Authority)
-TLS 1.2
– PHP CURL (บาง host ปิดไม่ให้ใช้)
ซึ่งไม่มีก็ใช้ไม่ได้ครับ
3. ในตัดบัตรนั้นจะมีอยู่ 2 แบบคือ
– 3D Secure มีการยืนยันตัวตนจากผู้ใช้
– Non 3D Secure ไม่มีการยืนยันตัวตน (ในคู่มือแจ้งว่าวิธีนี้ต้องทำสัญญาบางอย่างเพิ่มเติมเรื่องความรับผิดชอบ)
เริ่มกันเลย
- ไฟล์แรกคือ ไฟล์ config.php ภายในจะมีการตั้งค่า key ที่ได้จากธนาคารเพื่อใช้ในระบบ
$path = ''; // url website เช่น http://www.webunique.in.th/ $publickey = ''; // public key ที่ได้จาก ธนาคาร $secretkey = ''; // secret key ที่ได้จาก ธนาคาร
- ไฟล์ที่ 2 step1.php เป็นการสร้างปุ่มสำหรับจ่ายเงินซึ่งจะใส่ค่าต่างๆตาม Code
<?php require_once("config.php"); echo ' <form method="POST" action="'.$path.'step2.php"> // ใส่ url เมื่อลูกค้าจ่ายเงินเสร็จแล้ว <script type="text/javascript" src="https://dev-kpaymentgateway.kasikornbank.com/ui/v2/kpayment.min.js" // ui script ของทางธนาคารซึ่งเป็นตัวเทส data-apikey=""'.$publickey.'"" // ใส่ public key data-amount="2000.00" // จำนวนเงินตามรูปแบบทศนิยม 2 ตำแหน่ง data-currency="THB" // สกุลเงิน data-payment-methods="card" // วิธีชำระเงิน data-name="SHOPNAME" > </script> </form>'; ?>
เมื่อเขารันก็จะได้ ปุ่มและเมื่อกดจ่ายก็จะได้หน้าตาแบบนี้ครับ
- หลังจากใส่ข้อมูลบัตรทั้งหมดแล้วและกดปุ่ม Pay ระบบธนาคารจะทำการ post ข้อมูลกลับมาที่ step2.php ในเว็บของเรา (ตามที่เราตั้งค่าไว้) ข้อมูลที่ได้มาก็จะมี Token แบบใช้ครั้งเดียว เราจะนำ token นี้ไปทำการเรียก Charge API ของธนาคารเพื่อทำการตัดบัตร แล้วธนาคารจะส่งค่าต่างๆกลับมา และค่า redirect_url ไว้สำหรับไปให้ลูกค้ายืนยันตัวตน
<?php require_once("config.php"); if($_POST['token']!='' and isset($_POST['token']) ){ $token = $_POST['token']; // รับค่า TOKEN จากระบบธนาคาร $url = 'https://dev-kpaymentgateway-services.kasikornbank.com/card/v2/charge'; // url เรียก Api test ในการส่งค่า Token $datasend = array( // ค่าที่ต้องส่ง อันนี้อาจต้องดูในคู่มือว่าตัวไหนจำเป็นต้องใส่บ้าง "amount"=> "2000.00", "currency"=> "THB", "description" => "Awesome Product", "source_type" => "card", "mode"=> "token", "token"=> $token, "reference_order"=> "11251513" ); $ch = curl_init(); $post_string = json_encode($datasend); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Cache-Control:no-cache', 'x-api-key: '.$secretkey // ใส่ Secret Key ) ); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); curl_setopt($ch, CURLOPT_SSLVERSION, 0 ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_VERBOSE, true); $data = curl_exec($ch); $response = json_decode($data); curl_close ($ch); $response = json_decode(json_encode($response), True); // ค่าที่ได้รับกลับมาจะอยู่ในตัวแปรนี้จะมีค่าที่สำคัญคือ chrg id เอาไว้ยืนยันตอนสุดท้ายในขั้นตอนที่ 4 ob_clean(); header('Location: '.$response['redirect_url']); // ทำการ Redirect ไปหน้ายื่นยันตัวตนลูกค้า } ?> เมี่อไปตาม Redirect_url แล้ว ก็จะเป็นหน้าเว็บกสิกรไทยให้ยื่นยัน sms สำหรับลูกค้า หลังจากลูกค้ายืนยันตัวตนเสร็จแล้ว ทางระบบธนาคารจะ ส่งค่ากลับมาที่เว็บเรา ตาม url callback ( ตรงนี้เราต้องเข้าไป set ใน Dashboard ของ kbank ซึ่งจะให้เราตอนสมัรว่าจะให้ไปที่ url อะไร ตามตัวอย่างคือไฟล์ step3.php )
- ระบบธนาคารส่งค่ากลับมาที่หน้าเว็บเราตาม url callback และส่งข้อมูล object_id เพื่อมาเช็คกับ chrg_id ก่อนยืนยันผลการทำรายการ ร้านค้าต้องเรียก Charge API เพื่อ Inquiry Transaction เข้าไปอีกครั้งตาม code
<?php require_once("config.php"); $url = 'https://dev-kpaymentgateway-services.kasikornbank.com/card/v2/charge'; $ch = curl_init(); $post_string = json_encode($datasend); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Cache-Control:no-cache', 'x-api-key: '.$secretkey // ใส่ secretkey ) ); curl_setopt($ch, CURLOPT_URL, $url."/?????"); // ใส่ chrg id (ต้องตรงกับ object_id ที่รับมา) ที่ได้รับตอน step2.php curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_VERBOSE, true); $data = curl_exec($ch); $response = json_decode($data); if (curl_errno($ch)){ echo curl_error($ch); } curl_close ($ch); $response = json_decode(json_encode($response), True); print_r($response); // รายละเอียดที่ธนาคารส่งกลับมาเว็บเรามีทั้ง สถานนะและรายละเอียดลูกค้า ?>
ค่าที่ได้มาก็จะเป็นแบบนี้ครับ
เมื่อ status ที่ส่งกลับมาเป็น success ก็สำเร็จครับ
มีคำถามสงสัยหรือแนะนำได้ครับ
ถ้า kbank payment gateway แบบ qr code ทำยังงัยครับ ภาษา php ขอบคุณครับ
สวัสดีครับ
ได้ error นี้ แก้ยังไงครับ
object(stdClass)#1 (3) { [“object”]=> string(5) “error” [“code”]=> string(21) “mid_and_tid_not_exist” [“message”]=> string(62) “MID and/or TID do not exist or are not mapped to this currency” }