<p align="center">
  <a href="https://www.medusajs.com">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/59018053/229103275-b5e482bb-4601-46e6-8142-244f531cebdb.svg">
    <source media="(prefers-color-scheme: light)" srcset="https://user-images.githubusercontent.com/59018053/229103726-e5b529a3-9b3f-4970-8a1f-c6af37f087bf.svg">
    <img alt="Medusa logo" src="https://user-images.githubusercontent.com/59018053/229103726-e5b529a3-9b3f-4970-8a1f-c6af37f087bf.svg">
    </picture>
  </a>
</p>
<h1 align="center">
  Medusa-Payment-Tosspayments
</h1>

<h4 align="center">
  <a href="https://docs.medusajs.com">Documentation</a> |
  <a href="https://www.medusajs.com">Website</a>
</h4>

## Feature

- 결제 승인
- [Medusa's Next.js starter storefront](https://docs.medusajs.com/starters/nextjs-medusa-starter)와 통합

### ⚠️ Under Development

- 결제위젯과 브랜드페이는 아직 지원하지 않습니다.
- 토스페이먼츠 API 버전은 2022-11-16만 지원하고 있습니다.
- 현재 카드 결제 방식만 지원하고 있습니다. (아래 표 참고)

| 결제 방식 | 카드 | 가상계좌 | 계좌이체 | 휴대폰 결제 | 상품권 | 해외 간편결제 |
| :-------: | :--: | :------: | :------: | :---------: | :----: | :-----------: |
| 지원 여부 |  ✅  |    🚫    |    🚫    |     🚫      |   🚫   |      🚫       |

## Prerequisites

- [Medusa backend](https://medusajs.com/)
- [토스페이먼츠 상점](https://www.tosspayments.com/)

## Installation

1. 아래 명령어를 통해 Medusa backend에 plugin을 설치해주세요.

```bash
npm install medusa-payment-tosspayments --save
```

2. 아래와 같이 환경 변수를 설정해주세요.

```env
TOSSPAYMENTS_DEBUG=true # 디버깅용 로그가 필요하지 않는 경우 false로 설정해주시면 됩니다.
TOSSPAYMENTS_KEY=<API 개발 연동 시크릿 키>
TOSSPAYMENTS_VERSION=2022-11-16 # 2024-08-22 현재 가장 최신 API 버전
```

> [!WARNING]
>
> `TOSSPAYMENTS_KEY`에는 [Tosspayments Docs](https://docs.tosspayments.com/reference/using-api/authorization) 에서 base64로 인코딩된 키가 필요합니다.

3. `medusa-config.js`에 있는 plugins 항목에 아래와 같이 설치한 `medusa-payment-tosspayments`를 추가해주세요.

```js
const plugins = [
  //...
  {
    resolve: "medusa-payment-tosspayments",
    options: {
      is_debug: process.env.TOSSPAYMENTS_DEBUG,
      tosspayments_key: process.env.TOSSPAYMENTS_KEY,
      tosspayments_version: process.env.TOSSPAYMENTS_VERSION,
    },
  },
  //...
];
```

## Client Side

[Medusa's Next.js starter storefront](https://docs.medusajs.com/starters/nextjs-medusa-starter) 에서 사용하는 기준으로 설명이 적혀있습니다.

1. 먼저 [`@tosspayments/tosspayments-sdk`](https://docs.tosspayments.com/sdk/v2/js)를 설치해주세요.

2. [React Context](https://react.dev/reference/react/createContext)를 생성하여 checkout 페이지에서 Tosspayments 인스턴스를 정상적으로 불러올 수 있도록 합니다.

3. action에서 payments 결제 승인을 위한 데이터를 주고 받기 위해 업데이트를 해줄 수 있는 함수를 생성합니다. 자세한 내용은 [Medusa Docs](https://docs.medusajs.com/api/store#carts_postcartscartpaymentsessionupdate)에서 확인해주세요.

4. Tosspayments 결제창을 실행할 수 있는 버튼을 생성합니다.

5. Admin 페이지에서 결제 수단에 tosspayments를 추가하고 버튼을 확인할 수 있습니다.

## Reference

- [TossPayments 결제 API SDK](https://github.com/yujutown/tosspayments-sdk.js)
- [medusa-payment-paystack](https://github.com/a11rew/medusa-payment-paystack/tree/main)
