ระยะเวลาของธุรกรรมการชำระเงิน

ดูวิธีที่ผู้ขายผสานรวมแอปการชำระเงินและวิธีที่ธุรกรรมการชำระเงินทำงานร่วมกับ Payment Request API

Web Payments API เป็นฟีเจอร์การชำระเงินที่สร้างขึ้นในเบราว์เซอร์โดยเฉพาะเป็นครั้งแรก เมื่อใช้การชำระเงินผ่านเว็บ การผสานรวมผู้ขายกับแอปการชำระเงินจะง่ายขึ้น ขณะที่ประสบการณ์ของลูกค้าจะมีประสิทธิภาพและปลอดภัยยิ่งขึ้น

ดูข้อมูลเพิ่มเติมเกี่ยวกับประโยชน์ของการใช้การชำระเงินผ่านเว็บได้ที่การเพิ่มศักยภาพให้กับแอปการชำระเงินด้วยการชำระเงินผ่านเว็บ

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

กระบวนการนี้ประกอบด้วย 6 ขั้นตอนดังนี้

  1. ผู้ขายเริ่มทำธุรกรรมการชำระเงิน
  2. ผู้ขายแสดงปุ่มการชำระเงิน
  3. ลูกค้ากดปุ่มชำระเงิน

    แผนภาพของเว็บไซต์ร้านชีสที่มีปุ่ม BobPay (แอปการชำระเงิน)

  4. เบราว์เซอร์จะเปิดแอปการชำระเงิน

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

  5. หากลูกค้าเปลี่ยนแปลงรายละเอียด (เช่น ตัวเลือกการจัดส่งหรือที่อยู่) ผู้ขายจะอัปเดตรายละเอียดธุรกรรมให้สอดคล้องกับการเปลี่ยนแปลง

    แผนภาพแสดงลูกค้าเลือกตัวเลือกการจัดส่งอื่นในโมดัลแอป BobPay แผนภาพที่สองแสดงผู้ขายที่อัปเดตต้นทุนทั้งหมดที่แสดงใน BobPay

  6. หลังจากลูกค้ายืนยันการซื้อแล้ว ผู้ขายจะตรวจสอบการชำระเงินและทำธุรกรรมให้เสร็จสมบูรณ์

    แผนภาพแสดงลูกค้าที่กำลังกด

ขั้นตอนที่ 1: ผู้ขายเริ่มธุรกรรมการชำระเงิน

เมื่อลูกค้าตัดสินใจซื้อ ผู้ขายจะเริ่มธุรกรรมการชำระเงินโดยสร้างออบเจ็กต์ PaymentRequest ออบเจ็กต์นี้มีข้อมูลสำคัญเกี่ยวกับธุรกรรม ดังนี้

  • วิธีการชำระเงินที่ยอมรับและข้อมูลวิธีการชำระเงินเพื่อประมวลผลธุรกรรม
  • รายละเอียด เช่น ราคารวม (ต้องระบุ) และข้อมูลเกี่ยวกับสินค้า
  • ตัวเลือกที่ผู้ขายขอข้อมูลการจัดส่งได้ เช่น ที่อยู่สำหรับจัดส่งและตัวเลือกการจัดส่ง
  • ผู้ขายยังขอที่อยู่สำหรับการเรียกเก็บเงิน ชื่อผู้ชำระเงิน อีเมล และหมายเลขโทรศัพท์ได้ด้วย
  • ผู้ขายยังระบุประเภทการจัดส่งที่ไม่บังคับได้ด้วย (shipping, delivery หรือ pickup) ใน PaymentRequest แอปการชำระเงินจะใช้ข้อมูลดังกล่าวเป็นคำแนะนำในการแสดงป้ายกำกับที่ถูกต้องใน UI ได้
const request = new PaymentRequest([{
  supportedMethods: 'https://bobpay.xyz/pay',
  data: {
    transactionId: '****'
  }
}], {
  displayItems: [{
    label: 'Anvil L/S Crew Neck - Grey M x1',
    amount: { currency: 'USD', value: '22.15' }
  }],
  total: {
    label: 'Total due',
    amount: { currency: 'USD', value : '22.15' }
  }
}, {
  requestShipping: true,
  requestBillingAddress: true,
  requestPayerEmail: true,
  requestPayerPhone: true,
  requestPayerName: true,
  shippingType: 'delivery'
});
รวมรหัสธุรกรรม

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

ผู้ขายสามารถส่งรหัสธุรกรรมเป็นส่วนหนึ่งของพร็อพเพอร์ตี้ data ของออบเจ็กต์ PaymentMethodData

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

