Node.js에서 Payments API와의 연결을 설정하는 방법

1. 시작하기 전에

이 Codelab은 Stanadard Payments API와의 연결을 설정하는 방법을 살펴보는 자기 주도형 Codelab입니다.

기본 요건

  • 구현 절차의 1단계와 2단계를 완료했습니다.
  • Google App Engine 또는 Google로 구성된 도메인에서 자체 솔루션을 사용하여 TLS 종료로 제공된 Node.js 서버를 호스팅할 수 있습니다.
  • Node.js가 사용자 환경에 설치됩니다.

학습할 내용

  • Google Standard Payments echo API에 유효한 요청을 전송하여 연결을 확인하는 방법
  • Google에서 Partner Hosted Echo API로 요청을 수신, 복호화, 파싱하는 방법입니다.

2. 설정 및 요구사항

애플리케이션 다운로드

Node.js 샘플 코드를 다운로드합니다.

종속 항목 설치

프로젝트 디렉터리로 이동하고 다음 명령어를 실행하여 필요한 종속 항목을 설치합니다. App Engine을 사용하는 경우 이 단계를 건너뛸 수 있습니다.

npm install

3. 결제 통합업체 계정 ID (PIAID) 구성

결제 통합업체 계정 ID (PIAID)는 통합을 고유하게 식별하는 데 사용되는 식별자입니다. 이 튜토리얼을 시작하기 전에 기본 요건을 완료하여 Google로부터 PIAID를 받으셨을 것입니다.

  1. 프로젝트 디렉터리의 server.js 파일로 이동합니다.
  2. PIAID 변수를 Google에서 발급한 PIAID로 설정합니다.
const PIAID = '{PAYMENT_INTEGRATOR_ACCOUNT_ID}';

4. PGP 키 추가

프로젝트 구조에서 다음 파일을 만들고 PGP 키를 추가하여 PGP 암호화를 사용 설정하세요.

  • public.key라는 파일을 만들고 파일에 ASCII armored 공개 키를 추가합니다.
  • private.key라는 파일을 만들고 파일에 ASCII armored 비공개 키를 추가합니다.
  • passphrase.txt라는 파일을 만들고 파일에 보안 비밀 암호를 추가합니다.

PGP 키 추가

이제 애플리케이션을 실행할 준비가 되었습니다.

5. 애플리케이션 실행

다음 명령어를 실행하여 애플리케이션을 시작합니다.

$ node server.js
Server listening on port 8080...

사전 구성된 App Engine 인스턴스를 실행하는 경우 이 명령어를 대신 실행합니다.

$ gcloud app deploy

기본적으로 서버는 포트 8080에서 수신 대기합니다.

6. Google Standard Payments API 연결 테스트

이제 애플리케이션이 실행되고 있으므로 Google Standard Payments echo API와의 연결을 테스트할 차례입니다.

다음 명령어를 실행하여 샘플 애플리케이션의 인스턴스에서 Google 서버로 호출을 시작합니다. 샘플 애플리케이션 echo API는 일반 텍스트로 POST 요청을 허용합니다. 요청을 받으면 후속 요청이 Google 호스팅 API로 전송됩니다.

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

API 요청이 성공하면 Google에서 다음과 같은 응답을 받게 됩니다.

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

단계별 보기

이제 서버에서 요청을 성공적으로 전송했으므로 어떻게 작동하는지 살펴보겠습니다.

요청 빌드

bodyHelpers.jsbuildEchoRequestBody는 Google의 API로 전송된 echo 요청을 빌드합니다.

const message = bodyHelpers.buildEchoRequestBody(req.body);

생성된 요청에는 clientMessage와 여러 기본값 필드가 포함됩니다.

{
   "requestHeader":{
      "protocolVersion":{
         "major":1,
         "minor":0,
         "revision":0
      },
      "requestId":"ddfe0fd0-ffdc-4fcf-991a-f0611ec83970",
      "requestTimestamp":"1606715389040"
   },
   "clientMessage":"Hello from Little Bear"
}

요청 암호화

모든 요청은 암호화되고 base64url로 인코딩됩니다. 이 샘플에서 crypto.js에는 암호화 및 복호화를 수행하는 도우미 메서드가 포함되어 있습니다. crypto.encrypt 메서드는 Google의 공개 키를 사용하여 암호화를 수행합니다.

const encrypted = await crypto.encrypt(message);

base64url로 인코딩된 POST 요청 전송

암호화된 메시지는 base64url 패키지를 사용하여 base64url로 인코딩되고 axios를 사용하여 POST 요청을 통해 전송됩니다.

const response = await axios.post(ECHO_URL, base64url(encrypted), AXIOS_CONFIG);

응답 복호화 및 반환

Google의 성공적인 응답은 base64url로 인코딩되고 암호화되므로 일반 텍스트로 반환되기 전에 디코딩 및 복호화해야 합니다.

const encryptedMessage = base64url.toBuffer(response.data);
const decryptedResponse = await crypto.decrypt(encryptedMessage);
res.status(200);
res.send(decryptedResponse);

7. 파트너 API 연결 테스트

파트너 echo API 연결을 테스트하기 위해 Google에서 Partner Hosted echo API에 요청을 전송합니다.

준비가 되면 Google 담당자와 협력하여 Google에서 이 요청을 트리거하세요.

Google의 인바운드 에코 요청을 읽고 유효한 에코 응답으로 응답할 수 있으면 에코 테스트가 완료된 것입니다.

단계별 보기

이제 서버가 성공적으로 요청을 수신하고 처리했으므로 어떻게 작동하는지 살펴보겠습니다.

요청을 Base64url로 디코딩

요청을 받으면 먼저 base64url로 디코딩해야 합니다.

const encryptedRequest = base64url.toBuffer(req.body);

요청 복호화

base64url로 요청을 디코딩한 후에는 복호화해야 합니다.

const decryptedRequest = await crypto.decrypt(encryptedRequest);

요청 수신

Google에서는 디코딩 및 복호화된 후 다음과 유사한 메시지 페이로드를 전송했습니다.

{
  "requestHeader": {
    "protocolVersion": {
      "major": 1
    },
    "requestId": "G1MQ0YERJ0Q7LPM",
    "requestTimestamp": {
      "epochMillis":1481899949606
    },
    "paymentIntegratorAccountId": "abcdef123456"
  },
  "clientMessage": "echo Me"
}

응답 빌드

인바운드 에코 요청을 성공적으로 읽었다면 응답을 빌드할 준비가 된 것입니다.

clientMessage = JSON.parse(decryptedRequest).clientMessage;
responseBody = bodyHelpers.buildEchoResponseBody(clientMessage);

응답에는 Google의 메시지뿐 아니라 타임스탬프 및 서버의 메시지가 포함됩니다.

{
  "responseHeader": {
    "responseTimestamp": {
      "epochMillis":1481899950236
    }
  },
  "clientMessage": "echo Me",
  "serverMessage": "Debug ID 12345"
}

응답 암호화 및 base64 인코딩

응답 메시지를 작성했으면 이를 암호화하고 base64url로 인코딩할 수 있습니다.

encryptedResponse = await crypto.encrypt(responseBody);
const encodedResponse = base64url(encryptedResponse);

응답 반환

이제 마지막으로 POST 응답을 보낼 준비가 되었습니다.

res.send(encodedResponse);

8. 축하합니다.

이 Codelab을 통해 Echo API와의 연결을 성공적으로 설정했습니다.