💰 결제 시스템 — 완전 분석

명함 발송에 필요한 결제 시스템의 모든 로직을 분석합니다. 포인트 충전부터 실제 결제 처리까지.

⚙️ settlement(val, frm, auto_up) — 결제의 중심

이 함수 하나가 모든 결제 로직을 처리합니다. val 파라미터로 동작이 완전히 바뀝니다.

function settlement(val, frm, auto_up) {
    // val 값에 따른 6가지 모드:
    //
    // "set"       → 상품 선택, 수량 입력 단계
    // "auto"      → 자동 충전 설정
    // "finish"    → 최종 결제 실행
    // "make"      → 명함 제작 요청
    // "card_send" → 명함 발송 결제 실행
    // "card_con_send" → 명함 콘텐츠 발송

    // === 공통 변수 수집 ===
    var item_price = $('#item_price').val();   // 상품 단가
    var item_cnt   = $('#item_cnt').val();     // 수량
    var total_amt  = item_cnt * item_price;    // 총액
    var member_type = $('#member_type').val(); // 회원 유형
    var [결제수단변수] = ...; // 결제수단

    // === "card_send" 모드 (명함 발송 결제) ===
    if (val === "card_send") {
        // 1. 메시지 수집
        var msg = $('#message').val();
        var card_url = $('#card_url').val();
        var send_mode = $("input[name=card_send_mode]:checked").val();

        // 2. 주문번호 생성 (날짜 + 랜덤)
        var now = new Date();
        var orderNo = '' + now.getFullYear() +
            ('0' + (now.getMonth()+1)).slice(-2) +
            ('0' + now.getDate()).slice(-2) +
            ('0' + now.getHours()).slice(-2) +
            ('0' + now.getMinutes()).slice(-2) +
            ('0' + now.getSeconds()).slice(-2) +
            Math.floor(Math.random() * 1000);
        // 예: 2026050121361877 → YYYYMMDDHHmmss + 랜덤3자리

        // 3. AJAX 결제 요청
        $.ajax({
            url: "[내부API]/[명함발송]",
            type: "POST",
            data: {
                [정산유형]: [모드],           // "card_send""
                [결제수단]: [결제수단변수],       // "bank" or "card""
                member_type: member_type,
                [결제금액파라미터]: [총액],       // 결제 금액
                [수수료비율]: 90,            // 수수료 10% 차감
                [주문번호파라미터]: [주문번호],    // 주문번호
                point_val: point_val,
                card_url: card_url,         // 명함 URL
                message: msg,               // 발송 메시지
                card_send_mode: send_mode   // clone(0) / share(1)
            },
            success: function(res) {
                if (res === 'success' || res.result === 'success') {
                    alert('발송이 완료되었습니다!');
                    refresh_page();
                } else {
                    // 결제 실패 → 오류 페이지로
                    location.href = "[내부페이지]/[결제오류]?err=1";
                }
            },
            error: function() {
                // 네트워크 오류 → 안내 페이지로
                location.href = "[내부페이지]/[결제오류]?err=2";
            }
        });
    }
}

💳 결제 수단별 처리

결제 수단결제수단 값특징
계좌이체"bank"수동 승인 필요, 영업시간 내 처리
카드결제"card"즉시 승인, Allat PG 연동
⚠️ 결제 중요 상수

[수수료비율] = 90
이 값은 모든 발송 결제에 적용됩니다. 사용자가 결제한 금액의 90%만 실제 발송 비용으로 사용되고, 10%는 수수료입니다.
예: 10,000원 결제 → 9,000원만 발송 가능 금액, 1,000원은 수수료

🪙 포인트 시스템

포인트 관련 AJAX 엔드포인트와 로직:

// === 포인트 충전 ===
function cashtoseed_chung(win) {
    // win = 'paper_card' 로 호출됨
    // 포인트 충전 팝업 표시
}

// === AJAX 포인트 결제 ===
$.ajax({
    url: "[내부API]/[포인트결제]",
    type: "POST",
    data: {
        point_val: amount,     // 충전할 포인트 금액
        method: [결제수단변수],     // bank / card
        cur_win: 'paper_card'
    }
});

// === 결제 내역 조회 ===
// get_pay_platform_list() → type=platform
// get_pay_goods_list()    → type=goods
// get_pay_point_list()    → type=point
// 모두 [내부API]/[결제내역] 호출

🌊 전체 결제 흐름도

사용자                        프론트엔드                    서버
  │                              │                          │
  │ 1. 발송 버튼 클릭            │                          │
  │─────────────────────────────→│                          │
  │                              │                          │
  │                    2. settlement("card_send")           │
  │                    3. 데이터 검증                       │
  │                    4. 주문번호 생성                     │
  │                              │                          │
  │                    5. $.ajax POST                       │
  │                              │─────────────────────────→│
  │                              │                          │
  │                              │      6. 결제 검증        │
  │                              │      7. 잔액 확인        │
  │                              │      8. 포인트 차감      │
  │                              │      9. 발송 실행        │
  │                              │     10. 로그 저장        │
  │                              │←─────────────────────────│
  │                              │                          │
  │                    11. success 응답                     │
  │                    12. alert("완료!")                   │
  │                    13. refresh_page()                   │
  │←─────────────────────────────│                          │
  │                              │                          │
  │ 14. 화면 갱신 확인           │                          │
💡 실패 케이스 처리

결제가 실패하면 두 가지 경로로 처리됩니다:

  • err=1: 결제 승인 거절 (잔액 부족, 한도 초과 등) → [내부페이지]/[결제오류]?err=1
  • err=2: 네트워크 오류 (서버 연결 실패, 타임아웃 등) → [내부페이지]/[결제오류]?err=2

🎓 초등학생도 따라하는 결제 분석

1
Network 탭 열기
F12 → Network → XHR 필터
2
발송 버튼 클릭
새로운 요청이 Network 탭에 나타나요.
3
Payload 확인
클릭해서 어떤 값이 서버로 갔는지 확인:
[수수료비율]: 90, [결제수단]: "card", [결제금액파라미터]: 5000...
4
응답 확인
Response 탭에서 서버가 뭐라고 답했는지 확인:
{"result":"success", "order_no":"2026050121361877"}
5
주문번호 이해하기
2026050121361877 = 2026년 05월 01일 21시 36분 18초 + 랜덤 3자리(877)