ดูรายละเอียดเกี่ยวกับวิธีการทำงานของกระบวนการค้นพบได้ที่การตั้งค่าวิธีการชําระเงิน

ขั้นตอนที่ 2: ผู้ขายแสดงปุ่มการชำระเงิน

ผู้ขายรองรับวิธีการชำระเงินได้หลายวิธี แต่ควรแสดงปุ่มการชำระเงินสำหรับวิธีการชำระเงินที่ลูกค้าใช้ได้จริงเท่านั้น การแสดงปุ่มการชำระเงินที่ใช้งานไม่ได้ทำให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ไม่ดี หากผู้ขายคาดการณ์ได้ว่าวิธีการชำระเงินที่ระบุไว้ในออบเจ็กต์ PaymentRequest จะใช้ไม่ได้กับลูกค้า ผู้ขายสามารถระบุวิธีแก้ปัญหาสำรองหรือไม่แสดงปุ่มนั้นเลยก็ได้

เมื่อใช้อินสแตนซ์ PaymentRequest ผู้ขายจะสอบถามได้ว่าลูกค้ามีแอปการชำระเงินหรือไม่

ลูกค้ามีแอปการชำระเงินไหม

canMakePayment() ของ PaymentRequest จะแสดงผลเป็น true หากมีแอปเป๋าตังในอุปกรณ์ของลูกค้า "พร้อมใช้งาน" หมายความว่าระบบจะพบแอปการชำระเงินที่รองรับวิธีการชำระเงิน และติดตั้งแอปการชำระเงินเฉพาะแพลตฟอร์ม หรือแอปการชำระเงินบนเว็บพร้อมลงทะเบียน

const canMakePayment = await request.canMakePayment();
if (!canMakePayment) {
  // Fallback to other means of payment or hide the button.
}

ขั้นตอนที่ 3: ลูกค้ากดปุ่มชำระเงิน

เมื่อลูกค้ากดปุ่มชำระเงิน ผู้ขายจะเรียกใช้show()วิธีของอินสแตนซ์ PaymentRequest ซึ่งจะทริกเกอร์การเปิด UI การชำระเงินทันที

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

เลื่อนการเปิดตัว UI การชำระเงิน

ดูการสาธิตUI การเลื่อนการชำระเงินจนกว่าจะกำหนดราคารวมสุดท้าย

หากต้องการเลื่อน UI การชําระเงิน ผู้ขายจะส่ง Promise ไปยังเมธอด show() เบราว์เซอร์จะแสดงสัญญาณบอกสถานะการโหลดจนกว่า Promise จะแก้ไขและธุรกรรมจะพร้อมเริ่ม

const getTotalAmount = async () => {
  // Fetch the total amount from the server, etc.
};

try {
  const result = await request.show(getTotalAmount());
  // Process the result…
} catch(e) {
  handleError(e);
}

หากไม่ได้ระบุ Promise เป็นอาร์กิวเมนต์สำหรับ show() เบราว์เซอร์จะเปิด UI การชำระเงินทันที

ขั้นตอนที่ 4: เบราว์เซอร์เปิดแอปการชำระเงิน

เบราว์เซอร์สามารถเปิดแอปการชำระเงินเฉพาะแพลตฟอร์มหรือแอปการชำระเงินบนเว็บ (ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ Chrome กำหนดแอปการชำระเงินที่จะเปิด)

วิธีการสร้างแอปการชำระเงินส่วนใหญ่ขึ้นอยู่กับนักพัฒนาแอป แต่เหตุการณ์ที่ส่งจากและไปยังผู้ขาย รวมถึงโครงสร้างของข้อมูลที่ส่งไปพร้อมกับเหตุการณ์เหล่านั้นจะได้รับมาตรฐาน

เมื่อเปิดแอปการชำระเงิน แอปจะได้รับข้อมูลธุรกรรมที่ส่งไปยังออบเจ็กต์ PaymentRequest ในขั้นตอนที่ 1 ซึ่งประกอบด้วยข้อมูลต่อไปนี้

  • ข้อมูลวิธีการชำระเงิน
  • ราคารวม
  • ตัวเลือกการชำระเงิน

แอปการชำระเงินใช้ข้อมูลธุรกรรมในการติดป้ายกำกับ UI

ขั้นตอนที่ 5: วิธีที่ผู้ขายอัปเดตรายละเอียดธุรกรรมโดยขึ้นอยู่กับการกระทำของลูกค้า

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

ผู้ขายจะรับเหตุการณ์ได้ 4 ประเภทดังนี้

  • เหตุการณ์การเปลี่ยนแปลงวิธีการชำระเงิน
  • เหตุการณ์การเปลี่ยนที่อยู่สำหรับจัดส่ง
  • เหตุการณ์การเปลี่ยนแปลงตัวเลือกการจัดส่ง
  • เหตุการณ์การตรวจสอบผู้ขาย

