[Django]Iamport 연동하기 - 1

Edit

[Django]Iamport 연동하기 - 1

Alt text

오늘은 결제모듈계의 혁신 아엠포트에 대해 다뤄보도록 하자. 결제모듈을 처음부터 개발해본 개발자라면 ‘결’자만 들어도 부들부들하는데, 아엠포트는 진짜 이러한 개발자의 니즈를 정확히 비집고 들어와 서비스 하고 있다.

특히, 우리나라 대표 밴더사들(이x시스, 다x 등등) python 모듈을 절대 안 가르쳐 주는데 (심지어 대부분 php로 되어 있어서 php를 python에 붙여야하는 개고생을 해야한다.) Django에 이러한 결제모듈 하나 다는게 여간 쉽진 않다.

아엠포트를 들어가보면 1시간만에 결제모듈 달기라는 엄청난 비젼을 제시하고 있는데, 실제로 한시간도 안 걸린다.(물론 transaction 구현할려면 조금 복잡해지긴 한다.)

Alt text

아엠포트에 가입을 하고 나서 로그인을 한 다음에 REST API 키와 REST API secret를 복사해오자. 이 정보를 바탕으로 아엠포트와 통신을 할 것이다..

이번 목표는 포인트를 결제 시키는 것이다. 실제로 쇼핑몰 같은 것을 만들 때는 상품 여러개를 (장바구니에 있는 상품들) 결제 할 수 있는데 이번 편을 응용하면 충분히 할 수 있을 것이다.

먼저 결제를 담당할 billing 앱을 만들어보자.

$ python manage.py startapp billing

간단하게 billing 앱을 등록해주자. 그리고 위에서 가지고온 API 키와 screte를 넣어주자.

# settings.py
INSTALLED_APPS = [
...
'billing',
...
]

IAMPORT_KEY =
IAMPORT_SECRET =

이제 주문에 대한 모델을 작성해보자. 포인트 대한 주문을 Point라고 할 것이다.

# billing/models.py
from django.db import models
# User 모델은 알아서 가져오기
from users.models import MyUser

class Point(models.Model):
user = models.OneToOneField(MyUser)
point = models.PositiveIntegerField(default=0)
created = models.DateTimeField(auto_now_add=True, auto_now=False)
timestamp = models.DateTimeField(auto_now_add=False, auto_now=True)

def __str__(self):
return str(self.point)


class PointTransaction(models.Model):
user = models.ForeignKey(MyUser)
transaction_id = models.CharField(max_length=120, null=True, blank=True)
order_id = models.CharField(max_length=120, unique=True)
amount = models.PositiveIntegerField(default=0)
success = models.BooleanField(default=False)
transaction_status = models.CharField(max_length=220, null=True, blank=True)
type = models.CharField(max_length=120)
created = models.DateTimeField(auto_now_add=True, auto_now=False)

def __str__(self):
return self.order_id

class Meta:
ordering = ['-created']

Point 모델은 유저가 결제를 시도한 정보이고, PointTransaction은 실제 결제모듈을 통해 결제가 이루어지는 정보를 담는 모델이다. 다음 편에서는 아임프토와 통신할 수 있는 모듈을 만들어보자.

