From 514cc24fed89c743bddca2da1de25759da8e7e3d Mon Sep 17 00:00:00 2001 From: bkw535 Date: Fri, 1 Aug 2025 00:34:20 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[FEAT]=20=EA=B2=B0=EC=A0=9C=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A0=80=EC=9E=A5=20API=20JWT=20=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/payment/controller/payment.controller.js | 26 +++++++++++--------- src/payment/payment.routes.js | 2 +- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/payment/controller/payment.controller.js b/src/payment/controller/payment.controller.js index f0a8afc..15ef90a 100644 --- a/src/payment/controller/payment.controller.js +++ b/src/payment/controller/payment.controller.js @@ -5,19 +5,21 @@ import { PaymentService } from "../service/payment.service.js"; export const paymentConfirm = async (req, res, next) => { try { - const dto = new CreatePaymentDto({ - impUid: req.body.impUid, - merchantUid: req.body.merchantUid, - productId: req.body.productId, - userId: req.body.userId, - }); + const userId = req.user.id; + + const dto = new CreatePaymentDto({ + impUid: req.body.impUid, + merchantUid: req.body.merchantUid, + productId: req.body.productId, + userId: userId, + }); - const payment = await PaymentService.createPayment(dto); - const responseData = parseWithBigInt(stringifyWithBigInt(payment)); - res.status(StatusCodes.CREATED).success(responseData); - } catch (err) { - next(err); - } + const payment = await PaymentService.createPayment(dto); + const responseData = parseWithBigInt(stringifyWithBigInt(payment)); + res.status(StatusCodes.CREATED).success(responseData); + } catch (err) { + next(err); + } } export const getPayments = async (req, res, next) => { diff --git a/src/payment/payment.routes.js b/src/payment/payment.routes.js index 42901e9..4073d6f 100644 --- a/src/payment/payment.routes.js +++ b/src/payment/payment.routes.js @@ -6,7 +6,7 @@ import { authenticate } from "../middlewares/auth.middleware.js"; const router = express.Router(); // 결제 정보 저장 API -router.post("/complete", paymentConfirm); +router.post("/complete", authenticate, paymentConfirm); // 결제 정보 조회 API router.get("", authenticate, getPayments); From 69a99d93f196ef78a05c76707546bf3e189fc614 Mon Sep 17 00:00:00 2001 From: bkw535 Date: Fri, 1 Aug 2025 00:37:18 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[FEAT]=20payment=20swagger=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/swagger/payment.json | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/common/swagger/payment.json b/src/common/swagger/payment.json index 864e480..a133476 100644 --- a/src/common/swagger/payment.json +++ b/src/common/swagger/payment.json @@ -4,6 +4,11 @@ "post": { "summary": "결제 완료 처리", "description": "아임포트 imp_uid로 결제 검증 후 DB에 결제 내역, 포인트 거래 내역, 최종 포인트를 저장합니다.", + "security": [ + { + "bearerAuth": [] + } + ], "tags": ["Payment"], "requestBody": { "required": true, @@ -66,6 +71,25 @@ } } }, + "401": { + "description": "JWT 인증 실패 (Unauthorized)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "resultType": "FAIL", + "error": { + "errorCode": "AUTH001", + "reason": "유효하지 않은 토큰입니다.", + "data": null + }, + "success": null + } + } + } + }, "500": { "description": "서버 오류", "content": {