1. לפני שמתחילים
דרישות מוקדמות
- השלמתם את שלבים 1 ו-2 בתהליך ההטמעה.
- אפשר לארח את שרת Java שסופק עם סיום TLS באמצעות Google App Engine או פתרון משלכם בדומיין שהוגדר ב-Google.
- Java מותקנת בסביבה.
הנושאים שתלמד
- איך מאמתים את הקישוריות על ידי שליחת בקשה תקינה ל-Google echo API.
- איך מקבלים בקשה מ-Google, מפענחים אותה ומנתחים אותה ב-Partner Hosted echo API.
2. הגדרה ודרישות
הורדת האפליקציה
מורידים את קוד לדוגמה ב-Java.
סקירה כללית על מבנה האפליקציה
קוד לדוגמה ב-Java משולב עם ממשקי ה-API של Google לתשלומים סטנדרטיים. מבנה פרויקט קוד לדוגמה מכיל ספרייה בשם outbound וספרייה בשם inbound, כדי לשקף את בקשת ההד של התקשורת הנכנסת מ-Google אל השותף ואת הבקשה של התקשורת היוצאת מההטמעה של השותף אל Google.
שני הספריות האלה מכילות היררכיה דומה באריזה לפי שכבה. שלוש השכבות הראשיות הן controller, service ו-domain.
- החבילה
controllerמכילה את ממשקי ה-API. - חבילת
serviceאחראית ללוגיקה העסקית, לקידוד base64url ולהצפנה. - חבילת
domainמכילה POJO.
התקנת יחסי תלות
עוברים לספריית הפרויקט ומריצים את הפקודה הבאה כדי להתקין את יחסי התלות הנדרשים באמצעות Maven Wrapper. אם אתם משתמשים ב-App Engine, אתם יכולים לדלג על השלב הזה.
./mvnw install
3. הגדרת מספר חשבון משולב תשלומים (PIAID)
מספר החשבון של משלב התשלומים (PIAID) הוא מזהה שמשמש לזיהוי ייחודי של השילובים שלכם. לפני שמתחילים את המדריך הזה, צריך לוודא שקיבלתם מ-Google את מזהה PIAID אחרי שהשלמתם את הדרישות המוקדמות.
- עוברים אל
src/main/resources/application.propertiesבספריית הפרויקט. - מגדירים את הנכס
payment.integrator.account.idלמזהה PIAID שהונפק לכם על ידי Google.
payment.integrator.account.id={YOUR_PAYMENT_INTEGRATOR_ACCOUNT_ID}
4. הגדרת כתובת ה-URL של ההד המתארחת ב-Google
כתובת ה-URL של echo שמתארחת ב-Google משתנה בהתאם ל-API שאיתו אתם משלבים. נכנסים למאמרי העזרה של ה-API לגבי סוג השילוב הספציפי ומעתיקים את כתובת ה-URL של ה-API לאבחון. אחרי שמעתיקים את כתובת ה-URL, ממשיכים לשלבים הבאים כדי לעדכן אותה בפרויקט Java.
- עוברים אל
src/main/resources/application.propertiesבספריית הפרויקט. - מגדירים את המאפיין
API_SERVICE_NAMEכך שיתאים למה שמופיע בתיעוד למפתחים.
google.hosted.echo.url=vgw.googleapis.com/gsp/{API_SERVICE_NAME}/echo/
5. הוספת מפתחות PGP
כדי להפעיל הצפנת PGP, מוסיפים את מפתחות ה-PGP שלכם כמו שמוצג בהמשך.
- עוברים אל
src/resources/publicKey1.gpgומוסיפים את המפתח הציבורי בפורמט ASCII מוגן לקובץ. - עוברים אל
src/resources/privateKey1.gpgומוסיפים את המפתח הפרטי בפורמט ASCII armored לקובץ. - עוברים אל
src/resources/passphrase1.txtומוסיפים את ביטוי הסיסמה הסודי לקובץ.

כדי להפעיל הצפנה באמצעות שני מפתחות, מוסיפים את המפתח הציבורי השני ל-publicKey2.gpg, מוסיפים את המפתח הפרטי השני ל-privateKey2.gpg ומוסיפים את ביטוי הסיסמה השני ל-passphrase.txt. אחרי שמוסיפים את המפתחות השניים, מבטלים את הסימון כהערה בשורות הקוד שהן האחראיות לטעינת זוג המפתחות השני ב-KeyConfig.addPrivateKeyAndPassphrase(...) וב-KeyConfig.addPublicKeys(...).
מצוין, הכול מוכן להרצת האפליקציה!
6. הרצת האפליקציה
כדי להפעיל את האפליקציה, מריצים את הפקודה הבאה.
$ ./mvnw spring-boot:run
אם אתם מריצים מכונה וירטואלית של App Engine שהוגדרה מראש, מריצים את הפקודה הזו במקום.
$ gcloud app deploy
כברירת מחדל, השרת יאזין ליציאה 8080. כדי להציג את ממשק המשתמש של Open API Swagger, עוברים לכתובת ה-URL שבהמשך.
https://{APPLICATION_HOST}/swagger-ui.html
7. בדיקת הקישוריות של Google Standard Payments Outbound API
עכשיו שהאפליקציה פועלת, הגיע הזמן לבדוק את הקישוריות ל-Google echo API.
אפשר להשתמש בממשק המשתמש של Swagger או ב-CLI כדי להריץ את הפקודה הבאה ולהתחיל שיחה מהמופע של אפליקציית הדוגמה לשרתים של Google. ה-API של אפליקציית הדוגמה echo מקבל בקשת POST בטקסט פשוט. אחרי קבלת הבקשה, נשלחת בקשה נוספת אל ה-API שמתארח ב-Google.
שליחת בקשה דרך שורת הפקודה
מחליפים את HOSTNAME בשם של מארח השרת לפני שמריצים את הפקודה.
$ curl -X POST -H 'Content-Type: text/plain' -d 'Hello from Partner Bank!' https://{HOSTNAME}/echo
שליחת בקשה בממשק המשתמש של Swagger
כדי לשלוח בקשה באמצעות Swagger UI, עוברים אל https://{APPLICATION_HOST}/swagger-ui ומגדירים את הודעת הלקוח בגוף הבקשה. כשמוכנים לשלוח את הבקשה ל-Google, לוחצים על הלחצן Execute (ביצוע).

