import gradio as gr import requests import xml.etree.ElementTree as ET def card_authorization(onfftid, tot_amt, com_tax_amt, com_free_amt, com_vat_amt, card_no, install_period, user_nm, user_phone2, product_nm, expire_date, cert_type, card_user_type, auth_value, password, card_nm, order_no, pay_type): url = "https://store.onoffkorea.co.kr/payment/index.php" # 필수 파라미터 확인 if not all([onfftid, tot_amt, card_no, install_period, user_nm, user_phone2, product_nm, expire_date, cert_type, card_user_type]): return {"error": "필수 파라미터가 누락되었습니다."} # 인증 관련 파라미터 처리 if cert_type == "0 - 인증": if not auth_value or not password: return {"error": "인증 결제 시 인증번호와 비밀번호는 필수입니다."} cert_type = "0" elif cert_type == "1 - 비인증": cert_type = "1" else: return {"error": "잘못된 인증 유형입니다."} # 카드 유형 처리 if card_user_type == "0 - 개인카드": card_user_type = "0" elif card_user_type == "1 - 법인카드": card_user_type = "1" else: return {"error": "잘못된 카드 유형입니다."} # 할부기간 처리 install_period = install_period.split(' - ')[0] # "00 - 일시불"에서 "00"만 추출 data = { "onfftid": onfftid, "tot_amt": tot_amt, "com_tax_amt": com_tax_amt if com_tax_amt is not None else '', "com_free_amt": com_free_amt if com_free_amt is not None else '', "com_vat_amt": com_vat_amt if com_vat_amt is not None else '', "card_no": card_no, "install_period": install_period, "user_nm": user_nm, "user_phone2": user_phone2, "product_nm": product_nm, "expire_date": expire_date, "cert_type": cert_type, "card_user_type": card_user_type, "auth_value": auth_value, "password": password, "card_nm": card_nm or '', "order_no": order_no or '', "pay_type": pay_type or 'card' } response = requests.post(url, data=data) if response.status_code == 200: try: root = ET.fromstring(response.text) result = {} for child in root: result[child.tag] = child.text # 결과 코드 확인 if result.get('result_cd') == '0000': result['status'] = '성공' else: result['status'] = '실패' return result except ET.ParseError: return {"error": "응답 파싱 오류", "details": response.text} else: return {"error": "요청 실패", "status_code": response.status_code} with gr.Blocks() as app: with gr.Tab("카드 결제 승인 요청"): with gr.Row(): with gr.Column(scale=1): onfftid = gr.Textbox(label="온오프코리아 TID", value="OFPT000000011017") tot_amt = gr.Number(label="결제금액") com_tax_amt = gr.Number(label="과세승인금액") com_free_amt = gr.Number(label="비과세승인금액") com_vat_amt = gr.Number(label="부가세") card_no = gr.Textbox(label="카드번호") install_period = gr.Dropdown( choices=[f"{str(i).zfill(2)} - {'일시불' if i == 0 else f'{i}개월'}" for i in range(13)], label="할부기간 선택", value="00 - 일시불" ) user_nm = gr.Textbox(label="결제자명") user_phone2 = gr.Textbox(label="결제자 연락처") product_nm = gr.Textbox(label="상품명") expire_date = gr.Textbox(label="유효기간(YYMM)") cert_type = gr.Radio(choices=["0 - 인증", "1 - 비인증"], label="인증여부 선택", value="0 - 인증") card_user_type = gr.Radio(choices=["0 - 개인카드", "1 - 법인카드"], label="카드유형 선택", value="0 - 개인카드") auth_value = gr.Textbox(label="인증번호 (인증 시 필수)") password = gr.Textbox(label="카드 비밀번호 앞 2자리 (인증 시 필수)") card_nm = gr.Textbox(label="카드사명") order_no = gr.Textbox(label="주문번호") pay_type = gr.Textbox(label="결제타입", value="card") submit_button = gr.Button("결제 승인 요청") result_area = gr.JSON(label="결과") submit_button.click( fn=card_authorization, inputs=[onfftid, tot_amt, com_tax_amt, com_free_amt, com_vat_amt, card_no, install_period, user_nm, user_phone2, product_nm, expire_date, cert_type, card_user_type, auth_value, password, card_nm, order_no, pay_type], outputs=result_area ) app.launch()