การรับข้อมูลบัตร

หัวข้อทั้งหมดในหน้านี้

การเก็บข้อมูลบัตรด้วย Omise.js

บทความนี้จะช่วยให้คุณสร้างฟอร์มสำหรับเก็บข้อมูลบัตรโดยตรงจากหน้าเว็บไซต์ของคุณ และแปลงข้อมูลนั้นเป็นโทเคน

Omise.js ช่วยให้การเก็บข้อมูลบัตรทำได้ง่ายขึ้น Omise.js เป็นไลบรารี JavaScript ฝั่ง client ที่ให้คุณรันฟอร์ม HTML ของคุณเองในเบราว์เซอร์ของลูกค้า โดยจะส่งข้อมูลบัตรที่มีความอ่อนไหวไปยังเซิร์ฟเวอร์ของ Omise และรับโทเคนของบัตรกลับมาแทน จากนั้นส่งต่อโทเคนนั้นไปยังเซิร์ฟเวอร์ของคุณเพื่อดำเนินการต่อ — เซิร์ฟเวอร์ของคุณจึงไม่ต้องจัดการข้อมูลบัตรที่มีความอ่อนไหวโดยตรงเลย

คู่มือนี้เน้นเฉพาะการเก็บข้อมูลบัตรและแปลงเป็นโทเคนเท่านั้น Omise.js ยังรองรับช่องทางการชำระเงินที่ไม่ใช่บัตรด้วย (PromptPay, GrabPay และ source อื่น ๆ) และมีวิดเจ็ตการชำระเงินสำเร็จรูปให้ใช้แทนฟอร์มที่สร้างเอง หากต้องการข้อมูลในส่วนนั้น ดูได้ที่เอกสารอ้างอิง Omise.js ฉบับสมบูรณ์

วิธีเดียวที่รองรับสำหรับการส่งข้อมูลบัตรไปยัง Omise คือผ่าน JavaScript โดยใช้ Omise.js เว้นแต่องค์กรของคุณมีใบอนุญาต PCI-DSS ที่อนุญาตให้จัดการข้อมูลบัตรฝั่งเซิร์ฟเวอร์ได้

ข้อกำหนด: หน้าชำระเงินของคุณต้องให้บริการผ่าน HTTPS เท่านั้น Omise.js จะไม่ทำงานบนหน้าที่ให้บริการผ่าน HTTP ทั่วไป Omise แนะนำให้เปิดใช้งาน HTTPS ทั่วทั้งเว็บไซต์ ไม่ใช่เฉพาะหน้าชำระเงินเท่านั้น (ที่มา: docs.omise.co/omise-js)

Token overview

วิธีการทำงาน

โดยสรุปแล้ว การทำงานเป็นไปตามขั้นตอนต่อไปนี้

Omise แนะนำว่าไม่ควรบันทึกโทเคนไว้ใช้ภายหลัง เนื่องจากโทเคนออกแบบมาให้ใช้งานได้เพียงครั้งเดียว การเก็บไว้จึงไม่มีประโยชน์ใด ๆ ควรใช้งานแล้วทิ้งทันที

ลองใช้งาน: Omise Token Simulator

Omise Token Simulator

ดูข้อมูลเพิ่มเติมเกี่ยวกับ tokens API ได้ที่เอกสารอ้างอิงโทเคน

ตัวอย่างการใช้งานแบบเต็มรูปแบบ

ก่อนอื่น ให้เพิ่ม Omise.js ลงในหน้าเว็บของคุณ โดยวางไว้ก่อนแท็กปิด </body>

<script src="https://cdn.omise.co/omise.js"></script>

ไลบรารี Omise.js ไม่จำเป็นต้องใช้ jQuery แต่ตัวอย่างนี้ใช้ jQuery เพื่อความสะดวกในการเข้าถึง DOM หากคุณไม่ต้องการเพิ่ม dependency ของ jQuery คุณสามารถเขียนโค้ดในลอจิกเดียวกันสำหรับการส่งฟอร์มและการค้นหา DOM ด้วย vanilla JavaScript แทนได้

<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>

จากนั้นเพิ่ม public key ของคุณ เพื่อให้ Omise.js สามารถยืนยันตัวตนกับ Omise API ได้

<script>
  Omise.setPublicKey("pkey_test_5yx6s4dmon2i23pwaxw");
</script>

ต่อไป สร้างฟอร์มสำหรับเก็บข้อมูลบัตร

<form action="/checkout" method="post" id="checkout">
  <div id="token_errors"></div>

  <input type="hidden" name="omise_token">

  <div>
    Name<br>
    <input type="text" data-omise="holder_name">
  </div>
  <div>
    Number<br>
    <input type="text" data-omise="number">
  </div>
  <div>
    Date<br>
    <input type="text" data-omise="expiration_month" size="4"> /
    <input type="text" data-omise="expiration_year" size="8">
  </div>
  <div>
    Security Code<br>
    <input type="text" data-omise="security_code" size="8">
  </div>

  <input type="submit" id="create_token">
