วิธีสร้างการเชื่อมต่อกับ Google APIs ใน Java

1. ก่อนเริ่มต้น

ข้อกำหนดเบื้องต้น

  • คุณดำเนินการขั้นตอนที่ 1 และ 2 ของกระบวนการติดตั้งใช้งานเรียบร้อยแล้ว
  • คุณสามารถโฮสต์เซิร์ฟเวอร์ Java ที่ให้ไว้โดยมีการสิ้นสุด TLS โดยใช้ Google App Engine หรือโซลูชันของคุณเองในโดเมนที่กำหนดค่าไว้กับ Google
  • Java ติดตั้งอยู่ในระบบของคุณ

สิ่งที่คุณจะได้เรียนรู้

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

2. การตั้งค่าและข้อกำหนด

ดาวน์โหลดแอปพลิเคชัน

ดาวน์โหลดโค้ดตัวอย่าง Java

ภาพรวมโครงสร้างแอปพลิเคชัน

โค้ดตัวอย่างของ Java จะผสานรวมเข้ากับ Standard Payments API ของ Google โครงสร้างโปรเจ็กต์โค้ดตัวอย่างมีไดเรกทอรี outbound และไดเรกทอรี inbound เพื่อแสดงคำขอเสียงสะท้อนขาเข้าจาก Google ไปยังพาร์ทเนอร์ และคำขอขาออกจากการติดตั้งใช้งานของพาร์ทเนอร์ไปยัง Google

ไดเรกทอรีทั้งสองนี้มีลำดับชั้นที่คล้ายคลึงกันในแพ็กเกจตามชั้น เลเยอร์หลัก 3 เลเยอร์คือ controller, service และ domain

  • แพ็กเกจ controller มี API
  • แพ็กเกจ service มีหน้าที่รับผิดชอบตรรกะทางธุรกิจ, การเข้ารหัส base64url และการเข้ารหัส
  • แพ็กเกจ domain มี POJO

การอ้างอิงการติดตั้ง

ไปที่ไดเรกทอรีโปรเจ็กต์และเรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งทรัพยากร Dependency ที่จำเป็นโดยใช้ Maven Wrapper หากใช้ App Engine คุณสามารถข้ามขั้นตอนนี้ได้

./mvnw install

3. กำหนดค่ารหัสบัญชีผู้รวมการชำระเงิน (PIAID)

รหัสบัญชีผู้รวมการชําระเงิน (PIAID) คือตัวระบุที่ใช้ระบุการผสานรวมโดยไม่ซ้ำกัน คุณควรได้รับ PIAID จาก Google แล้วด้วยการทำตามข้อกำหนดเบื้องต้นก่อนที่จะเริ่มบทแนะนำนี้

  1. ไปที่ src/main/resources/application.properties ในไดเรกทอรีโปรเจ็กต์
  2. ตั้งค่าพร็อพเพอร์ตี้ payment.integrator.account.id เป็น PIAID ที่ Google ออกให้คุณ
payment.integrator.account.id={YOUR_PAYMENT_INTEGRATOR_ACCOUNT_ID}

4. ตั้งค่า URL เสียงก้องที่ Google โฮสต์

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

  1. ไปที่ src/main/resources/application.properties ในไดเรกทอรีโปรเจ็กต์
  2. ตั้งค่าพร็อพเพอร์ตี้ 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 ไปยังไฟล์
  • ไปยัง src/resources/passphrase1.txt และเพิ่มรหัสผ่านลับลงในไฟล์

การเพิ่มคีย์ PGP

หากต้องการเปิดใช้การเข้ารหัสคีย์แบบคู่ ให้เพิ่มคีย์สาธารณะที่ 2 ลงใน publicKey2.gpg เพิ่มคีย์ส่วนตัวใบที่ 2 ลงใน privateKey2.gpg แล้วเพิ่มข้อความรหัสผ่านที่ 2 ใน passphrase.txt หลังจากกดคีย์ที่ 2 แล้ว ให้ยกเลิกการแสดงความคิดเห็นบรรทัดโค้ดที่แสดงความคิดเห็นไว้ ซึ่งมีหน้าที่โหลดคีย์คู่ที่ 2 ใน KeyConfig.addPrivateKeyAndPassphrase(...) และ KeyConfig.addPublicKeys(...)

เยี่ยมมาก คุณพร้อมที่จะเรียกใช้แอปพลิเคชันแล้ว

6. เรียกใช้แอปพลิเคชัน

หากต้องการเริ่มแอปพลิเคชัน ให้เรียกใช้คำสั่งต่อไปนี้

  $ ./mvnw spring-boot:run

หากคุณกำลังเรียกใช้อินสแตนซ์ App Engine ที่กำหนดค่าไว้ล่วงหน้า ให้เรียกใช้คำสั่งนี้แทน

