
    i                      L   d dl mZmZmZmZ d dlZd dlZd dlZd dlZd dl	m	Z	 d dl
mZmZmZ d dlmZ  ede      Z ej$                  d       ej$                  dd	      d
Zej)                  ddg      d        Zd Zd Zd Zd Zd Zej)                  ddg      d        Zy)    )	Blueprintrequestjsonifycurrent_appN)datetime)dbSubscriptionPaymentMethod)Userportone_webhookPORTONE_WEBHOOK_SECRET_KEYPORTONE_BASE_URLzhttps://api.portone.io)
secret_keybase_urlz/api/v2/payments/webhookPOST)methodsc                     	 t        j                         } | s.t        j                  j	                  d       t        ddi      dfS t        t               s.t        j                  j	                  d       t        ddi      dfS | j                  d      }| j                  d	      }|r|s.t        j                  j	                  d
       t        ddi      dfS t        j                  j                  d| d|        |dk(  rt        |        nU|dk(  rt        |        nD|dk(  rt        |        n3|dk(  rt        |        n"t        j                  j                  d|        t        ddd      S # t        $ rD}t        j                  j	                  dt        |              t        ddi      dfcY d}~S d}~ww xY w)u"   포트원 웹훅 수신 및 처리u'   웹훅 데이터가 비어있습니다.errorzInvalid webhook datai  u   웹훅 서명 검증 실패zInvalid signaturei  	eventType	paymentIdu   웹훅 데이터 형식 오류zInvalid webhook formatu   포트원 웹훅 수신:  - PAYMENT_STATUS_CHANGEDPAYMENT_COMPLETEDPAYMENT_FAILEDPAYMENT_CANCELLEDu&   처리하지 않는 이벤트 타입: TzWebhook processed successfully)successmessageu   웹훅 처리 실패: zWebhook processing failed  N)r   get_jsonr   loggerr   r   verify_webhook_signaturegetinfohandle_payment_status_changedhandle_payment_completedhandle_payment_failedhandle_payment_cancelled	Exceptionstr)webhook_data
event_type
payment_ides       O/home/kdj-ubuntu1/mlink_AI_Server/mlink-backend/./src/routes/portone_webhook.pyr   r      s   'D'')$$%NOG%;<=sBB (0$$%BCG%89:C?? "%%k2
!%%k2
$$%EFG%=>?DD";J<s:, WX 11),7..$\2++!,/..$\2##&LZL$YZ44TUVV D  #9#a&!BC!<=>CCDs2   AE0 <E0 AE0 BE0 0	F=99F82F=8F=c                 j   	 t         d   }|s t        j                  j                  d       y| j                  j                  d      }|s t        j                  j                  d       y | j                         }t        j                  |j                  d      |t        j                        j                         }t        j                  ||      ryt        j                  j                  d       y# t        $ r5}t        j                  j                  d	t!        |              Y d
}~yd
}~ww xY w)u   포트원 웹훅 서명 검증r   u?   포트원 웹훅 시크릿 키가 설정되지 않았습니다.TzPortOne-Signatureu(   포트원 웹훅 서명이 없습니다.Fzutf-8u+   웹훅 서명이 일치하지 않습니다.u!   웹훅 서명 검증 중 오류: N)PORTONE_WEBHOOK_CONFIGr   r    warningheadersr"   r   get_datahmacnewencodehashlibsha256	hexdigestcompare_digestr(   r)   )r   r   	signaturebodyexpected_signaturer-   s         r.   r!   r!   ?   s    +L9
&&'hi OO''(;<	$$%OP  w! "XXg&NN
 )+	 	 y*<=$$%RS   #DSVH!MNs)   *C4 <C4 *A)C4 C4 4	D2=+D--D2c                 H   	 | j                  d      }| j                  di       j                  d      }|r|s t        j                  j                  d       yt        j                  j	                  d| d|        t
        j                  j                  |      j                         }|r|d	k(  rd
|_	        n|dk(  rd|_	        n|dk(  rd|_	        t        j                         |_        t        j                  j                          t        j                  j	                  d|j                    d|j                          yy# t"        $ rS}t        j                  j                  dt%        |              t        j                  j'                          Y d}~yd}~ww xY w)u   결제 상태 변경 처리r   datastatusu%   결제 상태 변경 데이터 누락Nu   결제 상태 변경: z -> r,   PAIDactiveFAILEDfailed	CANCELLED	cancelledu#   구독 상태 업데이트 완료: u$   결제 상태 변경 처리 실패: )r"   r   r    r   r#   r	   query	filter_byfirstr@   r   now
updated_atr   sessioncommitidr(   r)   rollback)r*   r,   r@   subscriptionr-   s        r.   r$   r$   c   sb   !%%k2
!!&"-11(;$$%LM"8D QR $))33z3JPPR&.#8#&.#;&&1#&.llnL#JJ##&I,//IZZ^_k_r_r^s$tu     #GAx!PQ