קבלת התשובה
בקשת API שמושלמת בהצלחה תניב את התגובה הבאה מ-Google.
{
"responseHeader":{
"responseTimestamp":"1606710026723"
},
"clientMessage":"Hello from Bank Little Bear!",
"serverMessage":"Server message."
}
שלב אחר שלב
אחרי שהשרת שלכם שלח בקשה בהצלחה, נסביר איך זה קרה.
הרכבת הבקשה
createEchoRequestWithMessage ב-OutboundEchoService יוצר את הבקשה echo שנשלחת אל Google API.
String jsonEchoRequestMessage = objectMapper.writeValueAsString(createEchoRequestWithMessage(message));
הבקשה שנוצרת כוללת את clientMessage, וגם כמה שדות של ערכי ברירת מחדל.
{
"requestHeader":{
"protocolVersion":{
"major":1,
"minor":0,
"revision":0
},
"requestId":"ddfe0fd0-ffdc-4fcf-991a-f0611ec83970",
"requestTimestamp":"1606715389040"
},
"clientMessage":"Hello from Bank Little Bear!"
}
קידוד Base64url והצפנה של הבקשה
כל הבקשות מוצפנות ומקודדות בפורמט base64url. בדוגמה הזו, PgpEncryptor.java מכיל שיטות עזר שמבצעות הצפנה ופענוח, וגם קידוד base64url בשבילכם. השיטה שלמטה מקודדת את הבקשה ומבצעת הצפנה באמצעות המפתח הציבורי של Google.
String encryptedMessage = pgpEncryptor.encrypt(jsonEchoRequestMessage);
שליחת בקשת POST
ההודעה המוצפנת נשלחת באמצעות בקשת POST.
postStandardPaymentsEchoApi(encryptedMessage)
מפענח את התגובה ומפענח את הקידוד base64url שלה, ומחזיר את התגובה
התשובה המוצלחת של Google מקודדת ומצפנת ב-base64url, ולכן צריך גם לפענח ולבטל את ההצפנה שלה לפני שאפשר להחזיר אותה בטקסט רגיל. השיטה decrypt מפענחת את התגובה מקידוד base64url ומבטלת את ההצפנה שלה.
String decryptedData =
pgpEncryptor.decrypt(postStandardPaymentsEchoApi(encryptedMessage).getBody());
החזרת התשובה
התשובה מוחזרת עם קוד הסטטוס 202 של HTTP.
return new ResponseEntity<>(decryptedData, HttpStatus.ACCEPTED);
8. בדיקת הקישוריות של API נכנס
כדי לבדוק את הקישוריות של ה-API של הד נכנס, Google תשלח בקשה ל-API של הד שמארח השותף. כשאתם מוכנים, אתם יכולים לפנות לאיש הקשר שלכם ב-Google כדי להפעיל את הבקשה הזו מ-Google.
הבדיקה מסתיימת כשאתם מצליחים לקרוא את בקשת האקו הנכנסת מ-Google ולהשיב עם תגובת אקו תקינה.
שלב אחר שלב
אחרי שהבקשה התקבלה בהצלחה בשרת וטופלה, נבדוק איך זה קרה.
פענוח Base64url ופענוח הבקשה
כשמתקבלת בקשה, PgpEncryptor.java יפעיל את decrypt, שיפענח את הבקשה מקידוד base64url ויבצע פענוח.
String decryptedRequest = pgpEncryptor.decrypt(echoRequest);
קבלת הבקשה
Google שלחה מטען ייעודי (payload) של הודעה שדומה לזה שמופיע בהמשך, אחרי שהוא פוענח ופוענח.
{
"requestHeader": {
"protocolVersion": {
"major": 1
},
"requestId": "G1MQ0YERJ0Q7LPM",
"requestTimestamp": {
"epochMillis":1481899949606
},
"paymentIntegratorAccountId": "abcdef123456"
},
"clientMessage": "echo Me"
}
יצירת התשובה
אחרי שקוראים בהצלחה את בקשת האקו הנכנסת, אפשר ליצור את התגובה.
private EchoResponse convertEchoRequestStringToEchoResponse(String decryptedRequest);
התשובה כוללת את ההודעה מ-Google, וגם חותמת זמן והודעה מהשרת.
{
"responseHeader": {
"responseTimestamp": {
"epochMillis":1481899950236
}
},
"clientMessage": "echo Me",
"serverMessage": "Debug ID 12345"
}
קידוד Base64url והצפנה של התגובה
מכיוון שכל הבקשות מוצפנות ומקודדות בפורמט base64url, PgpEncryptor.java קוראת ל-encrypt כדי לקודד בפורמט base64url ולהצפין את הבקשה.
pgpEncryptor.encrypt(echoResponseString)
החזרת התשובה
התשובה מוחזרת עם קוד הסטטוס 202 של HTTP.
return new ResponseEntity<>(pgpEncryptor.encrypt(echoResponseString), HttpStatus.ACCEPTED);
9. מעולה!
ב-Codelab הזה, יצרתם קישוריות ל-Payments API.