💰 결제 시스템 — 완전 분석
명함 발송에 필요한 결제 시스템의 모든 로직을 분석합니다. 포인트 충전부터 실제 결제 처리까지.
⚙️ 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 필터
F12 → Network → XHR 필터
2
발송 버튼 클릭
새로운 요청이 Network 탭에 나타나요.
새로운 요청이 Network 탭에 나타나요.
3
Payload 확인
클릭해서 어떤 값이 서버로 갔는지 확인:
클릭해서 어떤 값이 서버로 갔는지 확인:
[수수료비율]: 90, [결제수단]: "card", [결제금액파라미터]: 5000...4
응답 확인
Response 탭에서 서버가 뭐라고 답했는지 확인:
Response 탭에서 서버가 뭐라고 답했는지 확인:
{"result":"success", "order_no":"2026050121361877"}5
주문번호 이해하기
2026050121361877 = 2026년 05월 01일 21시 36분 18초 + 랜덤 3자리(877)