</form>

ต่อไป ให้สร้างโทเคนเมื่อมีการกดปุ่มส่งฟอร์ม เมื่อสำเร็จ ให้กรอกค่าลงในฟิลด์โทเคน และล้างค่าฟิลด์ที่มีข้อมูลอ่อนไหวออก เพื่อไม่ให้ถูกส่งไปยังเซิร์ฟเวอร์ของคุณ

$("#checkout").submit(function () {

  var form = $(this);

  // ปิดการใช้งานปุ่มส่งฟอร์มเพื่อป้องกันการคลิกซ้ำ
  form.find("input[type=submit]").prop("disabled", true);

  // แปลงค่าฟิลด์ในฟอร์มให้เป็น card object ที่ถูกต้อง
  var card = {
    "name": form.find("[data-omise=holder_name]").val(),
    "number": form.find("[data-omise=number]").val(),
    "expiration_month": form.find("[data-omise=expiration_month]").val(),
    "expiration_year": form.find("[data-omise=expiration_year]").val(),
    "security_code": form.find("[data-omise=security_code]").val()
  };

  // ส่งคำขอสร้างโทเคน แล้วเรียก callback function เมื่อได้รับ
  // การตอบกลับจาก Omise
  //
  // โปรดทราบว่าการตอบกลับอาจเป็นข้อผิดพลาดได้ ซึ่งต้องจัดการ
  // ภายใน callback นี้
  Omise.createToken("card", card, function (statusCode, response) {
    if (!response || response.object == "error") {
      // แสดงข้อความแจ้งข้อผิดพลาด
      var message_text = (response && response.message) ? response.message : "Unable to generate a token. Check your connection and try again.";
      $("#token_errors").html(message_text);

      // เปิดใช้งานปุ่มส่งฟอร์มอีกครั้ง
      form.find("input[type=submit]").prop("disabled", false);
    } else {
      // กรอกค่าลงในฟิลด์ omise_token
      form.find("[name=omise_token]").val(response.id);

      // ลบหมายเลขบัตรและรหัสความปลอดภัยออกจากฟอร์ม ก่อนส่งไปยังเซิร์ฟเวอร์
      form.find("[data-omise=number]").val("");
      form.find("[data-omise=security_code]").val("");

      // ส่งโทเคนไปยังเซิร์ฟเวอร์
      form.get(0).submit();
    }
  });

  // ป้องกันไม่ให้ฟอร์มถูกส่งพร้อมข้อมูลบัตรดิบ
  return false;

});

เพียงเท่านี้ Omise.js จะเก็บข้อมูลบัตรเครดิตและส่งคืนโทเคนกลับมา ซึ่งคุณสามารถนำไปใช้ดำเนินการกับบัตรต่อได้

หมายเหตุ: ตั้งแต่วันที่ 1 เมษายน 2020 เป็นต้นมา Omise กำหนดให้ค่า security_code_check ในการตอบกลับของ Token API และ Card API เป็น true เสมอ ซึ่งเป็นการแก้ไขโดยตั้งใจเพื่อปิดช่องทางการโจมตีแบบ brute force เพื่อเดา CVV การตรวจสอบค่านี้ตามที่ตัวอย่างเก่าเคยทำจึงไม่มีผลใด ๆ อีกต่อไปนับตั้งแต่การเปลี่ยนแปลงนี้ การจัดการข้อผิดพลาดควรพิจารณาจาก response.object == "error" (หรือเทียบเท่ากับ statusCode !== 200) เพียงอย่างเดียว โค้ดตัวอย่างในคู่มือนี้ยังมีการป้องกันกรณีที่ response ไม่มีค่าเลยด้วย เผื่อกรณีที่คำขอล้มเหลวก่อนจะได้รับการตอบกลับใด ๆ ความถูกต้องที่แท้จริงของบัตรจะถูกตรวจสอบเมื่อคุณใช้โทเคนนั้นสร้าง charge ไม่ใช่ในขั้นตอนการสร้างโทเคน (ที่มา: docs.omise.co/protecting-you-against-fraudsters)

คำถามที่พบบ่อย

เซิร์ฟเวอร์ของฉันจะเห็นข้อมูลบัตรดิบหรือไม่ ไม่เห็น ข้อมูลบัตรจะถูกส่งจากเบราว์เซอร์ของลูกค้าไปยัง Omise โดยตรงผ่าน Omise.js เซิร์ฟเวอร์ของคุณจะได้รับเพียงโทเคนที่สร้างขึ้นเท่านั้น ไม่มีทางเห็นหมายเลขบัตร วันหมดอายุ หรือรหัสความปลอดภัยเลย

