1. מבוא
מה תפַתחו
בסיום הקודלאב הזה, יהיה לכם אתר מינימלי שפועל עם שילוב של Google Pay. הפרויקט הזה מאחזר אסימון תשלום שעשוי להישלח לספק שירותי תשלומים לצורך עיבוד.
מה תלמדו
- איך טוענים ומגדירים את Google Pay API
- איך מציגים את הלחצן של Google Pay ומטפלים בקליקים
- איך מבקשים אסימון תשלום מ-Google Pay
מה נדרש
- עורך טקסט לבחירתכם לעריכת קובצי HTML ו-JavaScript.
- דפדפן האינטרנט Google Chrome או דרך אחרת לבדוק אתר מקומי.
- בסביבת הייצור, תצטרכו
merchantId
של Google Pay. ההרשמה במסוף של Google Pay ו-Wallet נמשכת רק דקה, אז כדאי לעשות את זה עכשיו.
איך עוקבים אחרי האירוע באמצעות Project IDX
2. יצירת דף ה-HTML
יצירת קבצים בפרויקט
- יוצרים במחשב תיקייה בשם
gpay-web-101
ובתוך התיקייה הזו יוצרים שני קובצי טקסט ריקים בשם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: מסמכי העזרה בנושא אובייקטי בקשות של 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. הוספת גורמים שמטפלים באירועים
בסקריפט הזה אנחנו מגדירים שני גורמים שמטפלים באירועים. הפונקציה הראשונה נקראת כשהטעינה של הספרייה 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 Pay. - הפונקציה
onGooglePaymentButtonClicked()
מופעלת כשלוחצים על לחצן Google Pay. השיטה הזו מפעילה את שיטת הספרייהloadPaymentData()
, שמשמשת לאחזור אסימון תשלום. לאחר קבלת אסימון התשלום, שולחים אותו ל-Payment Gateway לצורך עיבוד העסקה. השדהtransactionInfo
מתאר את העסקה שצריך לעבד בלחיצה על הלחצן הזה.
7. סיכום
כל הכבוד על השלמת ה-Codelab הזה! למדתם איך לשלב את Google Pay API באתר.
הרצת הפרויקט
בדיקה באמצעות Google Chrome
פותחים את index.html
בדפדפן האינטרנט Google Chrome באמצעות קובץ > פתיחת קובץ… בתפריט הראשי של 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