เหตุการณ์การเปลี่ยนแปลงวิธีการชำระเงิน

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

request.addEventListener('paymentmethodchange', e => {
  e.updateWith({
    // Add discount etc.
  });
});

เหตุการณ์การเปลี่ยนที่อยู่สำหรับจัดส่ง

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

หากลูกค้าอัปเดตที่อยู่สำหรับจัดส่งในแอปการชำระเงินหลังจากเริ่มธุรกรรม ระบบจะส่งเหตุการณ์ 'shippingaddresschange' ไปยังผู้ขาย เหตุการณ์นี้ช่วยให้ผู้ขายระบุค่าจัดส่งตามที่อยู่ใหม่ อัปเดตราคารวม และส่งกลับไปยังแอปการชำระเงินได้

request.addEventListener('shippingaddresschange', e => {
  e.updateWith({
    // Update the details
  });
});

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

เหตุการณ์การเปลี่ยนแปลงตัวเลือกการจัดส่ง

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

  • การจัดส่งแบบมาตรฐาน - ฟรี
  • การจัดส่งด่วน - 5 USD

เมื่อลูกค้าอัปเดตตัวเลือกการจัดส่งในแอปการชำระเงิน ระบบจะส่งเหตุการณ์ 'shippingoptionchange' ไปยังผู้ขาย จากนั้นผู้ขายจะกำหนดค่าจัดส่ง อัปเดตราคารวม และส่งกลับไปยังแอปการชำระเงินได้

request.addEventListener('shippingoptionchange', e => {
  e.updateWith({
    // Update the details
  });
});

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

เหตุการณ์การตรวจสอบผู้ขาย

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

request.addEventListener('merchantvalidation', e => {
  e.updateWith({
    // Use `e.validateURL` to validate
  });
});

ขั้นตอนที่ 6: ผู้ขายตรวจสอบการชำระเงินและทำธุรกรรมให้เสร็จสมบูรณ์

เมื่อลูกค้าให้สิทธิ์การชำระเงินสำเร็จ เมธอด show() จะแสดงสัญญาที่แก้ไขเป็น PaymentResponse ออบเจ็กต์ PaymentResponse มีข้อมูลต่อไปนี้

  • รายละเอียดผลลัพธ์การชำระเงิน
  • ที่อยู่สำหรับจัดส่ง
  • ตัวเลือกการจัดส่ง
  • ข้อมูลติดต่อ

เมื่อถึงจุดนี้ UI ของเบราว์เซอร์อาจยังแสดงตัวบ่งชี้การโหลดอยู่ ซึ่งหมายความว่าธุรกรรมยังไม่เสร็จสมบูรณ์

หากแอปการชำระเงินสิ้นสุดลงเนื่องจากการชำระเงินไม่สำเร็จหรือมีข้อผิดพลาด Promise ที่แสดงผลจาก show() จะปฏิเสธ และเบราว์เซอร์จะสิ้นสุดธุรกรรมการชำระเงิน

การประมวลผลและตรวจสอบการชำระเงิน

details ใน PaymentResponse คือออบเจ็กต์ข้อมูลเข้าสู่ระบบการชำระเงินที่แสดงผลจากแอปการชำระเงิน ผู้ขายสามารถใช้ข้อมูลเข้าสู่ระบบดังกล่าวเพื่อประมวลผลหรือตรวจสอบการชำระเงิน วิธีการทํางานของกระบวนการสําคัญนี้ขึ้นอยู่กับตัวแฮนเดิลการชําระเงิน

กำลังดำเนินการหรือทำธุรกรรมอีกครั้ง

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

  • เรียกใช้เมธอด .complete() เพื่อทำธุรกรรมให้เสร็จสมบูรณ์และปิดตัวบ่งชี้การโหลด
  • ให้ลูกค้าลองอีกครั้งโดยเรียกใช้เมธอด retry()
async function doPaymentRequest() {
  try {
    const request = new PaymentRequest(methodData, details, options);
    const response = await request.show();
    await validateResponse(response);
  } catch (err) {
    // AbortError, SecurityError
    console.error(err);
  }
}

async function validateResponse(response) {
  try {
    const errors = await checkAllValuesAreGood(response);
    if (errors.length) {
      await response.retry(errors);
      return validateResponse(response);
    }
    await response.complete("success");
  } catch (err) {
    // Something went wrong…
    await response.complete("fail");
  }
}
// Must be called as a result of a click
// or some explicit user action.
doPaymentRequest();

ขั้นตอนถัดไป