ควรบันทึกโทเคนไว้ใช้ภายหลังหรือไม่ ไม่ควร โทเคนออกแบบมาให้ใช้งานได้เพียงครั้งเดียว เมื่อคุณใช้โทเคนเพื่อทำ charge กับบัตร บันทึกไว้กับลูกค้า หรือเพิ่มให้กับลูกค้าที่มีอยู่แล้ว หน้าที่ของโทเคนนั้นก็เสร็จสิ้นลง ควรใช้งานทันทีแล้วทิ้งไป การเก็บไว้ไม่มีประโยชน์ใด ๆ

การเปิดเผย public key (pkey_test_... / pkey_...) ใน JavaScript ฝั่ง client ปลอดภัยหรือไม่ โดยทั่วไปปลอดภัย แต่ ปลอดภัยที่จะเปิดเผย ไม่ได้แปลว่า ไม่มีความเสี่ยงเลย public key ถูกออกแบบมาให้ใช้งานฝั่ง client โดยมีขอบเขตจำกัดเฉพาะการสร้างโทเคนและ source เท่านั้น ไม่สามารถใช้สร้าง charge โยกย้ายเงิน หรือดำเนินการใด ๆ ที่ต้องใช้ secret key ได้ อย่างไรก็ตาม Omise เคยพบการโจมตีจริงที่อาศัย public key ที่ถูกเปิดเผย โดยหากผู้ไม่หวังดีมีหมายเลขบัตรที่ถูกขโมยมา ก็สามารถใช้ public key ร่วมกับการส่งคำขอสร้างโทเคนซ้ำ ๆ เพื่อเดา CVV ของบัตรได้ โดยอาศัยการอ่านค่าฟิลด์ security_code_check ในแต่ละการตอบกลับ Omise ได้ปิดช่องโหว่นี้ไปแล้วเมื่อวันที่ 1 เมษายน 2020 โดยกำหนดให้ security_code_check เป็น true เสมอ กล่าวคือ ตัว key เองไม่สามารถโยกย้ายเงินได้ แต่ public key ที่ถูกเปิดเผยเมื่อรวมกับข้อมูลบัตรที่ถูกขโมย ก็ยังอาจถูกใช้ในการโจมตีลักษณะทดสอบ/ไล่เดาบัตรได้อยู่ ซึ่งเป็นส่วนหนึ่งของเหตุผลที่ Omise เพิ่มการป้องกันหลายชั้น ทั้ง pre-authorization, IP geolocation และการวิเคราะห์พฤติกรรมเพื่อตรวจจับการทุจริต นอกเหนือจากการจำกัดขอบเขตของ key เอง (ที่มา: docs.omise.co/protecting-you-against-fraudsters, docs.omise.co/api-authentication)

ต้องใช้ jQuery เพื่อใช้งาน Omise.js หรือไม่ ไม่จำเป็น ตัวอย่างเหล่านี้ใช้ jQuery เพียงเพื่อความสะดวกในการเข้าถึง DOM และจัดการ event การส่งฟอร์มเท่านั้น ตัว Omise.js เองไม่มี dependency กับ jQuery และคุณสามารถเขียนลอจิกเดียวกันด้วย vanilla JavaScript ได้

เมื่อ response.object == "error" ค่า response.code จะเป็นอะไรได้บ้าง โค้ดตัวอย่างในคู่มือนี้ตรวจสอบว่ามีข้อผิดพลาดเกิดขึ้นหรือไม่ แต่ไม่ได้ระบุว่าสาเหตุคืออะไรบ้าง โดยรหัสที่พบบ่อยที่สุดจากการสร้างโทเคน ได้แก่

รหัส ความหมาย
invalid_card ข้อมูลบัตรหนึ่งรายการขึ้นไปไม่ผ่านการตรวจสอบความถูกต้อง
expired_card วันหมดอายุของบัตรเป็นวันที่ในอดีต
invalid_security_code รหัส CVV/ความปลอดภัยที่ระบุไม่ถูกต้อง
authentication_failure public key ไม่ได้ระบุ ไม่ถูกต้อง หรือไม่มีสิทธิ์การเข้าถึงเพียงพอ
service_not_found บัญชีของคุณยังไม่ได้เปิดใช้งานการรับชำระด้วยบัตร

ตรวจสอบค่าที่แน่นอนได้จาก response.code และคำอธิบายที่มนุษย์อ่านเข้าใจได้จาก response.message เพื่อแสดงให้ลูกค้าเห็น ดูรายการทั้งหมดได้ที่เอกสารอ้างอิงข้อผิดพลาดของ API

