결제 흐름에 할인코드 통합
ID: b15f94e9-2893-4b6c-a708-2341246bf65b
## 목표
결제 페이지에서 할인코드를 입력하고 검증/적용하는 기능 구현
## 작업 내용
### 1. 할인코드 검증 API (app/controllers/discount_codes_controller.rb 신규)
```ruby
# POST /discount_codes/validate
class DiscountCodesController < ApplicationController
def validate
result = DiscountCodes::ValidationService.call(
code: params[:code],
product: find_product, # payment_type으로 product 조회
amount: params[:amount].to_i
)
if result.success?
render json: {
valid: true,
discount_amount: result.discount_amount,
discount_code_id: result.discount_code.id,
message: "할인이 적용되었습니다"
}
else
render json: { valid: false, message: result.error }
end
end
end
```
### 2. 라우트 추가 (config/routes.rb)
```ruby
# admin 블록 바깥에 추가
post "discount_codes/validate", to: "discount_codes#validate"
```
### 3. 결제 흐름 수정
**PaymentsController#checkout 수정**:
- checkout_params에 `discount_code_id` 추가
- discount_code_id가 있으면 DiscountCodes::ValidationService로 재검증
- 검증 성공 시 CheckoutService에 discount_amount 전달
- 결제 완료 후 DiscountCodes::ApplyService로 사용 기록
**PaymentsController#success 수정**:
- 결제 확인 후 할인코드 사용 처리 (ApplyService)
### 4. Stimulus 컨트롤러 (app/javascript/controllers/discount_code_controller.js)
```javascript
// 할인코드 입력 + 검증 + UI 업데이트
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["input", "result", "discountAmount", "discountCodeId", "totalAmount"]
async validate() {
const code = this.inputTarget.value.trim()
if (!code) return
const response = await fetch("/discount_codes/validate", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-CSRF-Token": document.querySelector("[name='csrf-token']").content
},
body: JSON.stringify({
code,
amount: this.originalAmount,
payment_type: this.paymentType
})
})
const data = await response.json()
// UI 업데이트: 할인 금액 표시, hidden field 설정
}
}
```
### 5. 결제 뷰 수정
- 결제 페이지에 할인코드 입력 필드 추가
- 할인 적용 시 할인 금액과 최종 결제금액 표시
- hidden field로 discount_code_id 전달
### 6. CustomPaymentsController 수정
- 커스텀 결제 링크에서도 할인코드 사용 가능하게 (선택사항)
### 7. 테스트
- test/controllers/discount_codes_controller_test.rb (validate 엔드포인트)
- test/integration/payments_discount_test.rb (결제 + 할인코드 통합)
## ⚠️ 의존성
- model-dev가 DiscountCode 모델과 ValidationService를 완료해야 함
- 먼저 `bin/rails db:migrate` 실행하여 테이블 확인
- 모델/서비스가 없으면 컨트롤러/뷰/JS부터 작성
## 파일 담당 범위
- app/controllers/discount_codes_controller.rb (신규)
- app/javascript/controllers/discount_code_controller.js (신규)
- app/controllers/payments_controller.rb (수정)
- app/views/payments/ 관련 뷰 (수정)
- config/routes.rb (수정 - discount_codes/validate 추가)
- test/controllers/discount_codes_controller_test.rb (신규)
- test/integration/payments_discount_test.rb (신규)
## 완료 기준
- 결제 페이지에서 할인코드 입력/검증 가능
- 유효한 코드 입력 시 할인 금액 표시
- 결제 완료 시 할인코드 사용 기록
- 테스트 통과
첨부 이미지
이미지 추가 (Ctrl+V로 붙여넣기 또는 클릭)
JPEG, PNG, GIF, WebP / 최대 10MB
활동 로그
-
팀팀리드 상태 변경: 리뷰 → 완료
2026년 02월 28일 13:37:40
-
Ppayment-dev 상태 변경: 진행 중 → 리뷰
2026년 02월 28일 13:36:25
-
Ppayment-dev 결제 흐름 할인코드 통합 구현 완료
2026년 02월 28일 13:36:25
상세 보기
## 변경 사항
### 새 파일 생성
- `app/controllers/discount_codes_controller.rb` - 할인코드 검증 API 엔드포인트
- `app/javascript/controllers/discount_code_controller.js` - Stimulus 할인코드 UI 컨트롤러
- `app/views/payments/_discount_code.html.erb` - 할인코드 입력 재사용 Partial
- `test/controllers/discount_codes_controller_test.rb` - 검증 API 테스트 (9건)
- `test/controllers/payments_controller_test.rb` - 결제+할인코드 통합 테스트 (7건)### 수정 파일
- `config/routes.rb` - `POST /discount_codes/validate` 라우트 추가
- `app/controllers/payments_controller.rb` - checkout에 할인코드 검증/적용 로직, success에 ApplyService 호출
- `app/services/payments/checkout_service.rb` - `discount_code_id:` 파라미터 추가
- `config/locales/ko.yml` - discount_codes 번역 추가
- `config/locales/en.yml` - discount_codes 번역 추가
- `config/locales/zh.yml` - discount_codes 번역 추가
- `config/locales/vi.yml` - discount_codes 번역 추가### 보안 수정
- 클라이언트가 임의의 discount_amount를 전달해도 서버에서 항상 재검증
- discount_code_id가 유효하지 않으면 discount_amount = 0으로 강제### 테스트 결과
- 752 runs, 1916 assertions, 0 failures, 0 errors, 0 skips -
Ppayment-dev 결제 할인코드 통합 시작
2026년 02월 28일 13:24:12
상세 보기
## 기존 코드 분석 완료
- PaymentsController: checkout/success 흐름 파악
- CheckoutService: discount_amount 이미 지원
- ConfirmationService: 결제 확인 후 후처리 흐름 파악
- config/routes.rb 구조 파악
- 결제 뷰 파악 (payments/show, custom_payments/show)## 다음 단계
- model-dev의 DiscountCode 모델/서비스 완료 대기
- 그 동안 CSRF 안전한 validate 컨트롤러 + 라우트 + Stimulus + 테스트 준비 -
Ppayment-dev 티켓 클레임 완료
2026년 02월 28일 13:23:54