%23%23%23%5BDjango%5DIamport%20%uC5F0%uB3D9%uD558%uAE30%20-%201%0A@%28Django%29%5Bdjango%2C%20iamport%5D%0A%0A%21%5BAlt%20text%5D%28./%u1109%u1173%u110F%u1173%u1105%u1175%u11AB%u1109%u1163%u11BA%202016-11-19%20%u110B%u1169%u1112%u116E%206.39.05.png%29%0A%0A%uC624%uB298%uC740%20%uACB0%uC81C%uBAA8%uB4C8%uACC4%uC758%20%uD601%uC2E0%20%uC544%uC5E0%uD3EC%uD2B8%uC5D0%20%uB300%uD574%20%uB2E4%uB904%uBCF4%uB3C4%uB85D%20%uD558%uC790.%20%uACB0%uC81C%uBAA8%uB4C8%uC744%20%uCC98%uC74C%uBD80%uD130%20%uAC1C%uBC1C%uD574%uBCF8%20%uAC1C%uBC1C%uC790%uB77C%uBA74%20%27%uACB0%27%uC790%uB9CC%20%uB4E4%uC5B4%uB3C4%20%uBD80%uB4E4%uBD80%uB4E4%uD558%uB294%uB370%2C%20%uC544%uC5E0%uD3EC%uD2B8%uB294%20%uC9C4%uC9DC%20%uC774%uB7EC%uD55C%20%uAC1C%uBC1C%uC790%uC758%20%uB2C8%uC988%uB97C%20%uC815%uD655%uD788%20%uBE44%uC9D1%uACE0%20%uB4E4%uC5B4%uC640%20%uC11C%uBE44%uC2A4%20%uD558%uACE0%20%uC788%uB2E4.%20%0A%0A%uD2B9%uD788%2C%20%uC6B0%uB9AC%uB098%uB77C%20%uB300%uD45C%20%uBC34%uB354%uC0AC%uB4E4%28%uC774x%uC2DC%uC2A4%2C%20%uB2E4x%20%uB4F1%uB4F1%29%20python%20%uBAA8%uB4C8%uC744%20%uC808%uB300%20%uC548%20%uAC00%uB974%uCCD0%20%uC8FC%uB294%uB370%20%28%uC2EC%uC9C0%uC5B4%20%uB300%uBD80%uBD84%20php%uB85C%20%uB418%uC5B4%20%uC788%uC5B4%uC11C%20php%uB97C%20python%uC5D0%20%uBD99%uC5EC%uC57C%uD558%uB294%20%uAC1C%uACE0%uC0DD%uC744%20%uD574%uC57C%uD55C%uB2E4.%29%20%60Django%60%uC5D0%20%uC774%uB7EC%uD55C%20%uACB0%uC81C%uBAA8%uB4C8%20%uD558%uB098%20%uB2E4%uB294%uAC8C%20%uC5EC%uAC04%20%uC27D%uC9C4%20%uC54A%uB2E4.%0A%0A%uC544%uC5E0%uD3EC%uD2B8%uB97C%20%uB4E4%uC5B4%uAC00%uBCF4%uBA74%201%uC2DC%uAC04%uB9CC%uC5D0%20%uACB0%uC81C%uBAA8%uB4C8%20%uB2EC%uAE30%uB77C%uB294%20%uC5C4%uCCAD%uB09C%20%uBE44%uC83C%uC744%20%uC81C%uC2DC%uD558%uACE0%20%uC788%uB294%uB370%2C%20%uC2E4%uC81C%uB85C%20%uD55C%uC2DC%uAC04%uB3C4%20%uC548%20%uAC78%uB9B0%uB2E4.%28%uBB3C%uB860%20transaction%20%uAD6C%uD604%uD560%uB824%uBA74%20%uC870%uAE08%20%uBCF5%uC7A1%uD574%uC9C0%uAE34%20%uD55C%uB2E4.%29%0A%0A%21%5BAlt%20text%5D%28./%u1109%u1173%u110F%u1173%u1105%u1175%u11AB%u1109%u1163%u11BA%202017-02-16%20%u110B%u1169%u1112%u116E%2010.43.16.png%29%0A%0A%uC544%uC5E0%uD3EC%uD2B8%uC5D0%20%uAC00%uC785%uC744%20%uD558%uACE0%20%uB098%uC11C%20%uB85C%uADF8%uC778%uC744%20%uD55C%20%uB2E4%uC74C%uC5D0%20%20REST%20API%20%uD0A4%uC640%20REST%20API%20secret%uB97C%20%uBCF5%uC0AC%uD574%uC624%uC790.%20%uC774%20%uC815%uBCF4%uB97C%20%uBC14%uD0D5%uC73C%uB85C%20%uC544%uC5E0%uD3EC%uD2B8%uC640%20%uD1B5%uC2E0%uC744%20%uD560%20%uAC83%uC774%uB2E4..%0A%0A%3E%20%uC774%uBC88%20%uBAA9%uD45C%uB294%20%uD3EC%uC778%uD2B8%uB97C%20%uACB0%uC81C%20%uC2DC%uD0A4%uB294%20%uAC83%uC774%uB2E4.%20%20%uC2E4%uC81C%uB85C%20%uC1FC%uD551%uBAB0%20%uAC19%uC740%20%uAC83%uC744%20%uB9CC%uB4E4%20%uB54C%uB294%20%uC0C1%uD488%20%uC5EC%uB7EC%uAC1C%uB97C%20%28%uC7A5%uBC14%uAD6C%uB2C8%uC5D0%20%uC788%uB294%20%uC0C1%uD488%uB4E4%29%20%uACB0%uC81C%20%uD560%20%uC218%20%uC788%uB294%uB370%20%uC774%uBC88%20%uD3B8%uC744%20%uC751%uC6A9%uD558%uBA74%20%uCDA9%uBD84%uD788%20%uD560%20%uC218%20%uC788%uC744%20%uAC83%uC774%uB2E4.%0A%0A%uBA3C%uC800%20%uACB0%uC81C%uB97C%20%uB2F4%uB2F9%uD560%20%60billing%60%20%uC571%uC744%20%uB9CC%uB4E4%uC5B4%uBCF4%uC790.%0A%0A%60%60%60bash%0A%24%20python%20manage.py%20startapp%20billing%0A%60%60%60%0A%0A%uAC04%uB2E8%uD558%uAC8C%20billing%20%uC571%uC744%20%uB4F1%uB85D%uD574%uC8FC%uC790.%20%uADF8%uB9AC%uACE0%20%uC704%uC5D0%uC11C%20%uAC00%uC9C0%uACE0%uC628%20API%20%uD0A4%uC640%20screte%uB97C%20%uB123%uC5B4%uC8FC%uC790.%0A%0A%60%60%60python%0A%23%20settings.py%0AINSTALLED_APPS%20%3D%20%5B%0A%20%20%20...%0A%20%20%20%27billing%27%2C%0A%20%20%20...%0A%5D%0A%0AIAMPORT_KEY%20%3D%20%3CAPI%20Key%3E%0AIAMPORT_SECRET%20%3D%20%3CAPI%20Secret%3E%0A%60%60%60%0A%0A%uC774%uC81C%20%uC8FC%uBB38%uC5D0%20%uB300%uD55C%20%uBAA8%uB378%uC744%20%uC791%uC131%uD574%uBCF4%uC790.%20%uD3EC%uC778%uD2B8%20%uB300%uD55C%20%uC8FC%uBB38%uC744%20Point%uB77C%uACE0%20%uD560%20%uAC83%uC774%uB2E4.%0A%0A%60%60%60python%0A%23%20billing/models.py%0Afrom%20django.db%20import%20models%0A%23%20User%20%uBAA8%uB378%uC740%20%uC54C%uC544%uC11C%20%uAC00%uC838%uC624%uAE30%0Afrom%20users.models%20import%20MyUser%0A%0Aclass%20Point%28models.Model%29%3A%0A%20%20%20%20user%20%3D%20models.OneToOneField%28MyUser%29%0A%20%20%20%20point%20%3D%20models.PositiveIntegerField%28default%3D0%29%0A%20%20%20%20created%20%3D%20models.DateTimeField%28auto_now_add%3DTrue%2C%20auto_now%3DFalse%29%0A%20%20%20%20timestamp%20%3D%20models.DateTimeField%28auto_now_add%3DFalse%2C%20auto_now%3DTrue%29%0A%0A%20%20%20%20def%20__str__%28self%29%3A%0A%20%20%20%20%20%20%20%20return%20str%28self.point%29%0A%0A%0Aclass%20PointTransaction%28models.Model%29%3A%0A%20%20%20%20user%20%3D%20models.ForeignKey%28MyUser%29%0A%20%20%20%20transaction_id%20%3D%20models.CharField%28max_length%3D120%2C%20null%3DTrue%2C%20blank%3DTrue%29%0A%20%20%20%20order_id%20%3D%20models.CharField%28max_length%3D120%2C%20unique%3DTrue%29%0A%20%20%20%20amount%20%3D%20models.PositiveIntegerField%28default%3D0%29%0A%20%20%20%20success%20%3D%20models.BooleanField%28default%3DFalse%29%0A%20%20%20%20transaction_status%20%3D%20models.CharField%28max_length%3D220%2C%20null%3DTrue%2C%20blank%3DTrue%29%0A%20%20%20%20type%20%3D%20models.CharField%28max_length%3D120%29%0A%20%20%20%20created%20%3D%20models.DateTimeField%28auto_now_add%3DTrue%2C%20auto_now%3DFalse%29%0A%0A%20%20%20%20def%20__str__%28self%29%3A%0A%20%20%20%20%20%20%20%20return%20self.order_id%0A%0A%20%20%20%20class%20Meta%3A%0A%20%20%20%20%20%20%20%20ordering%20%3D%20%5B%27-created%27%5D%0A%60%60%60%0A%0APoint%20%uBAA8%uB378%uC740%20%uC720%uC800%uAC00%20%uACB0%uC81C%uB97C%20%uC2DC%uB3C4%uD55C%20%uC815%uBCF4%uC774%uACE0%2C%20PointTransaction%uC740%20%uC2E4%uC81C%20%uACB0%uC81C%uBAA8%uB4C8%uC744%20%uD1B5%uD574%20%uACB0%uC81C%uAC00%20%uC774%uB8E8%uC5B4%uC9C0%uB294%20%uC815%uBCF4%uB97C%20%uB2F4%uB294%20%uBAA8%uB378%uC774%uB2E4.%20%uB2E4%uC74C%20%uD3B8%uC5D0%uC11C%uB294%20%uC544%uC784%uD504%uD1A0%uC640%20%uD1B5%uC2E0%uD560%20%uC218%20%uC788%uB294%20%uBAA8%uB4C8%uC744%20%uB9CC%uB4E4%uC5B4%uBCF4%uC790.