โทเคนที่ไม่ได้ใช้งานจะมีอายุนานแค่ไหนก่อนหมดอายุ โทเคนใช้งานได้เพียงครั้งเดียว และจะหมดอายุหลังจากไม่ได้ใช้งานในระยะเวลาสั้น ๆ โดยทั่วไปประมาณไม่กี่นาที ควรใช้งานโทเคนทันทีหลังจากได้รับ อย่าเก็บหรือแคชไว้ (ที่มา: docs.omise.co/omise-js)

หากพยายามใช้โทเคนที่ถูกใช้ไปแล้วซ้ำอีกครั้งจะเกิดอะไรขึ้น API จะส่งคืนข้อผิดพลาด used_token พร้อมข้อความ token was already used. โทเคนใช้งานได้เพียงครั้งเดียวเท่านั้น เมื่อโทเคนถูกใช้ไปแล้วเพื่อสร้าง charge หรือเพิ่มบัตร จะไม่สามารถนำกลับมาใช้ซ้ำได้อีก ไม่ว่า charge นั้นจะสำเร็จหรือไม่ก็ตาม (ที่มา: docs.omise.co/api-errors)

สามารถจำกัด public key ให้ใช้ได้เฉพาะบางโดเมน เหมือนกับที่ API อื่นบางตัวทำได้หรือไม่ ไม่ได้ Omise ไม่มีฟีเจอร์จำกัด key ตามโดเมน ความปลอดภัยของ public key เมื่อใช้งานฝั่ง client มาจากขอบเขตการใช้งานที่จำกัดอยู่แล้ว โดยสามารถสร้างและดูข้อมูลโทเคนกับ source เท่านั้น ไม่สามารถดำเนินการใด ๆ ที่ต้องใช้ secret key ได้ (ที่มา: docs.omise.co/api-authentication)

การสร้างโทเคนมีการจำกัดอัตราการใช้งานหรือไม่ มี การสร้างโทเคนผ่าน Vault ของ Omise (endpoint สำหรับการทำ tokenization) มีการจำกัดอัตราที่ต่ำกว่า API หลักอย่างมาก Omise ไม่ได้เปิดเผยตัวเลขที่แน่นอน หากคุณต้องส่งคำขอจำนวนมากในช่วงเวลาสั้น ๆ ควรกระจายการส่งออกไปแทนที่จะส่งพร้อมกันเป็นชุดใหญ่ และควรติดต่อsupport@omise.coล่วงหน้าก่อนมีอีเวนต์ที่คาดว่าจะมีการใช้งานสูง เช่น แคมเปญลดราคา (ที่มา: docs.omise.co/api-rate-limiting)

หลังจากใช้โทเคนสร้าง charge แล้ว ต้องจัดการ 3D Secure แยกต่างหากหรือไม่ อาจจะต้อง หากบัญชีของคุณเปิดใช้งาน 3D Secure การตอบกลับของ charge อาจมี authorize_uri ซึ่งคุณต้องเปลี่ยนเส้นทางผู้ถือบัตรไปยัง URL นั้นเพื่อยืนยันตัวตนกับธนาคารก่อนที่ charge จะเสร็จสมบูรณ์ 3D Secure เป็นข้อบังคับสำหรับธุรกิจบางประเภท เช่น การเดินทาง สินค้าดิจิทัล เกม และประเภทอื่น ๆ ที่มักเกิดการทุจริตและ chargeback บ่อยครั้ง ซึ่งพิจารณาโดยทีมนักวิเคราะห์การทุจริตของ Omise ส่วนร้านค้าประเภทอื่นถือเป็นทางเลือก แต่แนะนำให้ใช้สำหรับธุรกรรมมูลค่าสูงหรือมีความเสี่ยงสูง ณ เดือนตุลาคม 2022 รองรับเฉพาะ 3D Secure 2 (3DS2) เท่านั้น เนื่องจาก 3DS1 ถูกยกเลิกไปแล้ว จึงควรเตรียมรองรับทั้งการเปลี่ยนเส้นทางไปยัง authorize_uri และรูปแบบการยืนยันตัวตนทั้งแบบไม่มีการโต้ตอบเพิ่มเติมและแบบที่ต้องยืนยันเพิ่มเติมที่อาจเกิดขึ้น (ที่มา: docs.omise.co/3d-secure)

เนื้อหาที่เกี่ยวข้อง

เว็ปไซต์นี้มีการใช้คุกกี้เพื่อวิเคราะห์การใช้และปรับการใช้งานให้เหมาะกับท่าน เมื่อกดยอมรับหรือยังคงเข้าชมเว็บไซต์ต่อ เราถือว่าท่านยินยอมในการใช้งานคุกกี้ของเว็บไซต์ อ่านนโยบายความเป็นส่วนตัว