11 Oct

การใช้ php ต่อกับ payment gateway ของ กสิกรไทย (ตัดบัตร)

ธนาคารกสิกรมีการอัพเดทระบบ 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 ไม่มีการยืนยันตัวตน (ในคู่มือแจ้งว่าวิธีนี้ต้องทำสัญญาบางอย่างเพิ่มเติมเรื่องความรับผิดชอบ)

เริ่มกันเลย  

  1.  ไฟล์แรกคือ ไฟล์ config.php ภายในจะมีการตั้งค่า key ที่ได้จากธนาคารเพื่อใช้ในระบบ
    $path = '';  // url website  เช่น http://www.webunique.in.th/
    $publickey = '';   // public key ที่ได้จาก ธนาคาร
    $secretkey = ''; // secret key ที่ได้จาก ธนาคาร
  2.  ไฟล์ที่ 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>'; ?>

    เมื่อเขารันก็จะได้ ปุ่มและเมื่อกดจ่ายก็จะได้หน้าตาแบบนี้ครับ

  3.  หลังจากใส่ข้อมูลบัตรทั้งหมดแล้วและกดปุ่ม 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 )
  4. ระบบธนาคารส่งค่ากลับมาที่หน้าเว็บเราตาม 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 ก็สำเร็จครับ

กด Download ไฟล์ตัวอย่าง

มีคำถามสงสัยหรือแนะนำได้ครับ

เอ says:

ถ้า kbank payment gateway แบบ qr code ทำยังงัยครับ ภาษา php ขอบคุณครับ

Tom says:

สวัสดีครับ
ได้ 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” }

Leave a Reply

Your email address will not be published. Required fields are marked *