Last updated
Last updated
You can download SDK or check the list of API at
Before releasing a device with a new OS version, we review once again whether some features of your app do not work after an OS version or an API level is upgraded. We expand and enhance our review (QA) process in an effort to deliver flawless apps to users after the version or level upgrade. Please visit to view the Android version.
In addition, you can select and change the OS version. Please refer to App Registration Guide for more details.
Now Update Sync Guide only leads you to the page where you can view whether ONE store Client is installed, and to other details.
We do not provide any update indicators yet, however we are reviewing to provide the update indicators as fast as possible.
Whenever an app is running, development tools (Eclipse, Android Studio) automatically generate a debug signature through the Android SDK.
And such signature is used whenever the app is used. But if you want to register and sell your Android app in ONE store, you are required to sign your app with private certification key before releasing your app.
Basically, if you do not sign your app with a debug key while building an Android app, your app might not be installed during the update, or not be released due to the expiration of validity.
Please ensure that you are required to sign your app with private key and to package it as indicated below.
Why you are required to use private key signing
You can inform users that the app is developed by you and managed with one review
You can simplify the contents upgrade.
You can implement multiple apps through one process.
You can share codes and data
Signing is to inform that you certify the app. For signing, you need keystore with an encrypted signature file and private key. You can generate a signature by using jarsigner provided by JDK as an open key. For more details, please visit
Please sign your app after developing Android content, building an app and testing the app to see if it works. You can finalize signing with private key.
How to sign an app by creating new private key
Eclipse > Open Project> Run > Run
File > Export > Android > Export Android Application
Browse > Select Android Project
Create new keystore > Input Location,Password,Confirm
Input Alias,Password,Confirm,Validity(years), First and Last Name, Count Code
Set location where APK file is stored > Finish
How to sign an app with the current private key
Eclipse > Export > Android > Export Android Application
Browse > Select Android Project
Use existing keystore , Input password (keystore password you entered while creating a new one)
Use existing key, Input password (alias password you entered while creating a new one )
Set location where APK file is stored > Finish
How to sign an app by creating private key with JDK
Execute Command Prompt (Start PC > Execute CMD)
Create Key to enter CMD: Create Private Key using CMD keytool Ex) keytool -genkey -v –keystore tstore.mykey -alias mytstore -keyalg RSA -validity 10000 keytool : key creation CMD, keystore : key creation name, alias : false name. Keyalg : algorithm validity : period
After key is created, please sign your app with the private key , as explained above, and with Eclipse.
Basically, we recommend you build your apps based on Android Design Guide to register them in ONE store.
Please refer to the documents below to develop flexible layouts corresponding to various resolutions and LCDs.
In the Ice Cream Sandwich OS (hereinafter referred to as "ICS") environment, some apps display a specific error message (“Application name” has stopped) and are abnormally terminated during the verification process. Please refer to the cause and countermeasure.
Cause : Application execution may be impacted due to the GC's stricter management of exception
Common GC-related errors
When storing Java objects in the Native area, all objects entering the JNI are local references, so the memory is released when leaving the function. Therefore, objects that need to be continuously referenced from the outside must be declared and managed as global references.
When using the return value of FindClass as a global reference, if the value needs to be continuously referenced, you must change it to NewGlobalRef and store it.
If JNIEnv is stored and used, JNIEnv cannot be used in other thread contexts.
Resolution Guide
Check the Java Exception and JNI error messages (JNI ERROR, JNI WARNING) before fixing them
Utilize the CheckJNI tool
Debugging after disabling the JNI compatibility mode
Set targetSdkVersion to 14 (Ice Cream Sandwich) in manifest
The above analysis was written based on the results of testing and analysis in the ICS environment by randomly selecting published apps on the ONE store Developer Center. In hopes that it will provide guidance for developing and selling apps, we ask that you refer to it when developing ICS-supported apps.
The issue you inquired is a problem that occurs in the commercial review environment or commercial environment. Please check the followings.
If an app is under development
For an app in development, it is recommended for you to proceed with the development by switching to developer mode rather than developing it in the commercial review environment.
To switch to the developer mode, please check the guide link below.
After completing the development
If you want to check in the commercial environment after completing the development in the developer mode, please proceed as follows.
A. Sign the developed APK using the signing key for distribution and register it in Developer Center.
B. Switch the test ID to the commercial ID following the guide below.
C. Perform the commercial test by using the apk signed with the same signing key.
D. Cancel the billing
If the APK is registered in Developer Center and the commercial billing is not available,
check if the signing key of the APK used for the billing test is the same as the apk registered in ONE store Developer Center.
If it is not the same, please sign it with the same key and deliver to Developer Center the apk and test case that generates the issue in the same case.
ONE store in-app payment API V5 (SDK V17) is not backwards compatible because it was designed with a completely different architecture from the previous version.
Therefore, the in-app payment API V5 (SDK V17) is only applicable when you register a new product. If the product currently on sale is API V4(SDK V16), please continue to update the product with the corresponding in-app version. ONE store continues to provide the payment service for the in-app payment API V4(SDK V16).
Starting with API V5 (IAP SDK V17), electronic receipts are no longer used, and it is not possible to check payments made on the API V5-based apps by using API V4. API V5 does not provide backwards compatibility. If you're launching an app with new API V5, it can be implemented by using the purchase history check among server APIs or by using the unconsumed product check API among terminal APIs.
ONE store continues to provide the payment service for the in-app payment API V4(SDK V16).
Access was not permitted by the security logic of ONE store service. The up-to-date ONE store service (above 6.064) has solved this problem. Please update ONE store service to the latest version.
The onErrorRemoteException occurs when the API is called without binding to ONE store service. You need to check two things below for solution.
Check if ONE store service normally works.
Confirm that the payment window opens normally when purchasing product from ONE store app (no need to pay).
Check the PurchaseClient life cycle
Among the samples provided by ONE store, LuckyActivity.java
has a function called initHelper.
If you look at the corresponding code, mPurchaseclient.connect
is called to connect to ONE store service. Before using the is BillingSupportedAsync
API, you need to check if you have worked on that connection. Even if you checked, before calling the API you need to check if there is any case in which mPurchaseClient.terminate()
; is called. Because the binding with ONE store service will be explicitly disconnected in the case of terminate.
In API V5, there is no need to set up and build a separate mode for test. You can register test ID in the app in ONE store Developer Center and set the test mode. For details, please refer to ‘Test Purchases & Security’ of the Developer Guides.
You are using a library for API V4 (SDK V16). Please develop by using API V5 (SDK V17).
orderId is an ID that can distinguish payment transactions, such as purchaseId, and can be applied to extended APIs, VOC processing, future additional features, etc.
orderId and pruchaseId are unique key values of the transaction. They are unchanged, and the two values are matched by 1:1.
Starting with API V5, the primary key used in the in-app payment I/F has been changed to purchaseId.
It is recommended to use developerPayload or orderId with no personal information when responding to customer inquiries.
Currently, the request for checking and cancellation can be made only with TxID(orderId) or TID(developerPayload) through the submenus, such as TxID Search, under the Customer Services menu in Developer Center. As fast as possible, improvements will be made to allow checking/cancellation requests to be made with purchaseId.
The transaction terms between API V4 and V 5 are matched as follows.
It is most likely that the library is misapplied. Especially 16 and 17 have different class configurations, so please check if you use the library for 17.
On ONE store, payment can be made only by using the credit card issued in Korea.
If the commercial billing test is not possible, please try the Sandbox billing test. There will be no problem in providing service on ONE store even if you only perform the Sandbox billing test.
It is the public key used to check the items purchased through in-app payment or to review the purchase history.
Google provides the corresponding key necessary for protection, saying that “instead of inserting the API Key directly in the application code, encryption (for example, an XOR operation) capable of being decrypted is used. Encryption is performed when an application is executed, and a structure for obtaining the key used for encryption from the server is built.”
To this end, as one of the protection guides, the NDK method is used. Actually, each developer can protect their license key according to their own existing methods.
When you test an in-app, please use JAR files in a dev folder (In-app purchase module for test)
After the test is completed, please apply JAR files in a release folder (In-app purchase module for release) to binary, and register and request the review of the binary.
Self-Test Process
Path: Developer Center > Application > My Applications > In App
How to conduct Self-Test
Enter a test phone number, forms of payment and register the test device at Test Device tab.
Conduct the test by setting up various customized results (normal, deactivated from T store, unpublished) at Setting per In-App.
Check if an in-app is successfully purchase, and the amount is billed at Billing Logs and Purchase History before complete the test.
Apply SO, JAR files in a release folder (In-app purchase module for release), re-compile and request a review.
[API V4] How can I unsubscribe the subscription?
The API does not inform you about the cancellation of the subscription through the in-app purchase module. Please check the expiration date of the in-app verification API.
After unsubscribing the subscription, you can check the expiration date and remaining subscriptions through the endDate field which are gained in the form of data when the sendCommandRequest is called by the request_purchase_history.
When people use non-consumable in-apps, in some cases they may need to reinstall the in-apps. So you need to restore non-consumable in-apps after checking the purchase history.
(Ex : Non-consumable in-apps cannot be charged when the content is deleted and used again. So you are required to restore the non-consumable in-apps.)
Please use the query features of the in-app purchase module API while running an app. Please deliver the in-app to users after checking if the in-app is successfully purchased.
For convenience of product payment test and development, it is possible to duplicate purchases only in development environment. When applying commercial In-App payment module, it is possible to make the first purchase once, and the pop-up that can not be purchased will be exposed after purchase.
One point is deducted when the item_use or the subtract_points method is used.
Electronic receipt validation must be implemented by creating a JSON object and requesting the e-receipt validation server to POST the contents of the JSON object in the http body part. When requesting the electronic receipt verification, appid, txid, and signdata are requested in the post method of JSON format, and the content-type value of the http header value is set to application / json and then proceed the verification request.
How can I escape conflicts when I apply Proguard?
You can escape conflicts by referring to the proguard config as seen below when Proguard is applied to the latest in-app in ONE store.
proguard config: An in-app works when the items below are added to the Proguard-project.txt.
In addition, when you use the utility package (com.skplanet.dev.guide.helper, com.skplant.dev.guide.pub, gson-2.2.2.jar) of Sample App(iap_api_sample), please add the items below in order not to apply Proguard to the GSON related class.
I want to get a quick reply for library-related issues only.
Application ID
App Title
PID
Time when Error Occurred
Cell Phone Number used for the Billing Test
Cell Phone Model and Android OS Version used for the Test
All Error Log
Excerpt IAP Library-applied Source
Explain Flow of IAP Library Implementation Logic and Activity
Path which leads to Errors (including Error Screen Shot)
Whether Application ID within the source and PID are correctly entered.
Library Version (ex : V12.09.17, V13.00.00,etc)
Library Type (ex : For Test, For Release)
Whether ProGuard is applied.
App Development Platform (ex : Android, Adobe Air, Corona, Cocos2d-x, Unity 3D , etc)
APK File
Inquiry
Application ID
App Title
PID
Time when Error Occurred
Cell Phone Number used for the Billing Test
Cell Phone Model and Android OS Version used for the Test
All Error Log
Request Information for Electronic Receipt
Inquiry
Prepare a cell phone equipped with USIM
Register a test phone number at the self-test page
After running IAP Setting App, set and use the test phone number already registered at the self-test page (You can randomly select mobile carriers)
After setting preferences of In-App status and conduct the self test
When the self test is completed, set your parameter options as 'release' mode and request a review
The message above pops up when you apply SO, JAR files in a release folder (In-app purchase module for release) to the in-apps in review. The test works if you decompress the in-app purchase module and apply SO, JAR files in a dev folder.
You are required to apply SO, JAR files in a dev folder (In-app purchase module for test) and build an in-app. Please select “Search” button at the in-app purchase page, sync it to “Search Point” and choose “Use”. Then you can use the points.
If the purchase history search request URL is in the format of IP:PORT, we recommend you change the format to Domain:PORT
Except the price, you can edit or delete metadata of your in-app items such as title. In-App item price can be modified at any time if the sales status is registered. If it is prohibited during sale / suspension, it can be changed once a week.
The in-app purchase module does not support the creation of TID. You need to generate a unique TID in the app or the app server, and request a purchase history search. We recommend you create a TID in the app server rather in the app where sometimes a TID is not unique when created.
When I request electronic receipt verification, invalidation error (9113) occurs.
Please read the descriptions below.
Check if the signdata is successfully delivered.(App Server -> In-App Payment Server, App -> App Server)
Check if there is space in the signdata.
Check if other characters (special characters, ex:+, etc) are included in the signdata when it is saved.
ONE store IAP purchase need to re-draw its purchase display when user switch display mode this effect might be happen.
So developer need to fix switching screen mode when ONE store IAP module executable at your application. Please read detail technical like below and apply it to your androidmenifext.xml.
The old version of the in-app SDK, which was discontinued at the end of 2015, refers to the version with a black payment window as shown in the image below.
If the webview-based payment window appears, it has not been stopped.
Please refer to for more details.
.
Guide :
Guide:
You can check your Public Key at section#4 of .
When you fail to get a purchase result response after the payment of the app is made, please use of ONE store IAP API while running the app. After checking if an in-app is successfully purchased, you can deliver the item to users.
Also, by using the , which is the Server API, you can check whether the item is paid or not.
For more details, including how to register IAP, please refer to and download the check list below to check in advance.
For more details, please refer to the IAP SDK Reference > in the ONE store Developer Center.
Query features : , , etc.
For more details, including error codes, please refer to in the ONE store Developer Center.
If you have any IAP library-related inquiries, please send the information below to . We will address your issues and support you as fast as possible after receiving your inquiry.
Download and install ONE store
Download and install Set parameter options as 'development' at IAP Setting App
For Test :
For Release :
Reissuance of electronic receipt is not technically possible. It is recommended to call the API provided by SDK as a defense logic or to use the Server API '' interlocking when it may not be able to give items to user in case the electronic receipt can not be obtained.