ONE store In-App支付服务器API (API V7)
概要
ONE store In-App支付服务器API是指用于查询在ONE store中支付的In-App商品的数据或变更支付状态的Open API。 为了使用该API,需要进行OAuth认证。
HOST Domain
本文中使用的Host Domain如下:
ONE store环境
Host Domain
验证(开发)
商用
本文中使用的域名是,国内和全球通用的域名。
仅在韩国服务的现有App/游戏的域名则保持原有的。(apis.onestore.co.kr)
市场分类
● Request header中已新增市场分类代码(x-market-code)。
● 如果在全球范围内提供服务,则必须在header中添加市场分类代码。
● 如果没有市场分类代码,会议韩国服务(默认值)来调用。
MKT_ONE
韩国
MKT_GLB
除韩国外
根据市场区分代码,服务器 API 响应提供的时间标准有所不同。
MKT_ONE : UTC+09
MKT_GLC : UTC+00
ONE store OAuth
OAuth概要
为了联动ONE store服务器Open API,需要进行OAuth认证。
ONE store OAuth V2的理解
AccessToken是通过ONE store的Server Open API可以获得的值,在调用ONE store提供的Server Open API时作为认证value使用
默认情况下,AccessToken有效期为3600秒,如果有效期满或不足600秒时,可调用getAccessToken()发放新的AccessToken。
现有的AccessToken也可在有效期结束前使用。
由于是多数AccessToken发行的方式,因此每个开发公司的服务instance都可以获取并使用不同的AccessToken。
一般联动流程如下
获得AccessToken的过程(1号)只需在API调用时发生认证错误时调用即可。
对于ONE store中的In-App支付服务器API的调用,可使用Authorization Bearer Scheme,调用示例如下:
Authorization Header与上述示例一样必须正确输入,Bearer + 空白 + AccessToken应区分大小写。 Bearer的值是通过调用getAccessToken()获得的AccessToken值。
错误示例
OAuth API详情
确认client_id 及client_secret
client_id和 client_secret的值可通过点击ONE store开发者中心注册的App的In-App信息 > "认证及许可证"按钮确认。
发放AccessToken
URI : /v7/oauth/token
Method: POST
Request Parameter: Form格式
Parameter Name
Description
Example
client_id
一般来说和packageName相同
com.onestore.game.goindol
client_secret
在开发者中心上架应用软件时发放的client secret 值
vxIMAGcVz3DAx20uDBr/IDWNJAPNHFl7YruF4uxB6BI=
grant_type
固定值
client_credentials
Request Header :
Parameter Name
Description
Example
Content-Type
Http请求时Content Type必须设置为application/x-www-form-urlencoded
Content-Type: application/x-www-form-urlencoded
x-market-code
市场分类代码
x-market-code: MKT_GLB
Example
Response Body : JSON格式
Element Name
Data Type
Data Size
Description
client_id
String
255
OAuth认证client_id
access_token
String
36
AccessToken
token_type
String
6
只提供bearer方式
expires_in
Integer
10
token有效期, 单位 : 秒(second)
scope
String
1024
token使用范围
Example
发放示例
因为验证(开发)环境和商用环境的AccessToken是独立管理的,因此需要根据不同环境分类管理AccessToken。
服务器API详情
getPurchaseDetails (购买商品详情查询)
Desc : 查询购买的ONE store管理型商品的详细信息。 购买完成时,需使用收到的ONE store purchaseToken(购买token)查询。 通过包月型商品的purchaseToken查询时,将接收查询失败(NoSuchData)的响应。
URI : /v7/apps/{packageName}/purchases/inapp/products/{productId}/{purchaseToken}
Method : GET
Request Parameter : Path Variable格式
String packageName : 调用 API的应用软件包名 (Data Size : 128)
String productId : 商品ID (Data Size : 150)
String purchaseToken : 购买token (Data Size : 20)
Request Header
Parameter Name
Data Type
Required
Description
Authorization
String
true
通过Access Token API接收的access_token
Content-Type
String
true
application/json
x-market-code
String
false
市场分类代码
Example
Request Body : 无
Response Body : JSON格式
Element Name
Data Type
Data Size
Description
consumptionState
Integer
1
已购商品的消费状态 (0: 未消费, 1: 消费)
developerPayload
String
200
开发公司提供的支付固有标识符
purchaseState
Integer
1
购买状态 ( 0: 购买完成, 1: 取消完成)
purchaseTime
Long
13
购买时间 (ms)
purchaseId
String
20
购买ID
acknowledgeState
Integer
1
确认购买状态( 0: Not Acknowledged, 1: Acknowledged)
quantity
Integer
2
购买数量
Example
getRecurringPurchaseDetails (包月型商品订单详情查询)
Desc : 查询购买的ONE store包月型商品的自动支付状态和最后的购买状态的详细信息。 购买完成时,需使用收到的ONE store purchaseToken(购买token)查询。通过管理型商品的purchaseToken查询时,将接收查询失败(NoSuchData)的响应。
URI : /v7/apps/{packageName}/purchases/auto/products/{productId}/{purchaseToken}
Method : GET
Request Parameter : Path Variable格式
String packageName : 调用 API的应用软件包名 (Data Size : 128)
String productId : 商品ID (Data Size : 150)
String purchaseToken : 购买token (Data Size : 20)
Request Header
Parameter Name
Data Type
Required
Description
Authorization
String
true
通过Access Token API接收的access_token
Content-Type
String
true
application/json
x-market-code
String
false
市场分类代码
Example
可根据以下条件判断客户是否有权使用包月型商品的内容。
如果当前时间小于或等于expiryTime(已购商品的使用终止时间),或者lastPurchaseState(最后自动支付的购买状态)为0(购买完成)状态, Ex) expiryTime >= 当前时间 AND lastPurchaseState == 0
acknowledgePurchase (确认已购商品)
Desc : 将购买的管理型或包月型商品变更为购买确认状态。
URI : /v7/apps/{packageName}/purchases/all/products/{productId}/{purchaseToken}/acknowledge
Method : POST
Request Parameter : Path Variable格式
String packageName : 调用 API的应用软件包名 (Data Size : 128)
String productId : 商品ID (Data Size : 150)
String purchaseToken : 购买token (Data Size : 20)
Request Header
Parameter Name
Data Type
Required
Description
Authorization
String
true
通过Access Token API接收的access_token
Content-Type
String
true
application/json
x-market-code
String
false
市场分类代码
Example
Request Body : JSON 형식
Element NameData TypeRequiredDescriptiondeveloperPayload
String
false
Example :
Response Body : JSON格式 传回以下格式的响应,以便在成功处理API时更直观地判断是否处理完成。如果API处理失败,将传回标准错误响应。
Element Name
Data Type
Data Size
Description
code
String
-
响应代码
message
String
-
响应信息
result
Object
-
Example :
ONE store自动取消3天内未调用acknowledgePurchase API的购买订单。
因此,开发公司必须调用相应API,可通过SDK API或服务器API进行处理。
但是,consumePurchase API被调用的购买订单会被判断为acknowledge,不会取消购买。
consumePurchase (消费已购商品)
Desc : 将购买的管理型商品状态更改为消费状态。
URI : /v7/apps/{packageName}/purchases/inapp/products/{productId}/{purchaseToken}/consume
Method : POST
Request Parameter : Path Variable格式
String packageName :调用 API的应用软件包名 (Data Size : 128)
String productId : 商品ID (Data Size : 150)
String purchaseToken : 购买token (Data Size : 20)
Request Header
Parameter Name
Data Type
Required
Description
Authorization
String
true
通过Access Token API接收的access_token
Content-Type
String
true
application/json
x-market-code
String
false
市场分类代码
Example
Request Body : JSON 형식
Element NameData TypeRequiredDescriptiondeveloperPayload
String
false
Example :
Response Body : JSON 형식
传回以下格式的响应,以便在成功处理API时更直观地判断是否处理完成。如果API处理失败,将传回标准错误响应。
Element NameData TypeData SizeDescriptioncode
String
-
响应代码
message
String
-
响应信息
result
Object
-
Example :
cancelRecurringPurchase (请求解除自动支付)
Desc : 请求解除包月型商品的自动支付。使用订阅型商品的purchaseToken查询时, 将接收查询失败(NoSuchData)响应。
URI : /v7/apps/{packageName}/purchases/auto/products/{productId}/{purchaseToken}/cancel
Method : POST
Request Parameter : Path Variable格式
String packageName : 调用 API的应用软件包名 (Data Size : 128)
String productId : 商品ID (Data Size : 150)
String purchaseToken : 购买token (Data Size : 20)
Request Header
Parameter Name
Data Type
Required
Description
Authorization
String
true
通过Access Token API接收的access_token
Content-Type
String
true
application/json
x-market-code
String
false
市场分类代码
Example
Request Body : 无
Response Body : JSON格式 传回以下格式的响应,以便在成功处理API时更直观地判断是否处理完成。如果API处理失败,将传回标准错误响应。
Element Name
Data Type
Data Size
Description
code
String
-
响应代码
message
String
-
响应信息
result
Object
-
Example :
reactiveRecurringPurchase (请求取消解除自动支付)
Desc : 取消解除包月型商品的自动支付的请求。使用订阅型商品的purchaseToken查询时,将接收查询失败(NoSuchData)响应。
URI : /v7/apps/{packageName}/purchases/auto/products/{productId}/{purchaseToken}/reactivate
Method : POST
Request Parameter : Path Variable格式
String packageName : 调用 API的应用软件包名 (Data Size : 128)
String productId : 商品ID (Data Size : 150)
String purchaseToken : 购买token (Data Size : 20)
Request Header
Parameter Name
Data Type
Required
Description
Authorization
String
true
通过Access Token API接收的access_token
Content-Type
String
true
application/json
x-market-code
String
false
市场分类代码
Example
Request Body : 无
Response Body : JSON格式 传回以下格式的响应,以便在成功处理API时更直观地判断是否处理完成。如果API处理失败,将传回标准错误响应。
Element Name
Data Type
Data Size
Description
code
String
-
响应代码
message
String
-
响应信息
result
Object
-
Example :
getVoidedPurchases (查询取消的订单)
Desc : 查询取消的订单
URI : /v7/apps/{packageName}/voided-purchases
Method : GET
Request Parameter : Path Variable格式
String packageName : 调用 API的应用软件包名 (Data Size : 128)
Request Parameter (Optional) : Query String格式
String continuationKey : 取消购买的数量较多时,ONE store服务器返回该值。 当响应中有continuationKey时,通过再次调用getVoidedPurchases的同时传递continuationKey,可能会收到额外的取消购买历史记录。 (Data Size : 41)
String startTime : 取消购买日期的搜索开始的时间 (milliseconds). 以当前时间为准,仅可设置到过去1个月内;单独使用startTime时,endTime设置成以startTime基准的未来1个月。 (Data Size : 13)
String endTime : 取消购买日期的搜索结束的时间 (milliseconds). 不能超过当前时间,单独使用endTime时,startTime设置成以endTime为基准的过去1个月。 (Data Size : 13)
unsigned integer maxResults : 最大查询次数 default 100 (Data Size : 3)
Request Header
Parameter Name
Data Type
Required
Description
Authorization
String
true
通过Access Token API接收的access_token
Content-Type
String
true
application/json
x-market-code
String
false
市场分类代码
Example
Request Body : 无
Response Body
Element Name
Data Type
Data Size
Description
continuationKey
String
41
取消购买数量大于最大查询数量时返回。在后续请求中,通过设置接收的continuationKey进行调用,可以查询后续历史记录。
voidedPurchaseList
-
purchaseId
String
20
购买ID
purchaseTime
Long
13
购买时间(ms)
voidedTime
Long
13
购买取消时间(ms)
purchaseToken
String
20
购买Token
marketCode
String
-
市场分类代码
Example :
getSubscriptionDetail (订阅型商品订单详情查询)
Desc : 查询订阅型商品的订单详情。
URI : /v7/apps/{packageName}/purchases/subscription/products/{productId}/{purchaseToken}
Method : GET
Request Parameter : Path Variable格式
String packageName : 调用 API的应用软件包名 (Data Size : 128)
String productId : 商品ID (Data Size : 150)
String purchaseToken : 购买token (Data Size : 20)
Request Header
Parameter Name
Data Type
Required
Description
Authorization
String
true
通过Access Token API接收的access_token
Content-Type
String
true
application/json
x-market-code
String
false
市场分类代码
Example
Request Body : 无
Response Body
Element Name
Data Type
Data Size
Description
acknowledgementState
Integer
1
购买确认状态( 0: Not Acknowledged, 1: Acknowledged)
developerPayload
String
200
开发公司提供的支付固有标识符
autoRenewing
boolean
-
是否更新下一次支付 o 订阅解除预约,解除,到期 : false o 剩余 : true
paymentState
Integer
1
是否接收 订阅支付 o null: 到期状态 o 0: 支付未完成状态 o 1: 请求支付后支付完成的状态 o 2: 处理为免费期间的状态 o 3: 商品升级/降级时处理为DEFERRED选项的状态
priceAmount
String
-
购买金额
priceAmountMicros
Long
-
购买金额 * 100万
nextPriceAmount
String
-
下一次购买金额
nextPriceAmountMicros
Long
-
下一次购买金额 * 100万
nextPaymentTimeMillis
Long
13
下一次购买时间(ms)
priceCurrencyCode
String
-
货币代码(KRW 固定)
countryCode
String
-
国家代码(KR 固定)
startTimeMillis
Long
13
订阅开始(第一次支付)时间(ms)
expiryTimeMillis
Long
13
订阅到期时间(ms)
pauseStartTimeMillis
Long
13
暂停开始日期(ms)-仅在暂停预约/暂停时存在
pauseEndTimeMillis
Long
13
暂停开始日期(ms)-仅在暂停预约/暂停时存在
autoResumeTimeMillis
Long
13
暂停后重新订阅时间 o 正常订阅中: null o 暂停预约/确定/暂停中: 下一次支付日 + 暂停日期
linkedPurchaseToken
String
20
变更订阅商品时,如没有变更以前的purchaseToken, 则为null
lastPurchaseId
String
20
最后一次购买ID
cancelledTimeMillis
Long
13
订阅解除时间(ms)
cancelReason
Integer
1
订阅解除原因 o 0 : 客户请求 o 1 : 其他
promotionPrice
Object
-
促销活动金额信息
promotionPrice.promotionPrice
String
-
促销活动金额
promotionPrice.promotionPriceMicros
Long
-
促销活动金额信息 * 100万
promotionPrice.promotionPeriod
Int
-
促销活动适用次数
priceChange
Object
-
价格变动信息
priceChange.seq
Integer
-
价格变动顺序
priceChange.previousPrice
String
-
之前价格
priceChange.previousPriceMicros
Long
-
之前价格 * 100万
priceChange.newPrice
String
-
新价格
priceChange.newPriceMicros
Long
-
新价格 * 100万
priceChange.applyTimeMillis
Long
13
适用日期(ms)
priceChange.agreement
Boolean
-
价格变动同意与否
priceChange.agreementDueDateTimeMillis
Long
13
对价格变动同意的截止时间(ms) (政策附加说明) Value = 价格变更日 +7+30日 用户可以在同意到期日后的第一个自动支付时间点为止同意。
Example :
cancelSubscription (请求解除订阅支付)
Desc : 请求解除订阅型商品的自动支付。但在请求时,如果商品的订阅状态是暂时停止、延期支付、账户保留的话,会立即要求解除。
URI : /v7/apps/{packageName}/purchases/subscription/products/{productId}/{purchaseToken}/cancel
Method : POST
Request Parameter : Path Variable格式
String packageName : 调用 API的应用软件包名 (Data Size : 128)
String productId : 商品ID (Data Size : 150)
String purchaseToken : 购买token (Data Size : 20)
Request Header
Parameter Name
Data Type
Required
Description
Authorization
String
true
通过Access Token API接收的access_token
Content-Type
String
true
application/json
x-market-code
String
false
市场分类代码
Example
Request Body : 无
Response Body : JSON格式 传回以下格式的响应,以便在成功处理API时更直观地判断是否处理完成。如果API处理失败,将传回标准错误响应。
Element Name
Data Type
Data Size
Description
code
String
-
响应代码
message
String
-
响应信息
result
Object
-
Example :
reactivateSubscription (请求取消解除订阅支付)
Desc : 取消订阅型商品的解除自动支付的要求。但,如果是立即解除的情况,就不能取消解除的请求。
URI : /v7/apps/{packageName}/purchases/subscription/products/{productId}/{purchaseToken}/reactivate
Method : POST
Request Parameter : Path Variable格式
String packageName : 调用 API的应用软件包名 (Data Size : 128)
String productId : 商品ID (Data Size : 150)
String purchaseToken : 购买token (Data Size : 20)
Request Header
Parameter Name
Data Type
Required
Description
Authorization
String
true
通过Access Token API接收的access_token
Content-Type
String
true
application/json
x-market-code
String
false
市场分类代码
Example
Request Body : 无
Response Body : JSON格式 传回以下格式的响应,以便在成功处理API时更直观地判断是否处理完成。如果API处理失败,将传回标准错误响应。
Element Name
Data Type
Data Size
Description
code
String
-
响应代码
message
String
-
响应信息
result
Object
-
Example :
deferSubscription (请求延期订阅支付)
Desc : 延期订阅型商品的下一个支付日。
URI : /v7/apps/{packageName}/purchases/subscription/products/{productId}/{purchaseToken}/defer
Method : POST
Request Parameter : Path Variable格式
String packageName : 调用 API的应用软件包名 (Data Size : 128)
String productId : 商品ID (Data Size : 150)
String purchaseToken : 购买token (Data Size : 20)
Request Header
Parameter Name
Data Type
Required
Description
Authorization
String
true
通过Access Token API接收的access_token
Content-Type
String
true
application/json
x-market-code
String
false
市场分类代码
Example
Request Body : JSON格式
Parameter Name
Data Type
Required
Description
deferPeriod
Integer
true
延期时间 o 商用: 日为单位(1~365日) o Sandbox: 分为单位
Example :
Response Body : JSON格式 传回以下格式的响应,以便在成功处理API时更直观地判断是否处理完成。如果API处理失败,将传回标准错误响应。
Element Name
Data Type
Data Size
Description
code
String
-
响应代码
message
String
-
响应信息
result
Object
-
Example :
标准响应规格
标准响应代码
Code
Message
Description
HTTP Status Code
有关API
AccessBlocked
The request was blocked.
请求被阻止。
403 - Fobidden
通用
AccessTokenExpired
Access token has expired.
Access token已过期。
401 - Unauthorized
通用
BadRequest
The request are invalid.
请求无效。
400 - Bad Request
通用
DeveloperPayloadNotMatch
The request developerPayload does not match the value passed in the purchase request.
与购买请求中传递的 developerPayload值不一致。
400 - Bad Request
acknowledgePurchase consumePurchase
InternalError
An undefined error has occurred.
发生了未定义的错误。
500 - Internal Server Error
通用
InvalidAccessToken
Access token is invalid.
Access token无效。
401 - Unauthorized
通用
InvalidAuthorizationHeader
Authorization header is invalid.
Authorization header值无效。
400 - Bad Request
通用
InvalidConsumeState
The purchase consumption status cannot be changed or has already been changed.
消费状态不能更改或已经更改。
409 - Conflict
consumePurchase
InvalidContentType
The request content-type is invalid.
无效的Content Type。
415 - Unsupported Media Type
通用
InvalidPurchaseState
Purchase history does not exist or is not completed.
购买订单不存在或不是购买完成状态。
409 - Conflict
acknowledgePurchase consumePurchase
InvalidRequest
Request parameters are invalid. [ field1, field2, ... ]
请求参数无效。 [ field1, field2, ... ]
400 - Bad Request
通用
MethodNotAllowed
HTTP method not supported.
不支持的HTTP Method。
405 - Method Not Allowed
通用
NoSuchData
The requested data could not be found.
查询的结果值不存在。
404 - Not Found
getPurchaseDetails getRecurringPurchaseDetails
RequiredValueNotExist
Request parameters are required. [ field1, field2, ... ]
必须值不存在。 [ field1, field2, ... ]
400 - Bad Request
通用
ResourceNotFound
The requested resource could not be found.
请求的资源不存在。
404 - Not Found
通用
ServiceMaintenance
System maintenance is in progress.
系统维护正在进行中。
503 - Service Temporarily Unavailable
通用
Success
The request has been completed successfully.
请求已成功完成。
200 - Success
acknowledgePurchase consumePurchase cancelRecurringPurchase reactivateRecurringPurchase
UnauthorizedAccess
Not authorized to this API.
没有该API的访问权限。
403 - Fobidden
通用
标准错误响应规格
除了正常响应外,发生错误时,服务器API还会传回以下Example格式的标准错误响应。 请参考以下内容。
Response Body : JSON格式
Element Name
Data Type
Data Size
Description
code
String
-
响应代码
message
String
-
响应信息
error
Object
-
Example
通用代码
商品类型代码
Code
Name
Description
inapp
管理型商品
消费性/永久性/固定期限商品
auto
包月型商品
每月自动支付的商品
subscription
订阅型商品
订阅型(自动支付)的商品
all
全部商品
管理型商品 + 包月型商品
Last updated