망보드(MangBoard) 쇼핑몰에 이니시스 PG 결제를 연동하고,
카카오 알림톡(Popbill) + 텔레그램 관리자 알림을 구축하는 실전 가이드입니다.
| 항목 | 발급처 | 용도 |
|---|---|---|
| MID (가맹점 ID) | 이니시스 가맹계약 시 발급 | 결제 API 식별자 |
| API Key | 이니시스 관리자 | hashData 서명 |
| API IV | 이니시스 관리자 | hashData 서명 |
| 비밀번호 | 이니시스 관리자 | 키파일 복호화 |
| 키파일 | 이니시스 관리자에서 다운로드 | 결제 암복호화 |
flowchart LR
A["이니시스 결제"] --> B["StdpayCARD신용카드"]
A --> C["ININPGRPAY네이버페이"]
A --> D["StdpayVBANK무통장입금"]
A --> E["StdpayHPP휴대폰"]
C -.->|"실제 카드결제"| B
style C fill:#03C75A,color:#fff
| TID prefix | 결제수단 | 비고 |
|---|---|---|
StdpayCARD |
일반 신용카드 | 가장 일반적 |
ININPGRPAY |
네이버페이 (카드결제) | 네이버페이가 결제 대행 |
StdpayVBANK |
무통장입금 (가상계좌) | 입금 확인 필요 |
StdpayHPP |
휴대폰결제 | - |
망보드 관리자에서 결제 플랫폼을 테스트 서버로 설정하면 INIpayTest MID로 테스트 결제 가능합니다.
운영 전환 시 실 MID로 자동 변경됩니다.
flowchart TB
subgraph 고객알림["고객 알림"]
K1["카카오 알림톡(Popbill API)"]
K2["SMS/LMS(미가입자 대체)"]
end
subgraph 관리자알림["관리자 알림"]
T1["텔레그램 Bot(무료)"]
end
subgraph PG["이니시스 PG"]
P1["결제 API"]
P2["취소 API/api/v1/refund"]
end
subgraph 망보드["망보드 코어"]
C1["kakao_api.php알림 발송 중앙"]
C2["mb-commerce.php주문 API"]
C3["inicis/functions.phpPG 연동"]
end
K1 --> C1
K2 --> C1
T1 --> C1
P2 --> C3
C2 --> C1
C2 --> C3
style 고객알림 fill:#FFF3E0
style 관리자알림 fill:#E8F5E9
style PG fill:#E3F2FD
| 채널 | 대상 | 비용 | 비고 |
|---|---|---|---|
| 카카오 알림톡 (Popbill) | 고객 | ~11원/건 | 미가입자는 SMS 자동 전환 (17~36원) |
| 텔레그램 Bot | 관리자 | 무료 | 설정만 하면 즉시 사용 |
flowchart TD
A["관리자가 취소 처리"] --> B{"어떤 버튼 사용?"}
B -->|"주문 상세[결제 취소] 버튼"| C["✅ 올바른 방법"]
B -->|"주문 목록드롭박스 [수정]"| D["❌ 잘못된 방법"]
C --> E["이니시스 API 호출"]
E --> F["DB 업데이트"]
F --> G["고객 알림톡 발송"]
G --> H["관리자 텔레그램 발송"]
D --> I["DB만 변경"]
I --> J["이니시스 실제 취소 안 됨"]
J --> K["알림 발송 안 됨"]
K --> L["⚠️ 카드사 환불 안 됨"]
style C fill:#C8E6C9
style D fill:#FFCDD2
반드시 주문 상세 페이지의 [결제 취소] 버튼을 사용하세요.
드롭박스 [수정]은 DB만 변경하고 실제 PG 취소를 수행하지 않습니다.
sequenceDiagram
participant Admin as 관리자
participant UI as 주문 상세 페이지
participant MB as mb-commerce.php
participant PG as 이니시스 API
participant DB as 데이터베이스
participant Notify as 알림 시스템
Admin->>UI: [결제 취소] 클릭
UI->>Admin: confirm 확인
Admin->>MB: sendOrderViewData(modify_pay_cancel)
MB->>PG: POST /api/v1/refundtype=Refund or PartialRefund
PG-->>MB: resultCode=00 (성공)
MB->>DB: pay_state=cancelorder_state=cancelled_payment
MB->>Notify: do_action(mbw_commerce_modify_pay_cancel)
Notify->>Notify: 고객 카카오 알림톡
Notify->>Notify: 관리자 텔레그램
관리자가 주문 상세 페이지에서 [결제 취소] 버튼을 보려면 다음 모든 조건 충족:
| 조건 | 설명 |
|---|---|
pay_state == "complete" 또는 order_state == "refund_request" |
아직 취소되지 않은 주문 |
| 결제수단이 카드/간편결제 | 무통장입금은 DB만 취소 |
| 결제일 30일 이내 | 예약상품은 60일 |
pay_tid와 order_id 존재 |
PG 거래 ID 필수 |
flowchart TD
A["관리자 취소 요청"] --> B{"cancel_type == partial_refund?"}
B -->|"NO"| C["type=Refund 전액 취소"]
B -->|"YES"| D{"0보다 크고 pay_price보다 작은가?"}
D -->|"YES"| E["type=PartialRefund 부분 환불"]
D -->|"NO"| C
style C fill:#C8E6C9
style E fill:#FFF9C4
| 조건 | API type | 설명 |
|---|---|---|
amt >= pay_price |
Refund |
전액 취소 |
cancel_type != partial_refund |
Refund |
전액 취소 |
cancel_type == partial_refund AND 0 < amt < pay_price |
PartialRefund |
부분 환불 |
주의: API 키가 설정되어 있으면 항상 부분환불 블록이 표시될 수 있습니다.
amt == pay_price일 때Refund를 사용하도록 명시적으로 분기해야 합니다.
전액 취소 (Refund):
POST https://iniapi.inicis.com/api/v1/refund
Content-Type: application/x-www-form-urlencoded
type=Refund
paymethod=Card
timestamp=YYYYMMDDHHmmss (UTC)
clientIp=서버_IP
mid=가맹점ID
tid=결제TID
msg=취소사유
price=결제금액 (전액)
confirmPrice=0
hashData=sha512(apiKey + type + paymethod + timestamp + clientIp + mid + tid)
부분 환불 (PartialRefund):
POST https://iniapi.inicis.com/api/v1/refund
type=PartialRefund
paymethod=Card
timestamp=YYYYMMDDHHmmss (UTC)
clientIp=서버_IP
mid=가맹점ID
tid=결제TID
msg=취소사유
price=환불금액
confirmPrice=남은금액 (결제금액 - 환불금액)
hashData=sha512(apiKey + type + paymethod + timestamp + clientIp + mid + tid + price + confirmPrice)
hashData에 포함되는 파라미터 순서가 두 타입에서 다릅니다.
Refund는tid까지,PartialRefund는confirmPrice까지 포함.
| resultCode | 의미 | 조치 |
|---|---|---|
00 |
정상 처리 | 완료 |
01 |
실패 | 사유 확인 후 재시도 |
01 + 500626 |
기 취소 거래 | 이미 취소됨, 이니시스 관리자에서 원복 필요 |
flowchart TD
A["고객 주문"] --> B{"결제수단?"}
B -->|"무통장입금"| C["배송전[주문취소]"]
B -->|"카드/PG"| D["배송전[환불신청]"]
D --> E["관리자가[결제 취소] 처리"]
F["7일 초과"] --> G["버튼 없음관리자 문의"]
H["환불신청 상태"] --> I["[환불취소]"]
J["반품/교환 신청"] --> K["[반품/교환 취소]"]
style C fill:#FFF3E0
style D fill:#FFF3E0
style G fill:#FFCDD2
| 주문 상태 | 결제수단 | 고객 버튼 | 동작 |
|---|---|---|---|
| 주문완료 (무통장) | 무통장 | [주문취소] | DB 즉시 취소 (PG 호출 불필요) |
| 결제완료 (배송전) | 카드/PG | [환불신청] | DB를 refund_request로 변경 |
| 결제완료 (7일 초과) | 카드/PG | 버튼 없음 | 관리자에게 문의 |
| 환불신청 상태 | - | [환불취소] | completed_payment로 원복 |
| 반품/교환 신청 | - | [반품/교환 취소] | completed_shipping로 원복 |
고객의 [환불신청]은 DB 상태만 변경합니다. 실제 이니시스 결제 취소는 관리자가 [결제 취소] 버튼으로 처리해야 합니다.
flowchart LR
A["고객 [환불신청]"] -->|"DB만 변경refund_request"| B["관리자 확인"]
B --> C["관리자 [결제 취소]"]
C -->|"이니시스 API 호출"| D["카드사 환불"]
C --> E["고객 알림톡 발송"]
C --> F["관리자 텔레그램 발송"]
| 상황 | 고객 카카오 | 관리자 텔레그램 | 비고 |
|---|---|---|---|
| 주문 접수 (PG/무통장) | ✅ 주문완료 | ✅ 주문완료 | 양쪽 모두 |
| 고객 환불요청 | ❌ 없음 | ✅ 전용 메시지 | 관리자에게만 |
| 관리자 결제취소 | ✅ 주문취소 | ✅ 주문취소 | 양쪽 모두 |
| 고객 주문취소 (무통장) | ✅ 주문취소 | ✅ 주문취소 | 양쪽 모두 |
| 고객 반품/교환 신청 | ✅ 주문취소 | ✅ 주문취소 | 양쪽 모두 |
flowchart TD
A["주문 상태 변경"] --> B{"어떤 상태?"}
B -->|"주문접수"| C["고객: 주문완료 템플릿"]
C --> D["관리자: 주문완료 템플릿"]
B -->|"환불요청refund_request"| E["관리자만: 전용 메시지"]
E -.->|"고객에게는 없음"| F
B -->|"결제취소"| F["고객: 취소 템플릿"]
F --> G["관리자: 취소 템플릿"]
B -->|"고객 취소/반품"| F
style E fill:#FFF9C4
refund_request상태에서는 고객에게 알림을 보내지 않습니다.
"취소 완료" 알림은 관리자가 실제 PG 취소를 완료한 후에 발송됩니다.
timeline
title 취소 타이밍에 따른 차이
매입전취소 : 결제 당일 23시 30분 이전
: 즉시 카드사 환불
매입후취소 : 결제 익일 이후
: 3~5 영업일 카드사 환불
| 구분 | 타이밍 | 환불 소요 |
|---|---|---|
| 매입전취소 | 결제 당일 23:30 이전 | 즉시 카드 청구 취소 |
| 매입후취소 | 결제 익일 이후 | 3~5 영업일 카드사 환불 |
네이버페이(
ININPGRPAY)는 이니시스에서 실시간 매입 처리하므로,
즉시 취소해도 매입후취소가 될 수 있습니다.
| 항목 | 설명 |
|---|---|
| Popbill 회원가입 | https://www.popbill.com |
| 사업자등록번호 | 카카오톡 발신자 번호 인증에 사용 |
| 발신번호 | 사전 등록된 전화번호 |
| 카카오톡 발신자 번호 | 10~11자리 숫자 (하이픈 제거) |
알림톡을 보내려면 카카오톡에 템플릿을 사전 등록해야 합니다.
등록 시 발급받은 템플릿 코드를 망보드 관리자에 입력합니다.
| 템플릿 | 용도 | 대상 |
|---|---|---|
| 주문완료 안내 | 주문 접수 시 | 고객 + 관리자 |
| 입금확인 안내 | 무통장 입금 시 | 고객 |
| 배송안내 | 배송 시작 시 | 고객 |
| 주문취소 안내 | 결제 취소 완료 시 | 고객 + 관리자 |
| 변수 | 의미 | 사용 템플릿 |
|---|---|---|
#{NAME} |
고객명 | 전체 |
#{ORDER_NUM} |
주문번호 | 전체 |
#{ORDER_DATE} |
주문일자 | 전체 |
#{ORDER_PRICE} |
주문금액 | 주문완료 |
#{CANCEL_PRICE} |
취소금액 | 주문취소 |
#{PRODUCT_LIST} |
주문상품 목록 | 전체 |
#{BANK_ACCOUNT} |
입금계좌 | 주문완료 (무통장) |
#{DEPOSIT_DEADLINE} |
입금기한 | 주문완료 (무통장) |
| 항목 | 설명 |
|---|---|
| Bot 생성 | Telegram에서 @BotFather와 대화 → /newbot |
| Bot Token | BotFather가 발급 |
| Chat ID | 관리자 텔레그램에서 @userinfobot에게 메시지 전송 |
flowchart LR
A["주문 상태 변경"] --> B["kakao_api.php"]
B --> C{"고객 vs 관리자?"}
C -->|"고객"| D["Popbill API카카오 알림톡"]
C -->|"관리자"| E["wmbt_send_telegram()텔레그램 Bot API"]
D --> F["비용 발생~11원/건"]
E --> G["무료"]
템플릿 기반 전송 (주문접수, 결제취소 등):
mbw_send_admin_telegram(템플릿코드, 데이터배열)
→ 템플릿 렌더링 → HTML 태그 제거 → 텔레그램 전송
직접 텍스트 전송 (환불요청 등 템플릿 없는 알림):
wmbt_send_telegram(문자열)
→ 텔레그램으로 직접 전송
flowchart TD
subgraph 주문API["mb-commerce.php"]
A["modify_pay_cancel관리자 결제취소"]
B["modify_order_state고객 상태변경"]
C["multi_modify_order배치 상태변경"]
end
subgraph 알림["kakao_api.php"]
D["mbw_send_admin_telegram관리자 텔레그램"]
E["mbw_send_pay_cancel_message결제취소 알림"]
F["mbw_send_order_state_message상태변경 알림"]
end
subgraph PG["inicis/functions.php"]
G["mbw_commerce_pay_cancel_apiREST API 취소"]
H["mbw_commerce_pay_partial_refund부분환불"]
end
subgraph UI["tpl.commerce.php"]
I["관리자 [결제 취소] 버튼"]
J["고객 [환불신청] 버튼"]
end
A --> G
A --> E
B --> F
I --> A
J --> B
style 주문API fill:#E3F2FD
style 알림 fill:#E8F5E9
style PG fill:#FFF3E0
style UI fill:#F3E5F5
망보드 플러그인 업데이트 시 위 파일들이 덮어씌워질 수 있습니다.
업데이트 전 반드시 백업하고, 업데이트 후 diff를 확인하여 수정 사항을 재적용하세요.
flowchart TD
A["드롭박스 [수정]상태를 취소로 변경"] --> B{"이니시스 실제 취소?"}
B -->|"안 됨"| C["이니시스 관리자에서 수동 취소"]
B -->|"이미 됨"| D["DB refund_price 확인 후이니시스에서 원복"]
style A fill:#FFCDD2
복구 절차:
API 키가 설정되면 부분환불 UI가 항상 표시될 수 있으며, amt == pay_price일 때도 PartialRefund로 요청되면 실패합니다.
amt == pay_price 조건을 명시적으로 체크하여 Refund 타입을 사용하도록 분기해야 합니다.
| 채널 | 비용/건 |
|---|---|
| 카카오톡 알림톡 | ~11원 |
| SMS (미가입자 대체) | ~17원 |
| LMS (미가입자 대체) | ~36원 |
| 텔레그램 | 무료 |
관리자 알림을 카카오채널에서 텔레그램으로 전환하면 비용을 크게 절감할 수 있습니다.
| 자료 | URL |
|---|---|
| 이니시스 관리자 | https://iniweb.inicis.com |
| Popbill 관리 | https://www.popbill.com/ |
| 망보드 알림톡 가이드 | https://www.mangboard.com/tip/?vid=46 |
| 이전 | WordPress SEO 설정 가이드 | 김재석 | 2026-04-28 |
|---|---|---|---|
| 다음 | 네이버페이 주문형 설정 방법 기록 | test | 2026-04-23 |