vue/nuxt

NUXT Vue 타입스크립트를 이용한 카카오페이 연동 2탄(실무기록)

coinf 2022. 12. 27. 11:52

이전 글 링크

https://asdf1326.tistory.com/4

 

NUXT Vue 타입스크립트를 이용한 카카오페이 연동 1탄

회사에서 카카오페이를 사용자사이트에 연결해달라는 요청이 들어왔다~ 카카오페이를 연동하는 방법에 대해서 간략하게 일기를 쓸예정이다! 카카오페이 개발 참고페이지 - 카카오페이 개발API

asdf1326.tistory.com

 

이전에 이제 승인요청 부분을 진행하여 이어가도록 하겟당.

kakaopay/index.vue 로돌아와서 로직을 처리해주자!

<template>
  <div>

  </div>
</template>
<script lang="ts">
import {Component, Vue} from "nuxt-property-decorator";
import ServerUrlDefines from '~/common/defines/serverUrlDefines';
import PurchaseRequestType, {PurchaseResultType} from "~/common/type/purchaseInfoType";
import {PaymentAgentType} from "~/common/type/paymentAgentType";
import {siteStore} from "~/store";
import {KakaoPayCompleteRequestDtoUtils} from "~/common/api/service/payment/kakaopay/dto/kakaoPayCompleteDto";
import {kakaoPayApi} from "~/common/api/service/payment/kakaopay/KakaoPayApi";
import {kakaoPayReadyUtils} from "~/common/api/service/payment/kakaopay/dto/kakaoPayReadyDto";
import NotificationStoreUtils from "~/store/utils/NotificationStoreUtils";

export class KakaoPayIndexUtils {
  static KeyOrderNo = 'orderNumber';
  static keyTid = 'tid';
  static KeyPurchaseResult = 'naverPayPurchaseResult';

  static setOrderNo(orderNo: string): void {
    sessionStorage.setItem(this.KeyOrderNo, orderNo);
  }

  static removeOrderNo(): void {
    sessionStorage.removeItem(this.KeyOrderNo);
  }

  static getOrderNo(): string | null {
    return sessionStorage.getItem(this.KeyOrderNo);
  }

  static payType(payType: string): void{
    sessionStorage.setItem('payType',payType);
  }

  static getPayType(): string | null{
    return sessionStorage.getItem('payType');
  }

  static setTid(tid: string): void{
    sessionStorage.setItem(this.keyTid,tid);
  }

  static getTid(): string | null{
    return sessionStorage.getItem(this.keyTid);
  }

  static removeTid(): void {
    sessionStorage.removeItem(this.keyTid);
  }

  static setPurchaseResult(request: PurchaseRequestType): void {
    sessionStorage.setItem(this.KeyPurchaseResult, JSON.stringify(request));
  }

  static removePurchaseResult(): void {
    sessionStorage.removeItem(this.KeyPurchaseResult);
  }

  static getPurchaseResult(): PurchaseRequestType | null {
    const jsonString = sessionStorage.getItem(this.KeyPurchaseResult);

    return jsonString ? JSON.parse(jsonString) : null;
  }

}

@Component({ name: 'kakaopay' })
export default class extends Vue {
  orderNo: string | null = null;
  tid: string | null = null;
  purchaseRequest: PurchaseRequestType | null = null;
  pgtoken: string | null = '';
  payType: string | null = null;

  mounted(): void {
    const query: string = window.location.search;
    const param = new URLSearchParams(query);
    const pgtoken = param.get('pg_token');

    this.pgtoken = pgtoken;

    this.orderNo = KakaoPayIndexUtils.getOrderNo();
    KakaoPayIndexUtils.removeOrderNo();

    this.tid = KakaoPayIndexUtils.getTid();
    KakaoPayIndexUtils.removeTid();

    this.purchaseRequest = KakaoPayIndexUtils.getPurchaseResult();
    KakaoPayIndexUtils.removePurchaseResult();

    this.payType = KakaoPayIndexUtils.getPayType();


    this.completePayment();
  }

  async completePayment(): Promise<void> {
    const completeRequest = KakaoPayCompleteRequestDtoUtils.createDto(this.tid, this.orderNo!, this.pgtoken!, this.payType!);

    try {
      sessionStorage.removeItem('payBack');
      const response = await kakaoPayApi.KakaoPayComplete(completeRequest);

      const purchaseResult = new PurchaseResultType(this.orderNo!, PaymentAgentType.KakaoPay, this.purchaseRequest!);

      siteStore.updatePurchaseResult(purchaseResult);


      siteStore.setPurchaseRequest(this.purchaseRequest!);

      await this.$router.push('/buy/complete');
    } catch (e) {
      const error = e as Error;
      console.log(error.message);
      const errMsg = error.message.substring(error.message.indexOf('-')+1, error.message.indexOf('-')+4);
      sessionStorage.removeItem('payBack');
      if(errMsg && error.message.includes('code')){
        alert(kakaoPayReadyUtils.errMessage(errMsg));
        const backPage =  sessionStorage.getItem('buyBackPage');
        location.href = `${ServerUrlDefines.wwwServer}${backPage}`;
      }else{
        alert(error.message);
        const backPage =  sessionStorage.getItem('buyBackPage');
        location.href = `${ServerUrlDefines.wwwServer}${backPage}`;
      }

    }
  }

}

</script>

 

카카오페이 index.vue 에는 카카오페이로 백엔드가 요청할때 필요한 값들을 셋팅하여 던져준다~

직접 결제 요청을 진행하면 스므스 하게 잘진행이된다. 이것으로 코인에 개발일기 끄읏~