이제 개발을 시작하면 됩니다.
<head>
<title>결제하기</title>
<script src="https://js.tosspayments.com/v1"></script>
</head>
<body>
<script>
var clientKey = 'test_client_key' //테스트 클라이언트키
var tossPayments = TossPayments(clientKey) // 클라이언트 키로 초기화하기
tossPayments.requestBillingAuth('카드', { // 결제 수단 파라미터(카드 또는 계좌이체 등록 가능 현재는 카드로 실행)
// 결제 정보 파라미터
customerKey: 'xmEpW2OuOQQS_NgBKi6cs', //사용자 고유번호
successUrl: 'http://localhost:8080/success',
failUrl: 'http://localhost:8080/fail',
})
</script>
</body>
위에 html 코드를 통해 토스에서 제공하는 P.G 페이지를 불러옵니다.
import webbrowser
import socket
import http.client
from django.db import connection
webbrowser.open("test.html",1,True)
host = 'localhost'
port=8080
with socket.socket() as s:
s.bind((host,port))
s.listen(1)
ms,kd=s.accept()
msg = ms.recv(1000)
ms.close()
msg=str(msg)
customerKeyF = msg.find("customerKey=")
customerKeyL = msg.find("&")
authKeyF = msg.find("authKey=")
authKeyL = msg.find(" ",20)
customerKey = msg[customerKeyF+12:customerKeyL]
authKey = msg[authKeyF+8:authKeyL]
conn = http.client.HTTPSConnection("api.tosspayments.com")
payload = "{\"customerKey\":\""+customerKey+"\"}"
headers = {
'Authorization': "Basic dGVzdF9za19LbWE2MFJaYmxycTlvUTU1amFacnd6WVdCbjE0Og==",
'Content-Type': "application/json"
}
conn.request("POST", "/v1/billing/authorizations/"+authKey, payload, headers) #url 마지막에 authKey값 추가
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
이런 식으로 파이썬에서 위에 있는 HTML코드를 실행시키고 반환되는 URL을 읽습니다.
이제 여기서 나온 authKey를 가지고 옵니다.
이제 빌링키를 발급받을 차례입니다.빌링키 발급 API
import http.client
conn = http.client.HTTPSConnection("api.tosspayments.com")
payload = "{\"customerKey\":\"xmEpW2OuOQQS_NgBKi6cs\"}"
headers = {
'Authorization': "Basic dGVzdF9za19LbWE2MFJaYmxycTlvUTU1amFacnd6WVdCbjE0Og==",
'Content-Type': "application/json"
}
conn.request("POST", "/v1/billing/authorizations/authKey", payload, headers) #url 마지막에 authKey값 추가
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
위 코드를 실행 시키면
{
"mId": "tosspayments",
"customerKey": "xmEpW2OuOQQS_NgBKi6cs",
"authenticatedAt": "2021-01-01T10:00:00+09:00",
"method": "카드",
"billingKey": "빌링키 값",
"cardCompany": "현대",
"cardNumber": "433028******0916"
}
위에 json파일을 받을 수 있습니다.
이렇게 얻은 빌링키와 카드 정보를 가지고 카드 결제를 할 수 있습니다.
import http.client
conn = http.client.HTTPSConnection("api.tosspayments.com")
payload = "{\"amount\":5000,\"customerKey\":\"xmEpW2OuOQQS_NgBKi6cs\",\"orderId\":\"mqSI2B5tiWqGCepVwrgx1\",\"cutomerEmail\":\"사용자 이메일\",\"cutomerName\":\"Hun\",\"orderName\":\"subscribe\",\"taxFreeAmount\":0}"
headers = {
'Authorization': "Basic dGVzdF9za19LbWE2MFJaYmxycTlvUTU1amFacnd6WVdCbjE0Og==",
'Content-Type': "application/json"
}
conn.request("POST", "/v1/billing/빌링키 값", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
위에서 받아온 빌링키값을 conn.request부분에 추가하고
파이썬 코드를 실행 시키게 되면 결제가 이루어집니다.
{
"mId": "tosspayments",
"version": "1.3",
"paymentKey": "5zJ4xY7m0kODnyRpQWGrN2xqGlNvLrKwv1M9ENjbeoPaZdL6",
"orderId": "-uwgfWwHGHMStSAhXr3NB",
"orderName": "토스 프라임 구독",
"currency": "KRW",
"method": "카드",
"totalAmount": 4900,
"balanceAmount": 4900,
"suppliedAmount": 4455,
"vat": 455,
"status": "DONE",
"requestedAt": "2021-01-01T10:01:30+09:00",
"approvedAt": "2021-01-01T10:05:40+09:00",
"useEscrow": false,
"cultureExpense": false,
"card": {
"company": "현대",
"number": "433012******1234",
"installmentPlanMonths": 0,
"isInterestFree": false,
"approveNo": "00000000",
"useCardPoint": false,
"cardType": "신용",
"ownerType": "개인",
"acquireStatus": "READY",
"receiptUrl": "https://merchants.tosspayments.com/web/serve/merchant/test_ck_7DLJOpm5QrlABQAK0W58PNdxbWnY/receipt/5zJ4xY7m0kODnyRpQWGrN2xqGlNvLrKwv1M9ENjbeoPaZdL6"
},
"virtualAccount": null,
"transfer": null,
"mobilePhone": null,
"giftCertificate": null,
"cashReceipt": null,
"discount": null,
"cancels": null,
"secret": null,
"type": "BILLING",
"easyPay": null,
"taxFreeAmount": 0
}
API 호출 결과로 HTTP 상태 코드 200이 돌아오면 결제 승인 성공입니다.
상태 코드와 함께 위와 같은 응답 본문이 함께 돌아옵니다. 카드 결제에 대한 승인 응답이기 때문에 card
필드가 포함 되어 있어야 합니다.
토스페이먼츠 페이지에서 테스트 결제 내역을 확인해 보신다면 아래와 같은 페이지 처럼 결제가 이루어진것을 확인 해볼 수 있습니다.