1
+ from django .db import transaction
1
2
from rest_framework .decorators import api_view
2
3
from rest_framework .response import Response
3
4
from rest_framework .views import APIView
4
5
6
+ from payment import enum
5
7
from ticket .models import TicketType
6
8
from payment .logic import generate_payment_key
7
- from payment .models import Payment
9
+ from payment .models import Payment , PaymentHistory
8
10
9
11
from django .conf import settings
10
12
11
13
12
14
class PortoneWebhookApi (APIView ):
15
+ @transaction .atomic
13
16
def post (self , request ):
14
17
portone_ips = [
15
18
"52.78.100.19" ,
@@ -20,9 +23,20 @@ def post(self, request):
20
23
if settings .DEBUG is False and request .META .get ("REMOTE_ADDR" ) not in portone_ips :
21
24
raise ValueError ("Not Allowed IP" )
22
25
23
- target_payment = Payment . objects . get ( payment_key = request .data ["merchant_uid" ])
26
+ payment_key = request .data ["merchant_uid" ]
24
27
25
- if request .data ["status " ] != "paid" :
28
+ target_payment = Payment .objects .get (payment_key = payment_key )
29
+ target_payment .status = enum .PaymentStatus .PAYMENT_SUCCESS .value
30
+ target_payment .save ()
31
+
32
+ payment_history = PaymentHistory (
33
+ payment_key = payment_key ,
34
+ status = enum .PaymentStatus .PAYMENT_SUCCESS .value ,
35
+ is_webhook = True
36
+ )
37
+ payment_history .save ()
38
+
39
+ if request .data ["status" ] != "paid" :
26
40
raise ValueError ("결제 승인건 이외의 요청" )
27
41
28
42
dto = {
@@ -33,8 +47,30 @@ def post(self, request):
33
47
return Response (dto )
34
48
35
49
36
- @api_view (["GET" ])
37
- def get__generate_payment_key (request ):
50
+ class PaymentSuccessApi (APIView ):
51
+ def post (self , request ):
52
+ if not request .is_authenticated :
53
+ return Response ({"msg" : "not logged in user" }, status = 400 )
54
+
55
+ payment_key = request .data ["merchant_uid" ]
56
+
57
+ payment_history = PaymentHistory (
58
+ payment_key = payment_key ,
59
+ status = enum .PaymentStatus .PAYMENT_SUCCESS .value ,
60
+ is_webhook = False
61
+ )
62
+ payment_history .save ()
63
+
64
+ dto = {
65
+ "msg" : "ok" ,
66
+ "merchant_uid" : request .data ["merchant_uid" ]
67
+ }
68
+
69
+ return Response (dto )
70
+
71
+
72
+ @api_view (["POST" ])
73
+ def post__generate_payment_key (request ):
38
74
39
75
request_ticket_type = TicketType .objects .get (id = request .data ["ticket_type" ])
40
76
0 commit comments