1. บทนำ
สิ่งที่คุณจะสร้าง
เมื่อทำ Codelab นี้เสร็จแล้ว คุณจะมีเว็บไซต์ที่ใช้งานได้ขั้นต่ำซึ่งผสานรวมกับ Google Pay ที่ใช้งานได้ โปรเจ็กต์นี้จะดึงโทเค็นการชำระเงินซึ่งอาจส่งไปยังผู้ให้บริการชำระเงินเพื่อประมวลผล
สิ่งที่คุณจะได้เรียนรู้
- วิธีโหลดและกำหนดค่า Google Pay API
- วิธีแสดงปุ่ม Google Pay และจัดการการคลิก
- วิธีขอโทเค็นการชำระเงินจาก Google Pay
สิ่งที่คุณต้องมี
- โปรแกรมแก้ไขข้อความที่คุณเลือกเพื่อแก้ไขไฟล์ HTML และ JavaScript
- เว็บเบราว์เซอร์ Google Chrome หรือวิธีอื่นในการทดสอบเว็บไซต์ในเครื่อง
- สำหรับเวอร์ชันที่ใช้งานจริง คุณจะต้องมี Google Pay
merchantIdการลงทะเบียนใน Google Pay และ Wallet Console ใช้เวลาเพียง 1 นาที ดังนั้นคุณควรดำเนินการให้เรียบร้อยในตอนนี้
ทำตามโดยใช้ Firebase Studio
2. สร้างหน้า HTML
สร้างไฟล์โปรเจ็กต์
- สร้างโฟลเดอร์ในคอมพิวเตอร์ชื่อ
gpay-web-101และสร้างไฟล์ข้อความว่าง 2 ไฟล์ภายในโฟลเดอร์นั้นชื่อindex.htmlและmain.jsโครงสร้างไดเรกทอรีควรมีลักษณะดังนี้gpay-web-101/ index.html main.js
- เปิด
index.htmlใน IDE ที่คุณเลือก แล้วเพิ่มโค้ดต่อไปนี้<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Google Pay API for Web 101</title> </head> <body> <div id="gpay-container"></div> <p>Transaction info and errors will be logged to the console.</p> <script type="text/javascript" src="main.js"></script> <script async src="https://pay.google.com/gp/p/js/pay.js" onload="onGooglePayLoaded()"> </script> </body> </html>
คำอธิบายโค้ด
- ระบบจะเพิ่ม DIV ที่ว่างเปล่าลงในหน้าเว็บโดยมีรหัส
gpay-containerองค์ประกอบ DOM นี้จะเป็นองค์ประกอบระดับบนที่เพิ่มปุ่ม Google Pay คุณวางองค์ประกอบนี้ในเลย์เอาต์ของเว็บไซต์ได้ตามความเหมาะสม - แท็กสคริปต์
main.jsจะอยู่ใน DOM หลังองค์ประกอบgpay-containerซึ่งจำเป็นเพื่อให้แน่ใจว่า DIV คอนเทนเนอร์อยู่ใน DOM ก่อนที่main.jsจะค้นหา นอกจากนี้ สคริปต์ยังเป็นแบบพร้อมกันเพื่อให้แน่ใจว่าสคริปต์จะโหลดก่อนpay.jsเนื่องจากต้องมีเมธอดonGooglePayLoaded()ก่อนที่จะโหลดเสร็จสมบูรณ์ นอกจากนี้ยังมีวิธีอื่นๆ ในการสร้างเอฟเฟกต์เดียวกัน แต่เราจะไม่กล่าวถึงในที่นี้ - สุดท้าย
pay.jsจะโหลดแบบไม่พร้อมกันและกำหนดค่าonGooglePayLoaded()เป็นแฮนเดิลเลอร์onloadเราจะกำหนดเมธอดนี้ในmain.js
3. กำหนดค่า Google Pay
คำขอการชำระเงินด้วย Google Pay ต้องมีออบเจ็กต์คำขอ ออบเจ็กต์ที่กำหนดไว้ที่นี่เป็น baseGooglePayRequest มีการตั้งค่าทั่วไปขั้นต่ำสำหรับคำขอทั้งหมด ระบบจะเพิ่มการตั้งค่าเพิ่มเติมตามคำขอ ซึ่งเราจะตรวจสอบใน Codelab นี้
เพิ่มค่าคงที่ของการกำหนดค่า Google Pay ลงในไฟล์ main.js ที่ว่างเปล่า
//=============================================================================
// Configuration
//=============================================================================
// The DOM element that the Google Pay button will be rendered into
const GPAY_BUTTON_CONTAINER_ID = 'gpay-container';
// Update the `merchantId` and `merchantName` properties with your own values.
// Your real info is required when the environment is `PRODUCTION`.
const merchantInfo = {
merchantId: '12345678901234567890',
merchantName: 'Example Merchant'
};
// This is the base configuration for all Google Pay payment data requests.
const baseGooglePayRequest = {
apiVersion: 2,
apiVersionMinor: 0,
allowedPaymentMethods: [
{
type: 'CARD',
parameters: {
allowedAuthMethods: [
"PAN_ONLY", "CRYPTOGRAM_3DS"
],
allowedCardNetworks: [
"AMEX", "DISCOVER", "INTERAC", "JCB", "MASTERCARD", "VISA"
]
},
tokenizationSpecification: {
type: 'PAYMENT_GATEWAY',
parameters: {
gateway: 'example',
gatewayMerchantId: 'exampleGatewayMerchantId'
}
}
}
],
merchantInfo
};
// Prevent accidental edits to the base configuration. Mutations will be
// handled by cloning the config using deepCopy() and modifying the copy.
Object.freeze(baseGooglePayRequest);
คำอธิบายโค้ด
- ตั้งค่าตัวแปรค่าคงที่
GPAY_BUTTON_CONTAINER_IDเป็นรหัสขององค์ประกอบ DOM ที่ใช้ในหน้า HTML เป็นคอนเทนเนอร์หลักสำหรับปุ่ม Google Pay - สร้างออบเจ็กต์การกำหนดค่า
baseGooglePayRequestพร้อมการตั้งค่าที่เกี่ยวข้องสำหรับแอปพลิเคชัน คุณดูพร็อพเพอร์ตี้และค่าแต่ละรายการได้ในเอกสารอ้างอิง ค่าที่แสดงในตัวอย่างนี้อาจตรงหรือไม่ตรงกับความต้องการของคุณอย่างสมบูรณ์ ดังนั้นโปรดตรวจสอบอย่างละเอียด - อัปเดตพร็อพเพอร์ตี้
merchantIdและmerchantNameด้วยค่าของคุณเอง ช่องเหล่านี้เป็นช่องที่ไม่บังคับเมื่อสภาพแวดล้อมเป็นTEST
แหล่งข้อมูล
- บล็อกโพสต์: ต้องการชำระเงินด้วย Google Pay ให้ราบรื่นยิ่งขึ้นไหม กำหนดค่าตัวเลือกการชำระเงิน
- เอกสารอ้างอิง API: เอกสารประกอบเกี่ยวกับ request objects ของ Google Pay API
- ข้อมูลอ้างอิง API: ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการให้สิทธิ์ที่อนุญาต เครือข่ายบัตรที่อนุญาต และข้อกำหนดการแปลงโทเค็น รวมถึงค่าเกตเวย์ที่เหมาะสมได้ที่
PaymentMethod
4. เพิ่มไคลเอ็นต์การชำระเงิน
ไคลเอ็นต์การชำระเงินใช้เพื่อส่งคำขอการชำระเงินและลงทะเบียนการเรียกกลับ ในโค้ดแล็บนี้ เราจะส่งคำขอการชำระเงินเท่านั้น นอกจากนี้ คุณยังกำหนดค่า PaymentDataCallbacks เพื่อจัดการเมื่อมีการเปลี่ยนแปลงข้อมูลการชำระเงินหรือการให้สิทธิ์ได้ด้วย อย่างไรก็ตาม เราจะไม่กล่าวถึงหัวข้อขั้นสูงเหล่านี้ในโค้ดแล็บนี้
ต่อท้ายรหัสไคลเอ็นต์นี้ที่ด้านล่างของ main.js
//=============================================================================
// Google Payments client singleton
//=============================================================================
let paymentsClient = null;
function getGooglePaymentsClient() {
if (paymentsClient === null) {
paymentsClient = new google.payments.api.PaymentsClient({
environment: 'TEST',
merchantInfo,
// todo: paymentDataCallbacks (codelab pay-web-201)
});
}
return paymentsClient;
}
คำอธิบายโค้ด
- ตัวแปร
paymentsClientจะเก็บอินสแตนซ์ไว้ในไคลเอ็นต์เมื่อสร้างแล้ว โค้ดของเราไม่ได้เข้าถึงตัวแปรโดยตรง แต่จะเข้าถึงผ่านเมธอดgetGooglePaymentsClient()เสมอ - เมธอด
getGooglePaymentsClient()จะตรวจสอบว่ามีการสร้างอินสแตนซ์ไคลเอ็นต์แล้วหรือไม่ และจะแสดงผลอินสแตนซ์นั้น หากก่อนหน้านี้ไม่ได้สร้างอินสแตนซ์ไว้ ระบบจะสร้าง บันทึก และส่งคืนอินสแตนซ์ วิธีนี้ช่วยให้มั่นใจได้ว่าจะมีการสร้างและใช้อินสแตนซ์เพียงอินสแตนซ์เดียวตลอดอายุการใช้งานของสคริปต์นี้ - หากต้องการสร้างอินสแตนซ์ไคลเอ็นต์ ให้เรียกใช้เมธอด
PaymentsClient()ในตัวอย่างนี้ เราจะบอกลูกค้าว่าเราอยู่ในสภาพแวดล้อมTESTหรือจะใช้PRODUCTIONก็ได้ อย่างไรก็ตามTESTเป็นค่าเริ่มต้นและอาจละเว้นได้
5. เพิ่มผู้ช่วย
ฟังก์ชันตัวช่วยต่อไปนี้จะใช้ในสคริปต์ในภายหลัง และได้เพิ่มไว้เพื่อจุดประสงค์เดียวคือปรับปรุงความสามารถในการอ่านและการบำรุงรักษาโค้ด
ต่อท้ายฟังก์ชันตัวช่วยที่ด้านล่างของ main.js ดังนี้
//=============================================================================
// Helpers
//=============================================================================
const deepCopy = (obj) => JSON.parse(JSON.stringify(obj));
function renderGooglePayButton() {
const button = getGooglePaymentsClient().createButton({
onClick: onGooglePaymentButtonClicked
});
document.getElementById(GPAY_BUTTON_CONTAINER_ID).appendChild(button);
}
คำอธิบายโค้ด
deepCopy()เป็นยูทิลิตีที่ใช้การซีเรียลไลซ์และดีซีเรียลไลซ์ JSON เพื่อสร้างสำเนาแบบลึกของออบเจ็กต์ที่ระบุ ซึ่งเป็นวิธีที่สะดวกในการโคลนออบเจ็กต์โดยไม่ต้องกังวลเกี่ยวกับข้อมูลอ้างอิงที่แชร์renderGooglePayButton()เป็นยูทิลิตีที่เรียกใช้เมธอดไลบรารีcreateButton()เพื่อแสดงปุ่ม Google Pay อาร์กิวเมนต์ที่ส่งผ่านคือชุดตัวเลือกที่กำหนดลักษณะการทำงานของปุ่ม เช่น การลงทะเบียนฟังก์ชันonGooglePaymentButtonClicked()เพื่อจัดการการคลิกปุ่ม
6. เพิ่มตัวแฮนเดิลเหตุการณ์
ในสคริปต์นี้ เราจะกำหนดค่าตัวแฮนเดิลเหตุการณ์ 2 รายการ ฟังก์ชันแรกจะเรียกใช้เมื่อpay.jsไลบรารีโหลดเสร็จ และฟังก์ชันที่สองจะเรียกใช้เมื่อมีการคลิกปุ่ม Google Pay
ต่อท้ายตัวแฮนเดิลเหตุการณ์ที่ด้านล่างของ main.js
//=============================================================================
// Event Handlers
//=============================================================================
function onGooglePayLoaded() {
const req = deepCopy(baseGooglePayRequest);
getGooglePaymentsClient()
.isReadyToPay(req)
.then(function(res) {
if (res.result) {
renderGooglePayButton();
} else {
console.log("Google Pay is not ready for this user.");
}
})
.catch(console.error);
}
function onGooglePaymentButtonClicked() {
// Create a new request data object for this request
const req = {
...deepCopy(baseGooglePayRequest),
transactionInfo: {
countryCode: 'US',
currencyCode: 'USD',
totalPriceStatus: 'FINAL',
totalPrice: (Math.random() * 999 + 1).toFixed(2),
},
// todo: callbackIntents (codelab gpay-web-201)
};
// Write request object to console for debugging
console.log(req);
getGooglePaymentsClient()
.loadPaymentData(req)
.then(function (res) {
// Write response object to console for debugging
console.log(res);
// @todo pass payment token to your gateway to process payment
// @note DO NOT save the payment credentials for future transactions
paymentToken = res.paymentMethodData.tokenizationData.token;
})
.catch(console.error);
}
คำอธิบายโค้ด
onGooglePayLoaded()จะเรียกใช้เมื่อสคริปต์pay.jsโหลดเสร็จแล้วตามที่กำหนดไว้ในไฟล์ HTML ระบบจะเรียกใช้เมธอดisReadyToPay()เพื่อพิจารณาว่าจะแสดงปุ่ม Google Pay หรือไม่ หากผู้บริโภคพร้อมชำระเงิน (หมายความว่าได้เพิ่มรูปแบบการชำระเงินลงใน Google Wallet แล้ว) ระบบจะแสดงปุ่ม Google PayonGooglePaymentButtonClicked()จะเรียกใช้เมื่อมีการคลิกปุ่ม Google Pay เมธอดนี้เรียกใช้เมธอดไลบรารีloadPaymentData()ซึ่งใช้เพื่อดึงโทเค็นการชำระเงิน เมื่อได้โทเค็นการชำระเงินแล้ว คุณจะต้องส่งโทเค็นไปยังเกตเวย์การชำระเงินเพื่อประมวลผลธุรกรรมtransactionInfoอธิบายธุรกรรมที่ควรประมวลผลเมื่อคลิกปุ่มนี้
7. บทสรุป
ขอแสดงความยินดีที่ทำ Codelab นี้เสร็จสมบูรณ์ คุณได้เรียนรู้วิธีผสานรวม Google Pay API เข้ากับเว็บไซต์แล้ว
เรียกใช้โปรเจ็กต์
ทดสอบด้วย Google Chrome
ใช้เว็บเบราว์เซอร์ Google Chrome แล้วเปิด index.html โดยใช้ไฟล์ > เปิดไฟล์... จากเมนูหลักของ Chrome Chrome จะเรียกใช้ main.js เมื่อเปิดโปรเจ็กต์ด้วยวิธีนี้ เว็บเบราว์เซอร์อื่นๆ อาจไม่อนุญาตให้เรียกใช้ JavaScript
– หรือ –
ทดสอบด้วยเว็บเซิร์ฟเวอร์ในเครื่อง
หากติดตั้ง Python ไว้ ให้เรียกใช้ python3 -m http.server จากพรอมต์เทอร์มินัลในโฟลเดอร์ pay-web-101 รูท
$ cd /your/path/to/pay-web-101
$ python3 -m http.server
Serving HTTP on :: port 8000 (http://[::]:8000/) ...
จากนั้นไปที่เว็บไซต์ของคุณที่ http://localhost:8000
ขั้นตอนถัดไป
แหล่งข้อมูลเพิ่มเติม
- เข้าร่วมการสนทนาในแชแนล#payments บน Discord
- ติดตาม @GooglePayDevs บน X
- ดูวิดีโอที่เกี่ยวข้องกับ Google Pay บน YouTube