인증
•
SIGNATURE: JWS(JSON Web Signature)를 이용한 body 서명
•
ENCRYPTION: JWE(JSON Web Encryption)를 이용한 body 암호화
SIGNATURE, ENCRYPTION방식은 토스페이먼츠에서 발급하는 보안키(securityKey)를 사용해요. 서명하거나 암호화할 때 가맹점과 토스페이먼츠는 동일한 보안키를 사용합니다.
실시간 지급대행 외에도 모든 토스페이먼츠 POST API에 SIGNATURE 또는 ENCRYPTION 인증을 사용할 수 있어요.
보안키란?
보안키는 SIGNATURE, ENCRYPTION 방식에서 body를 서명하거나 암호화할 때 사용하는 키입니다.
•
보안키는 256bit의 HEXENCODED 문자열(string)입니다.
•
보안키가 외부에 노출되지 않도록 주의해주세요.
A. SIGNATURE 방식
1.
{
"amount":500,
"orderId":"test_order_0",
"orderName":"토스 티셔츠 외 2건",
"customerName":"박토스",
"bank":"신한"
}
JSON
복사
2.
보안키(securityKey)를 이용해서 Request Body 파라미터를 JWS 서명하세요.
/**
* @param target target object for signing (requestBody)
* @param securityKey symmetric key from tosspayments
* @return requestBody in JWS
*/
fun sign(target: Any, securityKey: String): String {
val payload = objectMapper.writeValueAsString(target)
val signer = MACSigner(securityKey)
val jwsObject = JWSObject(JWSHeader((JWSAlgorithm.HS256)), Payload(payload))
jwsObject.sign(signer)
return jwsObject.serialize()
}
Kotlin
복사
3.
curl --location 'https://api-dev.tosspayments.com/v1/virtual-accounts' \
--header 'Authorization: Basic dGVzdF9za19aMFJuWVgydzUzMk5vdkJaN2tOM05leXFBcFFFOgo=' \
--header 'Content-Type: text/plain' \
--data 'eyJhbGciOiJIUzI1NiJ9.eyJhbW91bnQiOjUwMCwib3JkZXJJZCI6InRlc3Rfb3JkZXJfMTEyIiwib3JkZXJOYW1lIjoi7Yag7IqkIO2LsOyFlOy4oCDsmbggMuqxtCIsImN1c3RvbWVyTmFtZSI6Iuuwle2GoOyKpCIsImJhbmsiOiLsi6DtlZwifQ.J8V3_Os1gZeNFj9qv3XDEhXelXrtVg1JLgsChE9hhok'
Bash
복사
4.
응답으로 JWS로 서명한 응답을 받습니다.
eyJhbGciOiJIUzI1NiJ9.eyJtSWQiOiJ0dml2YXJlcHVibGljYSIsImxhc3RUcmFuc2FjdGlvbktleSI6IjM2NTM5NkU0Nzg5NEEzM0IzM0M1N0I1NjhFRkZDRDVEIiwicGF5bWVudEtleSI6ImQ5b2pPNXFFdkttYTYwUlpibHJxS3F5OWFla1pCZTN3ellXQm4xNE1YQVBHZzdwRCIsIm9yZGVySWQiOiJ0ZXN0X29yZGVyXzAiLCJvcmRlck5hbWUiOiLthqDsiqQg7Yuw7IWU7LigIOyZuCAy6rG0IiwidGF4RXhlbXB0aW9uQW1vdW50IjowLCJzdGF0dXMiOiJXQUlUSU5HX0ZPUl9ERVBPU0lUIiwicmVxdWVzdGVkQXQiOiIyMDIzLTA5LTI4VDE2OjI4OjEzKzA5OjAwIiwiYXBwcm92ZWRBdCI6bnVsbCwidXNlRXNjcm93IjpmYWxzZSwiY3VsdHVyZUV4cGVuc2UiOmZhbHNlLCJjYXJkIjpudWxsLCJ2aXJ0dWFsQWNjb3VudCI6eyJhY2NvdW50TnVtYmVyIjoiWDM3OTAxMDg4NDE4NDMiLCJhY2NvdW50VHlwZSI6IuydvOuwmCIsImJhbmtDb2RlIjoiODgiLCJjdXN0b21lck5hbWUiOiLrsJXthqDsiqQiLCJkdWVEYXRlIjoiMjAyMy0xMC0wNVQxNjoyODoxMyswOTowMCIsImV4cGlyZWQiOmZhbHNlLCJzZXR0bGVtZW50U3RhdHVzIjoiSU5DT01QTEVURUQiLCJyZWZ1bmRTdGF0dXMiOiJOT05FIiwicmVmdW5kUmVjZWl2ZUFjY291bnQiOm51bGx9LCJ0cmFuc2ZlciI6bnVsbCwibW9iaWxlUGhvbmUiOm51bGwsImdpZnRDZXJ0aWZpY2F0ZSI6bnVsbCwiY2FzaFJlY2VpcHQiOm51bGwsImNhc2hSZWNlaXB0cyI6bnVsbCwiZGlzY291bnQiOm51bGwsImNhbmNlbHMiOm51bGwsInNlY3JldCI6InBzX0U5MkxBYTVQVmI5amoySkE1bnBSMzdZbXBYeUoiLCJ0eXBlIjoiTk9STUFMIiwiZWFzeVBheSI6bnVsbCwiY291bnRyeSI6IktSIiwiZmFpbHVyZSI6bnVsbCwiaXNQYXJ0aWFsQ2FuY2VsYWJsZSI6dHJ1ZSwicmVjZWlwdCI6eyJ1cmwiOiJodHRwczovL3Bnd2ViLnRvc3NwYXltZW50cy5jb206NzA4Ni9NcEZsb3dDdHJsP2V2ZW50RGl2MT1zZWFyY2gmZXZlbnREaXYyPWdldENhc1JlY2VpcHRMaXN0JnRyeGlkPXR2aXZhMjAyMzA5MjgxNjI4MTRoZ3NOOSZTWVNURU09TkVXIn0sImNoZWNrb3V0Ijp7InVybCI6Imh0dHBzOi8vYXBpLWRldi50b3NzcGF5bWVudHMuY29tL3YxL3BheW1lbnRzL2Q5b2pPNXFFdkttYTYwUlpibHJxS3F5OWFla1pCZTN3ellXQm4xNE1YQVBHZzdwRC9jaGVja291dCJ9LCJjdXJyZW5jeSI6IktSVyIsInRvdGFsQW1vdW50Ijo1MDAsImJhbGFuY2VBbW91bnQiOjUwMCwic3VwcGxpZWRBbW91bnQiOjQ1NSwidmF0Ijo0NSwidGF4RnJlZUFtb3VudCI6MCwibWV0aG9kIjoi6rCA7IOB6rOE7KKMIiwidmVyc2lvbiI6IjIwMjItMTEtMTYifQ.AjizuopO2ldsAuVxZf21Z0OhxR8PFB6gGq1-29wkMQw
Kotlin
복사
5.
응답 서명을 확인하고 결과 값을 확인하세요.
/**
* @param signedTarget verify target (signed responseBody from tosspayments)
* @param securityKey symmetric key from tosspayments
* @return JWS payload (plain responseBody in JSON)
*/
fun verify(signedTarget: String, securityKey: String): String {
val jwsObject = JWSObject.parse(signedTarget)
val verifier = MACVerifier(securityKey)
jwsObject.verify(verifier)
val verifiedJwsObject = if (jwsObject.state == JWSObject.State.VERIFIED) {
jwsObject
} else {
throw JOSEException("Failed to verify")
}
return verifiedJwsObject.payload.toString()
}
Kotlin
복사
B. ENCRYPTION 방식
1.
{
"amount":500,
"orderId":"test_order_0",
"orderName":"토스 티셔츠 외 2건",
"customerName":"박토스",
"bank":"신한"
}
JSON
복사
2.
Request Body 파라미터를 보안키(securityKey)로 암호화하세요. AES256-GCM 방식을 사용하기 때문에 JWE 헤더의 enc 값을 “A256GCM” 으로 설정하세요({"enc":"A256GCM","alg":"dir"}).
/**
* @param target target object for encryption (requestBody)
* @param securityKey symmetric key from tosspayments
* @return requestBody in JWE
*/
fun encrypt(target: Any, securityKey: String): String {
val payload = objectMapper.writeValueAsString(target)
val key = Hex.decode(securityKey)
val header = JWEHeader(JWEAlgorithm.DIR, EncryptionMethod.A256GCM)
val jweObject = JWEObject(header, Payload(payload))
jweObject.encrypt(DirectEncrypter(key))
return jweObject.serialize()
}
Kotlin
복사
3.
curl --location 'https://api-dev.tosspayments.com/v1/virtual-accounts' \
--header 'Authorization: Basic dGVzdF9za19aMFJuWVgydzUzMk5vdkJaN2tOM05leXFBcFFFOgo=' \
--header 'Content-Type: text/plain' \
--data 'eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiZGlyIn0..OuOPmSkGR2CNk4XJ.0wt42ViuBt1bTwpCUJAllLkGtL3Wp0jIBYk2b2BzeA5fjy1I45C_4EEdkOGtHi2NZ5_Q-aVvfcziBM8UNeC8mgsBI5ypslDYXvRGOQ-Pf9jxs4qn6b6K1aNSCJR7Id2ePdVguQl7MW4S5-AYKkbboDKdPhLn1vx1zOSd9w.70SmVvXN8RHpxDhJRU3Ygw'
Bash
복사
4.
응답도 같은 방식으로 암호화되어 반환됩니다.
eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiZGlyIn0..4A-Pv1Q3b1JZbAja._3WwBypBPPoa8pLylIEhR1sGFejI8fpFDNxs0it2Lp0i1LUky_K2eXuoH_ctcoaOJrvdKRA6QpHmZ5f-oV_pg9PZUoxRyBlWJq80JXQyP3LZZdm0TRrhWrj58vqlTQHBfaG76IAZVIS1vqSxfcidUcYy_w58o4E-X79u8HNDz4rA4JNQ7j7aJuZHf8EPWhYUq1pfPkdKNg-ojwBUT-Mqx7Vcwyz-PjYj0TDLq9oaiopXUvqCHzE-mNk-VEqI6wTEyaC7aU6nnPv_FNczmZS3EsxIuA1DfGontUnLvXIHClOchaH4nxg9oJ51ASjFsZHgHhJLiunSFB_IIKvNlgpiufQZSVP21e-t1Jl6pmPdPrvjUy5usEFSM25Qi0nMt52PxYTBJD6rNl9OKTW4urbLRZ6-wruPvb4b00IRBFNyQuNitqUd64W2l_czEaqCEvvFjopr14svmksKy8_2KiWoTMXGbBMhY-0Z5zUfQSz66ALaEHFR_19WCKNW4uCuapfdbDuLH4hI41wwNLmF9OluCmami2qJqhyAuRyCJTau6Ey-NuOra21OP6PjsL7ufRrm50EfJa75Gx5W9shLu59Z73mRjOmBaOY5aFdhoycGgAo-4FbaRuJp_Cc5GIDHABI79oD8rgYTgQJtY63NeFFf29a46XD6U07RPKC_uauj-7w3e_uHDq__qObOSlGxfL365oB7fmR5Pn8dNPLTERit7BS3KdQgGqW0cqkJqHRgnivfRN7vtiywi4wxnN1lJ7QA8juSUZ7lxdfVMWphYkHKahMEMCI5yTL84u1xj-cf0YXrebDJARLOZ4gaN6fpwNNVGC2xOxc_yCAAZgVGoUenRIxPLQyQEM1FQskDYr8vNKmLVfZWwYrRq4XpsAIO480Kf6URKS_C0gAm53tUzgmYooyQRJqi3BR20oHNdhPlVCYULEPjeUukLeVQfvn7FgUWViaCZM9LE1imaPeRMF2yLoWBzvlK57P3ce4d1QVXqjK2iHj3YbgAuFBBL0gU0pIZUbWPYwnYWwu2qdYmQjpd_cbgLd8goE6qOvEf5r1RMdBwL1xs3JFX6Z3BAlhrKNPvMvjGpyYjclW4VKkjuTEQtzm1844PWfZRsO-PHFP7nTTu0RtUzNzRS1MBcQBd-r7mWKl0NjTYztjPJCFD1-eirtF5l-9mjBXPrIE7aHvCepW46jpwKwMXTDtBqmGRuKvEWmwAgu_wGARCCiRbEgJnp70xJ1sfveqDlJlWLYtirgEeMDI4Xlik4L1y22mzLdnhsBULdecD1NJC2EGrK-wANBZhOuI8zsfQg0bvZ3u4KNVlJDSCRt4XCyALf3z58zs8Czam9hb0U3x1MB2TDMxE1InF7mE7hCvqzcmpf80evCuN5o-79QThUGrXgxD_IrTFOi-NnFiQVIe12dW5lDP4sVcus31GzDbSLoA3YW-qReEssP57H85XTV7Uej2ZznteYIe4JeTpFUjWTyyoYderdKjDeuP0GKILAwcJ1b5v2NGSbVGhnla3e0lRTpqiTYIt3Jbqm1z154A4jsIjqhO51h2s_PME0fmq3k6LH1aq7YP7olRAFy3K7Fg2mOoY_AUabqlShGv8ACh_GRU3VemtWwXAIxsQhv_4uKW5zaX_voDohWMd8WYGmq6k5-Joo5sMQM0zFasjn3FELTbDog8eVn4rF8uCxD5uDguPzV-mmJG-rbwqkqIjW9SM8Nduj9gvK80K_aaKVc_fHOaYrUADZ1c9Rw4Dblku.KDL-3asgKCW7kGkWVKjbuA
JSON
복사
5.
응답을 복호화하고 결과 값을 확인하세요.
/**
* @param encryptedTarget decrypt target (responseBody from tosspayments)
* @param securityKey symmetric key from tosspayments
* @return JWE payload (plain responseBody in JSON)
*/
fun decrypt(encryptedTarget: String, securityKey: String): String {
val jweObject = JWEObject.parse(encryptedTarget)
val key = Hex.decode(securityKey)
jweObject.decrypt(DirectDecrypter(key))
val decryptedJweObject = if (jweObject.state == JWEObject.State.DECRYPTED) {
jweObject
} else {
throw JOSEException("Failed to decrypt")
}
return decryptedJweObject.payload.toString()
}
Kotlin
복사
TransferDelegationAccount 객체
가맹점의 지급 계좌 정보입니다.
transferDelegationAccountKey string
지급 계좌 키입니다.
balanceAmount number
지급 계좌의 금액입니다. 서브몰에 지급이 가능한 잔액입니다.
currency string
통화입니다.
virtualAccounts array
지급 계좌 정보입니다.
잔액 조회
GET /v1/transfer-delegation-accounts
요청
curl --request GET \
--url https://api.tosspayments.com/v1/transfer-delegation-accounts \
--header 'Authorization: Basic dGVzdF9za19hQlg3emsyeWQ4eW9Yd29KMGdxVng5UE9McUtROg=='
Bash
복사
응답
잔액 조회에 성공했다면 TransferDelegationAccount 객체가 돌아옵니다.
[
{
"transferDelegationAccountKey": "TDA_PQLMmf2l",
"balanceAmount": 10000000,
"currency": "KRW",
"virtualAccounts": [{
"bankCode": "020",
"accountNumber": "94000910518216",
"holderName": "김토스 상점"
}],
}
]
Bash
복사
TransferDelegationSubMall 객체
가맹점이 등록한 서브몰 정보입니다.
subMallId string
서브몰의 ID입니다. 최대 길이는 20자입니다.
type string
서브몰의 타입입니다. CORPORATE(법인), INDIVIDUAL(개인) 중 하나입니다.
companyName nullable · string
서브몰의 상호명입니다. 최대 길이는 공백을 포함한 한글 30자, 영문 60자입니다. 서브몰의 type이 CORPORATE(법인)일 때만 사용됩니다.
representativeName nullable · string
서브몰의 대표자명입니다. 최대 길이는 40자입니다. 서브몰의 type이 CORPORATE(법인)일 때만 사용됩니다.
businessNumber nullable · string
서브몰의 사업자등록번호 입니다. 길이는 10자입니다. 서브몰의 type이 CORPORATE(법인)일 때만 사용됩니다.
account object
서브몰에서 정산 금액을 지급받을 계좌 정보를 담은 객체입니다.
email nullable · string
서브몰 이메일 주소입니다.
phoneNumber nullable · string
서브몰 연락처입니다. - 없이 숫자만 넣어야 합니다. 길이는 8자 이상 11자 이하여야 합니다.
metadata nullable · object
서브몰과 관련된 추가 정보를 key-value 쌍으로 담고 있는 객체입니다. 최대 50개의 key-value 쌍을 포함할 수 있으며 전체 크기는 4kB 이하입니다.
서브몰 등록
지급 계좌의 유효성을 검증하고 요청한 정보를 서브몰로 등록합니다.
[POST] /v1/transfer-delegation-sub-malls
Request Body 파라미터
subMallId 필수 · string
서브몰의 ID입니다. 최대 길이는 20자입니다.
type 필수 · string
서브몰의 타입입니다. CORPORATE(법인), INDIVIDUAL(개인) 중 하나의 값을 넣어주세요.
companyName string
서브몰의 상호명입니다. 서브몰의 type이 CORPORATE일 때 필수로 보내야 하는 파라미터입니다. 최대 길이는 공백을 포함한 한글 30자, 영문 60자입니다.
representativeName string
서브몰의 대표자명입니다. 최대 길이는 40자입니다. 서브몰의 type이 CORPORATE(법인)일 때만 사용됩니다.
businessNumber string
서브몰의 사업자등록번호 입니다. 서브몰의 type이 CORPORATE일 때 필수로 보내야 하는 파라미터입니다. 길이는 10자입니다.
account 필수 · string
서브몰에서 정산 금액을 지급받을 계좌 정보를 담은 객체입니다.
email 필수 · string
서브몰 이메일 주소입니다.
phoneNumber 필수 · string
서브몰 연락처입니다. - 없이 숫자만 넣어야 합니다. 길이는 8자 이상 11자 이하여야 합니다.
metadata object
서브몰과 관련된 추가 정보를 key-value 쌍으로 담고 있는 객체입니다. 최대 50개의 key-value 쌍을 포함할 수 있으며 전체 크기는 4kB 이하입니다.
요청
curl --request POST \
--url https://api.tosspayments.com/v2/transfer-delegation-sub-malls \
--header 'Authorization: Basic dGVzdF9za19hQlg3emsyeWQ4eW9Yd29KMGdxVng5UE9McUtROg==' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: 9c57d3e3-8d96-4e6a-9fd9-5434091eb173' \
--data '{"subMallId":"testmall100","account":{"bank":"03","accountNumber":"34000000000011","holderName":"김토페"},"type":"CORPORATE","email":"example@email.com","phoneNumber":"01012341234","companyName":"테스트몰100","representativeName":"김토페","businessNumber":"1200220000"}'
Bash
복사
응답
서브몰 등록에 성공했다면 TransferDelegationSubMall 객체가 돌아옵니다.
{
"subMallId": "testmall100",
"type": "CORPORATE",
"companyName": "테스트몰100",
"representativeName": "김토페",
"businessNumber": "1200220000",
"account": {
"bankCode": "003",
"accountNumber": "00123412341234",
"holderName": "김토페"
},
"email": "testmall100@test.com",
"phoneNumber": "01012341234",
"metadata": null
}
JSON
복사
서브몰 수정
등록된 서브몰의 정보를 수정합니다. 서브몰이 삭제되지 않은 상태에서만 수정이 가능합니다. 서브몰 ID를 제외한 모든 정보를 수정할 수 있어요.
[POST] /v1/transfer-delegation-sub-malls/{subMallId}
Path 파리미터
subMallId 필수 · string
서브몰 ID입니다.
Request Body 파라미터
companyName string
서브몰의 상호명입니다. 서브몰의 type이 CORPORATE일 때 필수로 보내야 하는 파라미터입니다. 최대 길이는 공백을 포함한 한글 30자, 영문 60자입니다.
representativeName string
서브몰의 대표자명입니다. 최대 길이는 40자입니다. 서브몰의 type이 CORPORATE(법인)일 때만 사용됩니다.
businessNumber string
서브몰의 사업자등록번호 입니다. 서브몰의 type이 CORPORATE일 때 필수로 보내야 하는 파라미터입니다. 길이는 10자입니다.
account 필수 · string
서브몰에서 정산 금액을 지급받을 계좌 정보를 담은 객체입니다.
email string
서브몰 이메일 주소입니다.
phoneNumber string
서브몰 연락처입니다. - 없이 숫자만 넣어야 합니다. 길이는 8자 이상 11자 이하여야 합니다.
metadata object
서브몰과 관련된 추가 정보를 key-value 쌍으로 담고 있는 객체입니다. 최대 50개의 key-value 쌍을 포함할 수 있으며 전체 크기는 4kB 이하입니다.
요청
curl --request POST \
--url https://api.tosspayments.com/v1/transfer-delegation-sub-malls/{subMallId} \
--header 'Authorization: Basic dGVzdF9za19hQlg3emsyeWQ4eW9Yd29KMGdxVng5UE9McUtROg==' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: 6f873db5-8bfb-4d30-9b07-4cc7d4fba7f9' \
--data '{"account":{"bank":"003","accountNumber":"34000000000011","holderName":"김토페"},"companyName":"테스트몰200","representativeName":"김토페","businessNumber":"1200220000"}'
Bash
복사
응답
서브몰 수정에 성공했다면 TransferDelegationSubMall 객체가 돌아옵니다.
{
"subMallId": "testmall100",
"type": "CORPORATE",
"companyName": "테스트몰200",
"representativeName": "김토페",
"businessNumber": "1200220000",
"account": {
"bankCode": "003",
"accountNumber": "34000000000011",
"holderName": "김토페"
},
"email": "testmall100@test.com",
"phoneNumber": "01012341234",
"metadata": null
}
JSON
복사
서브몰 삭제
등록된 서브몰을 삭제합니다. 삭제한 서브몰 ID는 다시 사용할 수 없어요.
[POST] /v1/transfer-delegation-sub-malls/{subMallId}/delete
요청
curl --request POST \
--url https://api.tosspayments.com/v1/transfer-delegation-sub-malls/{subMallId}/delete \
--header 'Authorization: Basic dGVzdF9za19hQlg3emsyeWQ4eW9Yd29KMGdxVng5UE9McUtROg==' \
Bash
복사
응답
서브몰 삭제에 성공했다면 HTTP 200 상태 코드와 empty body가 돌아옵니다.
서브몰 조회
등록된 서브몰을 조회합니다. 삭제되지 않은 서브몰만 조회할 수 있어요.
[GET] /v1/transfer-delegation-sub-malls/{subMallId}
요청
curl --request GET \
--url https://api.tosspayments.com/v1/transfer-delegation-sub-malls/{subMallId} \
--header 'Authorization: Basic dGVzdF9za19hQlg3emsyeWQ4eW9Yd29KMGdxVng5UE9McUtROg=='
Bash
복사
응답
서브몰 조회에 성공했다면 TransferDelegationSubMall 객체가 돌아옵니다.
{
"subMallId": "testmall100",
"type": "CORPORATE",
"companyName": "테스트몰200",
"representativeName": "김토페",
"businessNumber": "1200220000",
"account": {
"bankCode": "003",
"accountNumber": "34000000000011",
"holderName": "김토페"
},
"email": "testmall100@test.com",
"phoneNumber": "01012341234",
"metadata": null
}
JSON
복사
TransferDelegation 객체
지급대행 한 건의 정보입니다.
transferDelegationKey string
지급대행 한 건의 키입니다. 최대 길이는 24자입니다.
subMallId string
서브몰의 ID입니다. 최대 길이는 20자입니다.
type string
즉시・예약 지급대행 유형을 구분합니다. INSTANT는 즉시 지급대행 건입니다. SCHEDULED는 예약 지급대행 건입니다.
transferDate string
지급일입니다. yyyy-MM-dd 형식입니다.
transferAmount number
지급할 금액입니다.
requestedAt string
지급거래를 요청한 일입니다. yyyy-MM-dd'T'HH:mm:ss±hh:mm 형식입니다.
account nullable ・ object
서브몰의 계좌 정보를 담은 객체입니다.
status string
지급대행 상태입니다. 아래와 같은 상태 값을 가질 수 있습니다.
•
REQUESTED: 지급이 요청된 상태입니다.
•
IN_PROGRESS: 지급을 처리하고 있는 상태입니다.
•
COMPLETED: 서브몰에 지급이 완료된 상태입니다.
•
FAILED: 지급 요청이 실패한 상태입니다.
•
CANCELED: 지급 요청을 취소한 상태입니다.
metadata nullable ・ object
서브몰과 관련된 추가 정보를 key-value 쌍으로 담고 있는 객체입니다. 최대 50개의 key-value 쌍을 포함할 수 있으며 전체 크기는 4kB 이하입니다.
failure nullable ・ object
지급대행 요청이 실패하면 보내주는 정보입니다. status 필드가 FAILED 일 때만 정보를 보여줍니다.
ㄴ code string
오류 타입을 보여주는 에러 코드입니다. INVALID_ACCOUNT, TRANSFER_FAILED 두 가지 코드만 돌아옵니다.
ㄴ message string
에러 메시지입니다. 에러 발생 이유를 알려줍니다.
transferSummary string
지급대행으로 입금된 금액의 세부 내용(적요)입니다. 서브몰 통장에 표기되는 정보입니다. 최대 길이는 7자입니다.
실시간 지급대행 요청
지급 대상 서브몰에게 지급 금액을 요청 직후 이체합니다. 요청 시점에 잔액이 부족하면 요청이 실패합니다.
[POST] /v1/transfer-delegations/instant
Request Body 파라미터
subMallId 필수 · string
서브몰의 ID입니다. 최대 길이는 20자입니다.
transferAmount 필수 · number
정산할 지급 금액입니다.
metadata object
서브몰과 관련된 추가 정보를 key-value 쌍으로 담고 있는 객체입니다. 최대 50개의 key-value 쌍을 포함할 수 있으며 전체 크기는 4kB 이하여야 합니다. key와 value 모두 문자열 형식이어야 합니다.
transferSummary string
지급대행으로 입금된 금액의 세부 내용(적요)입니다. 서브몰 통장에 표기됩니다. 최대 길이는 7자입니다.
요청
아래 Request Body를 SIGNATURE 또는 ENCRYPTION 방식으로 인증하고 API 요청에 넣어주세요.
[
{
"subMallId": "mall1",
"transferAmount": 50000,
"metadata": null,
"transferSummary": "김토스"
},
{
"subMallId": "mall2",
"transferAmount": 50000,
"metadata": null,
"transferSummary": "김토스"
},
]
JSON
복사
응답
인코딩된 응답을 확인하세요.
실시간 지급대행에 성공했다면 TransferDelegation 객체가 돌아옵니다.
[
{
"transferDelegationKey": "FPA20231001_000000000001",
"subMallId": "mall1",
"type": "INSTANT",
"transferDate": "2023-10-01",
"transferAmount": 50000,
"requestedAt": "2023-10-01T00:00:00",
"account": null,
"status": "REQUESTED",
"metadata": null,
"failure": null,
"transferSummary": "김토스"
},
{
"transferDelegationKey": "FPA20231001_000000000001",
"subMallId": "mall2",
"type": "INSTANT",
"transferDate": "2023-10-01",
"transferAmount": 50000,
"requestedAt": "2023-10-01T00:00:00",
"account": null,
"status": "REQUESTED",
"metadata": null,
"failure": null,
"transferSummary": "김토스"
}
]
JSON
복사
지급대행 단건 조회
지급 건의 키를 사용해서 1개의 지급 객체를 조회합니다.
[GET] /v1/transfer-delegations/{transferDelegationKey}
요청
curl --request GET \
--url https://api.tosspayments.com/v1/transfer-delegations/{transferDelegationKey} \
--header 'Authorization: Basic dGVzdF9za19hQlg3emsyeWQ4eW9Yd29KMGdxVng5UE9McUtROg=='
Bash
복사
응답
지급대행 단건 조회에 성공했다면 TransferDelegation 객체가 돌아옵니다.
{
"transferDelegationKey": "FPA20231001_000000000001",
"subMallId": "mall1",
"type": "INSTANT",
"transferDate": "2023-10-01",
"transferAmount": 50000,
"requestedAt": "2023-10-01T00:00:00",
"account": null,
"status": "REQUESTED",
"metadata": null,
"failure": null,
"transferSummary": "김토스"
}
Bash
복사
지급대행 조회
조회 기간 범위에서 모든 지급 건을 조회합니다. 조회 기간에 지급 건이 없으면 빈 배열을 반환합니다.
[GET] /v1/transfer-delegations?startDate={startTransferDate}&endDate={endTransferDate}&cursor={cursor}&limit={limit}
Path 파라미터
startTransferDate 필수 · string
조회를 시작하고 싶은 날짜 정보입니다. ISO 8601 형식인 yyyy-MM-dd를 사용합니다. (e.g. 2022-01-01)
endTransferDate 필수 · string
조회를 마치고 싶은 날짜 정보입니다. yyyy-MM-dd ISO 8601 형식입니다. (e.g. 2022-01-01)
cursor string
특정 지급 건의 transferDelegationKey를 설정하면, 해당 지급 건 이후의 내역만 조회됩니다.
limit integer
한 번에 조회할 지급 건의 수입니다. 생략하면 100 건까지 조회됩니다. 최대값은 10,000 건입니다.
요청
curl --request GET \
--url https://api.tosspayments.com/v1/transfer-delegations?startDate={startTransferDate}&endDate={endTransferDate}&cursor={cursor}&limit={limit} \
--header 'Authorization: Basic dGVzdF9za19hQlg3emsyeWQ4eW9Yd29KMGdxVng5UE9McUtROg=='
Bash
복사
응답
지급대행 조회에 성공했다면 TransferDelegation 객체가 돌아옵니다.
[
{
"transferDelegationKey": "FPA20231001_000000000001",
"subMallId": "mall1",
"type": "INSTANT",
"transferDate": "2023-10-01",
"transferAmount": 50000,
"requestedAt": "2023-10-01T00:00:00",
"account": null,
"status": "REQUESTED",
"metadata": null,
"failure": null,
"transferSummary": "김토스"
},
{
"transferDelegationKey": "FPA20231001_000000000001",
"subMallId": "mall2",
"type": "INSTANT",
"transferDate": "2023-10-01",
"transferAmount": 50000,
"requestedAt": "2023-10-01T00:00:00",
"account": null,
"status": "REQUESTED",
"metadata": null,
"failure": null,
"transferSummary": "김토스"
}
]
Bash
복사