s    AE C+E 	F!A	FF!c                 .   	 | j                  d      }| j                  di       }t        j                  j                  d|        |j                  di       }t        j                  j                  d|j                  d       d|j                  d              t        j
                  j                  |	      j                         }|rkd
|_        t        j                         |_        t        j                  j                          t        j                  j                  d|j                          yy# t         $ rS}t        j                  j#                  dt%        |              t        j                  j'                          Y d}~yd}~ww xY w)u   결제 완료 처리r   r?   u   결제 완료: amountu   결제 금액: total currencyrA   rC   u   구독 활성화 완료: u   결제 완료 처리 실패: Nr"   r   r    r#   r	   rH   rI   rJ   r@   r   rK   rL   r   rM   rN   rO   r(   r   r)   rP   )r*   r,   payment_datarS   rQ   r-   s         r.   r%   r%      sF   !%%k2
#''3/* >? !!(B//&**W2E1Fa

S]H^G_ `a $))33z3JPPR"*L&.llnL#JJ##&??P$QR     #@Q!IJ


s   D4D8 8	FA	FFc                    	 | j                  d      }| j                  di       j                  dd      }t        j                  j                  d| d|        t        j
                  j                  |      j                         }|rkd|_        t        j                         |_        t        j                  j                          t        j                  j                  d	|j                           yy# t"        $ rS}t        j                  j%                  d
t'        |              t        j                  j)                          Y d}~yd}~ww xY w)u   결제 실패 처리r   r?   failureReasonUnknownu   결제 실패: r   rA   rE   u#   구독 실패 상태 업데이트: u   결제 실패 처리 실패: N)r"   r   r    r1   r	   rH   rI   rJ   r@   r   rK   rL   r   rM   rN   r#   rO   r(   r   r)   rP   )r*   r,   failure_reasonrQ   r-   s        r.   r&   r&      s   !%%k2
%))&"599/9U""_ZLNCS#TU $))33z3JPPR"*L&.llnL#JJ##&I,//IZ$[\     #@Q!IJ


   C2C6 6	E?A	EEc                    	 | j                  d      }| j                  di       j                  dd      }t        j                  j                  d| d|        t        j
                  j                  |      j                         }|rkd|_        t        j                         |_        t        j                  j                          t        j                  j                  d	|j                          yy# t         $ rS}t        j                  j#                  d
t%        |              t        j                  j'                          Y d}~yd}~ww xY w)u   결제 취소 처리r   r?   cancelReasonzUser cancelledu   결제 취소: r   rA   rG   u#   구독 취소 상태 업데이트: u   결제 취소 처리 실패: NrW   )r*   r,   cancel_reasonrQ   r-   s        r.   r'   r'      s   !%%k2
$((488IYZ/*S PQ $))33z3JPPR"-L&.llnL#JJ##&I,//IZ$[\     #@Q!IJ


r]   z/api/v2/payments/webhook/testc                  X   	 t        j                         } t        j                  j	                  dt        j                  | d              t        dd| d      S # t        $ rD}t        j                  j                  dt        |              t        dd	i      d
fcY d}~S d}~ww xY w)uC   웹훅 테스트용 엔드포인트 (개발 환경에서만 사용)u   웹훅 테스트 데이터:    )indentTzWebhook test received)r   r   r?   u   웹훅 테스트 실패: r   zWebhook test failedr   N)r   r   r   r    r#   jsondumpsr   r(   r   r)   )r*   r-   s     r.   test_webhookrf      s    >'')">tzz,_`?a>b cd. 
  	  >  #<SVH!EF!678#==>s   AA 	B)%9B$B)$B))flaskr   r   r   r   osr4   r7   rd   r   src.models.subscriptionr   r	   r
   src.models.userr   __name__portone_webhook_bpgetenvr0   router   r!   r$   r%   r&   r'   rf        r.   <module>rq      s    : : 	     C C  0(;  "))89		,.FG 
 4vhG)D H)DV"H>2** 9F8L> M>rp   