$ gcloud app deploy

โดยค่าเริ่มต้น เซิร์ฟเวอร์จะรับข้อมูลผ่านพอร์ต 8080 หากต้องการดู UI ของ Open API Swagger ให้ไปที่ URL ด้านล่าง

https://{APPLICATION_HOST}/swagger-ui.html

7. ทดสอบการเชื่อมต่อ Google Standard Payments Outbound API

ขณะนี้แอปพลิเคชันทำงานแล้ว ถึงเวลาทดสอบการเชื่อมต่อกับ Google echo API

คุณสามารถใช้ Swagger UI หรือ CLI เพื่อเรียกใช้คำสั่งต่อไปนี้เพื่อเริ่มต้นการเรียกจากอินสแตนซ์ของแอปพลิเคชันตัวอย่างไปยังเซิร์ฟเวอร์ของ Google ตัวอย่าง Echo API ของแอปพลิเคชันตัวอย่างยอมรับคำขอ POST ในรูปแบบข้อความธรรมดา หลังจากได้รับคำขอแล้ว คำขอหลังจากนั้นจะถูกส่งไปยัง API ที่โฮสต์โดย Google

ส่งคำขอผ่านบรรทัดคำสั่ง

แทนที่ HOSTNAME ด้วยชื่อโฮสต์เซิร์ฟเวอร์ก่อนเรียกใช้คำสั่ง

  $ curl -X POST -H 'Content-Type: text/plain' -d 'Hello from Partner Bank!' https://{HOSTNAME}/echo

ส่งคำขอใน UI ของ Swagger

หากต้องการส่งคำขอด้วย UI ของ Swagger ให้ไปที่ https://{APPLICATION_HOST}/swagger-ui และตั้งค่าข้อความไคลเอ็นต์ในเนื้อหาคำขอ คลิกปุ่ม "ดำเนินการ" เมื่อคุณพร้อมที่จะส่งคำขอไปยัง Google

การส่งคำขอ Echo GSP ผ่าน Swagger

รับคำตอบ

คำขอ API ที่ประสบความสำเร็จจะได้รับการตอบสนองต่อไปนี้จาก Google

{
   "responseHeader":{
      "responseTimestamp":"1606710026723"
   },
   "clientMessage":"Hello from  Bank Little Bear!",
   "serverMessage":"Server message."
}

ทีละขั้นตอน

เมื่อเซิร์ฟเวอร์ของคุณส่งคำขอสำเร็จแล้ว เราจะมาดูการทำงานกัน

สร้างคำขอ

createEchoRequestWithMessage ใน OutboundEchoService จะสร้างคำขอ echo ที่ส่งไปยัง API ของ Google

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 ที่เข้ารหัสและเข้ารหัสไว้ ดังนั้น จึงต้องถอดรหัสและถอดรหัสด้วยก่อนที่จะสามารถแสดงผลเป็นข้อความธรรมดา เมธอด base64url ของ decrypt จะถอดรหัสและถอดรหัสการตอบสนอง

String decryptedData =
     pgpEncryptor.decrypt(postStandardPaymentsEchoApi(encryptedMessage).getBody());

ตอบกลับ

การตอบกลับจะมีการแสดงผลพร้อมรหัสสถานะการตอบกลับ HTTP 202

return new ResponseEntity<>(decryptedData, HttpStatus.ACCEPTED);

8. ทดสอบการเชื่อมต่อ API ขาเข้า

ในการทดสอบการเชื่อมต่อ Echo API ขาเข้า Google จะส่งคำขอไปยัง Partner echo API ที่โฮสต์ไว้ เมื่อคุณพร้อม โปรดติดต่อตัวแทนของ Google เพื่อเรียกให้คําขอนี้จาก Google แสดง

การทดสอบเสียงก้องจะเสร็จสมบูรณ์เมื่อคุณอ่านคําขอเสียงสะท้อนขาเข้าจาก Google ได้และตอบกลับด้วยการตอบสนองเสียงก้องที่ถูกต้อง

ทีละขั้นตอน

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

ถอดรหัส Base64url และถอดรหัสคำขอ

เมื่อได้รับคำขอ PgpEncryptor.java จะเรียก decrypt ซึ่งจะถอดรหัส base64url และถอดรหัสคำขอ

String decryptedRequest = pgpEncryptor.decrypt(echoRequest);

รับคำขอ

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

{
  "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)

ตอบกลับ

การตอบกลับจะมีการแสดงผลพร้อมรหัสสถานะการตอบกลับ HTTP 202

return new ResponseEntity<>(pgpEncryptor.encrypt(echoResponseString), HttpStatus.ACCEPTED);

9. ยินดีด้วย

ใน Codelab นี้ คุณสร้างการเชื่อมต่อกับ Payments API สำเร็จแล้ว