Filter
-
Content Type
-
Category
Mobile/Wearable
Visual Display
Digital Appliance
Platform
Mobile/Wearable
Visual Display
Digital Appliance
Platform
Filter
featured mobile
blogmeet maria ly, co-founder & ceo of wellness app skimble (maker of workout trainer for samsung). to celebrate international women’s day, we interviewed this top female developer and entrepreneur. she shared her journey to become a leader in a male-dominated industry and her passion for supporting women in tech. read on for some great tips on how you can help women make big moves in the tech industry. how did you get your start in the tech industry? growing up in canada, i was part of kidsareit, a tech-focused program founded by vicki saunders (who now heads up sheeo). i stayed in touch with this group to help foster the youth entrepreneurial culture in canada and even had a mobile-modification business with a few high school friends. i chose to take all the tech and programming classes available at my high school, which continued to spark my joy in tech. eventually, i went on to study computer engineering at the university of waterloo. during my studies, i had 6 different co-op internships around the world, which exposed me to different tech verticals (cad software, aerospace, automotive, hvac, semiconductors, etc.) and some wonderful bosses/mentors. all these early life experiences helped solidify the idea that i could have fun doing meaningful work within the tech industry, and i'm forever grateful. what inspired you to start skimble and what makes workout trainer different from other fitness apps? as a youngster, i dabbled in figure skating and gymnastics, got the chance to represent canada at the world cheerleading championships, and more. then i fell in love with rock climbing. i was all about living an active life and dreamed of the day i could combine tech and fitness in a creative way. with the advent of the smartphone, skimble came to life. our flagship app, workout trainer, was among the first multimedia-focused workout apps on the market, offering the largest open exercise databases for community members and trainers. that means you can quickly find a workout that meets your needs or simply create a specific workout of your choosing, complete with your own media. we also showcase a ton of real-life and celebrity trainers on a regular basis so you can follow these folks to help keep you motivated. what major hurdles did you face when developing skimble? we've been bootstrapped and self-funded since day one. when we got into the rock health accelerator program, we received a grant to build out our app. in those early days, my co-founder and i did most of the heavy lifting. i went through a ui/ux bootcamp course to help us design our initial user experience and ran about 30 of our first photoshoots. this was a great experience because we got immediate feedback from our community and were able to collaborate first-hand with so many amazing personal trainers. how has samsung supported skimble and the developing process? samsung provides developers with a range of developer tools as well as stellar developer-focused learning/networking events like the samsung developer conference. as part of the made for samsung app suite, we've had the opportunity to work closely with in-house developers on select partner projects, too. we were also stoked to receive the 2021 best wellness app award. what are some unique challenges you’ve faced as a woman in the tech industry and how did you overcome them? many moons ago, there were only a handful of women computer engineering/science grads coming out of most universities. there were plenty of skeptics in a predominantly male-centric world and i have my (un)fair share of stories. you may be aware of an unconscious bias where men are judged by their potential and women are judged by their past performance. women are additionally judged on their friendliness and morality. despite all this, there was still this resounding sense of can-do in the air and it did not stop our early crew of tech ladies from being the change we wanted to see. as i started skimble, i felt in many ways less pressure to fit a certain mold. we were creating our own company culture, which was pretty liberating! how has the tech industry changed to encourage more females to pursue a career in tech? one thing is that there's more transparency in recruiting/hiring including how much pay an average person in a certain role should receive. this kind of info wasn't available in the past. now, it's openly available and informs us of the gender pay gap, especially at the higher levels. that kind of information can be used by women to negotiate. anita borg suggests some companies that are pro-women in the workforce. why is it important to encourage other women in tech? in the tech industry, less than 30% of the jobs are held by women. broadly speaking, most technology is for everyone. it makes perfect sense that women should be right there at the forefront. visibility also matters. girls and boys need to see tech leaders of all genders, ethnicities, shapes, and sizes. this way, we can create the most inclusive solutions for the near and far future. what advice do you have for young women who are interested in a career in tech? go for it! more than ever before, women are breaking barriers, having their voices heard, gaining the support of their male counterparts, and narrowing the pay/position gaps. i would further encourage parents of young children to expose them equally to different career options. have them participate in a stem program over the summer. teach them how to type and code. you know the hashtag #tymed (teaching young minds every day)? we need to start educating them early so when they look around and ask themselves, “where is the inspiration?”, it will hopefully be all around us. what are your favorite resources or organizations that support women in tech? nowadays, i have been investing alongside some incredible women. one in five angel investors are women! on the early/angel stage side, i've had the opportunity to invest with tess hau of tess ventures. on the later stage/pre-ipo side, i've invested with kristin mcdonnell of menlo group. i'm lucky to able to advise women-led companies and collab on side projects with women. this is to say that if you can, let's pay it forward in women-centric investing and mentorship. let's help each other chase down our biggest dreams. moreover, i have always had respect for my alma mater, the university of waterloo. and i can’t forget to give a shout out to all the greater toronto area entrepreneurial tech communities. many of these groups didn’t exist in the early 2000s. thanks to maria ly for sharing her experiences in tech and helpful advice on supporting the next generation of women in tech. be sure to follow us on @samsung_dev to keep up-to-date on the latest developer news. keep an eye on our blog for some helpful resources on how you can support women in tech, and make sure to sign up for the samsung developer program to take advantage of exclusive benefits and access helpful developer resources.
Develop Samsung Pay
doc3 1 android sdk 3 1 1 introduction the samsung pay sdk allows android-based partner apps—such as merchant apps and issuer banking apps—to securely integrate features of integration wallet, enabling in-app payments, push provisioning, and more the following major operations are supported in-app payment - gives customers the option of paying for products and services with samsung wallet push provisioning - allows customers add a bank card to samsung wallet from the issuer app by providing the required card details to integrate your partner application with the samsung pay sdk, the following components are included your sdk download samsungpay jar - contains classes and interfaces of the samsung pay sdk which need to be integrated to partner apps javadoc - provides descriptions of the apis included in the samsung pay sdk, along with sample code showing how to use them sample merchant app and sample issuer app showing how samsung pay apis can be coded in a finished android project all major operations of samsung pay sdk are implemented for demonstration purposes 3 1 2 samsung pay sdk architecture the following diagram shows a high-level architecture revealing the general interactions between the samsung pay sdk and a partner app viewed at this level, the partner apps leverage the samsung pay sdk to perform the operations shown ― push provisioning and opening favorite cards for issuers; online payments for merchants ― with samsung pay the key components involved are partner app - merchant- or issuer-developed app for making online/offline payments and provisioning payment cards through samsung wallet samsung pay sdk - sdk integrated into the partner app for direct communication with samsung wallet samsung wallet app - wallet app that the samsung pay sdk communicates with financial network - comprises the payment gateways, acquirers, card associations, and issuers that participate in transaction processing under agreement with the merchant the main classes comprising the samsung pay sdk include samsungpay – used by the partner app to get the samsung pay sdk information and the status of samsung wallet app on the device paymentmanager – provides payment/transaction functionality cardmanager – manages card list get, add, update functionality watchmanager – manages all functions related to samsung pay watch cardinfolistener – interface for requestcardinfo result from samsung wallet customsheettransactioninfolistener – interface for transaction success/failure callbacks from samsung wallet 3 1 3 uses cases in-app payment the most common in-app online payment use case take the following form merchant app presents user with the option of making payment with samsung wallet upon the user selecting the samsung pay option, the merchant app calls the apis included in the samsung pay sdk to initiate a transaction with samsung wallet app samsung wallet app responds with the tokenized payment information necessary to complete the transaction merchant app forwards this payment information to the designated payment gateway pg , either directly through the merchant's web server, or indirectly via the samsung-pg interface server for normal transaction processing app-to-app push provisioning the push provisioning use case ― adding payment cards to samsung wallet from the card issuer’s app ― typically takes this form the user logs into the issuer app the issuer app checks if samsung wallet is activated on the device and ready to use if it is in the ready status, the issuer app displays an add button for cards not currently registered/enrolled with the samsung wallet app if the add card option is selected, the issuer app calls an api to push the proper payload data to samsung wallet while the card is being provisioned, samsung wallet stays in background 3 1 4 setting up sdk development environment the importance of maintaining a good development environment cannot be overstated for integrating the samsung pay sdk with your partner app, the following prerequisites and recommendations help ensure a successful sdk implementation system requirements the samsung pay sdk is designed exclusively for samsung mobile devices supporting samsung pay and running android lollipop 5 1 android api level 22 or later versions of the android os the sdk’s in-app payments functionality requires android 6 0 m android api level 23 or later versions of the android os note as of sdk version 1 5, if the device runs android lollipop 5 1 android api level 22 or an earlier version, the getsamsungpaystatus api method returns a spay_not supported status code merchant apps still using samsung pay sdk 1 4 or earlier not recommended must check the android version running their app use the following snippet to determine the os version running on a device and whether or not to display the samsung pay button in your partner app import android os build; // in-app payment supported on android m or above // check android version of the device if build version sdk_int < build version_codes m { //hide samsung pay button} service registration to develop a samsung pay sdk service, merchants and issuers need to register for an account with samsung pay developers in order to create the appropriate service type for their applications here are some helpful links inside the portal become a member https //pay samsung com/developers/tour/memberguide create services https //pay samsung com/developers/tour/svcguide register apps https //pay samsung com/developers/tour/appsguide manage services and apps https //pay samsung com/developers/tour/svcnappsguide add samsung pay sdk to your project be sure to do the following before attempting to use the sdk if not already part of your environment, download and install an ide android studio is recommended download the samsung pay sdk the sdk package has the following directory structure folder contents docs javadoc – api reference documentation libs samsungpay jar sdk java archive file – contains the samsung pay apis to be used by your partner app samples sample apps configure your ide to integrate the samsung pay sdk with your partner app a add samsungpay jar to the libs folder of your android project b go to gradle scripts > build gradle and enter the following dependency dependencies { compile files 'libs/samsungpay jar' } c import the sdk package into your code import com samsung android sdk samsungpay v2; d proguard rules - if your app s have any issue with proguard, the following rules are recommended to enter in debug mode dontwarn com samsung android sdk samsungpay ** -keep class com samsung android sdk ** { *; } -keep interface com samsung android sdk ** { *; } -keepresourcexmlelements manifest/application/meta-data@name=spay_sdk_api_level -keepresourcexmlelements manifest/application/meta-data@name=debug_mode -keepresourcexmlelements manifest/application/meta-data@name=spay_debug_api_key dontwarn com samsung android sdk samsungpay ** -keep class com samsung android sdk ** { *; } -keep interface com samsung android sdk ** { *; } -keepresourcexmlelements manifest/application/meta-data@name=spay_sdk_api_level -keepresourcexmlelements manifest/application/meta-data@name=debug_mode -keepresourcexmlelements manifest/application/meta-data@name=spay_debug_api_key e when dexguard is employed, the following additional rules apply -keepresourcexmlelements manifest/application/meta-data@name=spay_sdk_api_level android r os targetsdkversion 30 informationfrom android r os if the target sdk version is 30 , you must include the following <queries> element in the androidmanifest <?xml version="1 0" encoding="utf-8"?> <manifest xmlns android="http //schemas android com/apk/res/android" xmlns tools="http //schemas android com/tools" package="xxx xxx xxx xxx"> <queries> <package android name="com samsung android spay" /> <package android name="com samsung android samsungpay gear" /> </queries> 3 1 5 configuring api level api level attributes as of sdk version 1 4, enhanced version control management has been introduced to improve backward compatibility and handle api dependency from country and service type for example, if a partner integrates the latest sdk―for instance, api level 2 22―but continues to use apis based in level 1 4, the partner app remains compatible with samsung wallet apps supporting api level 1 4 without the necessity of upgrading the samsung pay app the chief characteristics and properties of the api level include every api starting from version 1 4 has an api level assigned based on the sdk version number in which it is introduced the sdk’s javadoc reference can be filtered by api level so you can determine the minimum api level you need to configure in the metadata section of your app’s androidmanifest file the earliest possible version is 1 4 this lets you use the api level defined in your androidmanifest without having to trigger an upgrade of the samsung wallet app on the user’s device implement the following usage in your androidmanifest <application <meta-data android name="spay_sdk_api_level" android value="2 22" /> // most recent sdk version is recommended to leverage the latest apis but it need to be set to 2 17 for russia </application> partner app verification in partner verification process samsung pay sdk verify your registered app, version in samsung pay portal and service it also determines device and app compatibility your app needs to verify the presence of the samsung wallet app on the device, its status, and whether or not its version is sufficient to support your implementation of the sdk 3 1 6 common terminology terminology description aavs automatic add value service aidl android interface definition language for communication merchant a business entity engaged in retail e-commerce that provides an online checkout service for purchasing its products and/or services to registered end users issuer financial institution empowered to issue credit and/or debit payment cards to qualified consumers and businesses payment gateway pg e-commerce app service provider equipped to authorize credit card payments for e-businesses, online retailers, bricks and clicks, or traditional brick and mortar payment token secure method for payment ensuring that a cardholder’s information is not exploited by unauthorized parties samsung pay samsung’s proprietary mobile wallet app and payment system samsung pay service the server and service components of samsung pay samsung pay watch samsung pay app on samsung galaxy watches to support payment system eligibility check a query by third-party apps to check whether or not samsung pay is supported/activated/ready-to-use on a samsung device mst magnetic secure transmission tui trusted user interface 3 1 7 api common flow once setup is complete, you’re ready to add the sdk code within your partner app for calling the sdk’s apis and receiving callbacks when a partner app calls one of the sdk’s apis, the following interaction flow is processed to check whether the caller is authenticated and authorized before responding to the request the steps of the interaction are enumerated below step 1 the partner app calls a samsung pay sdk api the partner app initiates a call to the samsung pay sdk this could be to request in-app payment push provisioning status checks, etc step 2 sdk validates the preconditions the sdk performs initial checks before proceeding is samsung wallet installed on the device? is the integrity of the samsung pay system intact e g , no tampering or missing files ? step 3 sdk initiates communication with samsung wallet if preconditions are met, the sdk uses aidl android interface definition language to securely open a communication channel with the samsung wallet app step 4 samsung wallet app status validation samsung wallet app checks has the samsung pay setup been completed on the device? does the app require a mandatory update? is the samsung pay sdk api level used by the partner app compatible? step 5 partner app eligibility verification sdk triggers a backend verification with the samsung pay server to confirm the app’s package name, service id, and csr match what’s registered on the samsung pay developers portal the app is authorized to use the requested samsung pay functionality step 6 samsung wallet responds to sdk based on the above validations samsung wallet responds via aidl to the sdk it sends status codes, eligibility results, or additional prompts if needed e g , update required step 7 sdk triggers callback in the partner app the sdk invokes a callback function in the partner app this informs the app whether it can proceed with payment/provisioning an error or restriction has occurred step 8 partner app executes business logic based on sdk callback if successful initiate samsung pay payment ui or push provisioning complete transaction or card enrollment via the wallet app if unsuccessful inform the user offer fallback payment options provide guidance on enabling/updating samsung wallet 3 1 8 checking samsung pay status the first step in integrating the samsung pay sdk into your partner app is to create a samsung pay instance and check the status of samsung pay on the user's device this check determines whether the device supports samsung pay and if the samsung pay button should be shown as a payment or provisioning option the samsung pay button serves two key purposes for merchant apps, it enables users to select samsung pay for in-app payments for issuer apps, it allows users to add a card directly to samsung pay via push provisioning setting partnerinfo for verification before checking the status, the partner app must configure and pass a valid partnerinfo object to the samsungpay instance this is essential for verifying the calling app and enabling further sdk functionality the partnerinfo must include serviceid sid a unique identifier assigned by the samsung pay developer portal servicetype defines the type of service e g , merchant or issuer this value is also assigned during service registration samsung pay uses partnerinfo for validating the app’s identity and registration performing sdk version and api compatibility checks verifying allowlist/blocklist status note servicetype is required without it, you cannot call other samsung pay apis once partnerinfo is set correctly, you can proceed to call getsamsungpaystatus to check if samsung pay is available and ready for use on the device val serviceid = "partner_app_service_id" val bundle = bundle bundle putstring samsungpay partner_service_type, samsungpay servicetype inapp_payment tostring val partnerinfo = partnerinfo serviceid, bundle after setting partnerinfo, your partner app can now call getsamsungpaystatus this method of the samsungpay class must be called before using any other feature in the samsung pay sdk noteif you want to get the status of samsung pay watch, you have to use the watchmanager class instead of the samsungpay class fun getsamsungpaystatus callback statuslistener copy the result is delivered to statuslistener and provides the following events onsuccess ‒ called when the requested operation is successful it provides the status of the request, as well as extra bundle data related to the request onfail ‒ called when the request operation fails it returns the error code and extra bundle data related to the request the samsung pay status code returned is one of the following spay_not_supported - indicates samsung wallet is not supported on this device; typically returned if the device is incompatible with samsung pay or if the samsung wallet app is not installed spay_not_ready - indicates samsung wallet is not completely activated; usually returned if the user did not complete a mandatory update or if the user has not signed in with a valid samsung account in which case, the partner app can activate or update the samsung wallet app on the device according to the 'extra_error_reason' bundle keys below error_spay_setup_not_complete - tells the partner app to display a popup message asking if the user wishes to activate samsung pay if the user agrees, the partner app calls activatesamsungpay to activate the samsung wallet app error_spay_app_need_to_update - tells the partner app to display a popup message asking if the user wishes to update samsung pay if user agrees, the partner app calls gotoupdatepage to open the app update page error_partner_info_invalid - indicates that partner app information is invalid; typically, the partner app is using a sdk version that is not allowed, an invalid service type, or the wrong api level error_partner_sdk_api_level - tells the partner app it is using the wrong api level to resolve the error condition, the partner app must set a valid api level error_partner_service_type - tells the partner app that it did not set a service type, or that the service type it did set is invalid service type is set in partnerinfo spay_ready - indicates that samsung pay is activated and ready to use; typically returned after the user completes all mandatory updates and signs in extra bundle data can have the following values extra_country_code - for both onsuccess and onfail , this is the current device’s country code iso 3166-1 alpha-2 set by samsung pay if the partner app is not supported in this particular country, the partner app can decide not to display samsung pay button extra_error_reason - for onfailure , this is the reason for failure set by samsung pay when the returned status code is spay_ready, the partner app can safely display the samsung pay button for user selection as a payment option, push provisioning, and so on the following sample code shows how to use the getsamsungpaystatus api method val serviceid = "partner_app_service_id" val bundle = bundle bundle putstring samsungpay partner_service_type, samsungpay servicetype inapp_payment tostring val partnerinfo = partnerinfo serviceid, bundle val samsungpay = samsungpay context, partnerinfo /* * method to get the samsung pay status on the device * partner issuers, merchants applications must call this method to * check the current status of samsung pay before doing any operation */ samsungpay getsamsungpaystatus object statuslistener { override fun onsuccess status int, bundle bundle { when status { samsungpay spay_not_supported -> // samsung pay is not supported samsungpaybutton setvisibility view invisible samsungpay spay_not_ready -> { // activate samsung pay or update samsung pay, if needed samsungpaybutton setvisibility view invisible val errorreason = bundle getint samsungpay extra_error_reason if errorreason == samsungpay error_setup_not_completed { // display an appropriate popup message to the user samsungpay activatesamsungpay } else if errorreason == samsungpay error_spay_app_need_to_update { // display an appropriate popup message to the user samsungpay gotoupdatepage } else { toast maketext context, "error reason $errorreason", toast length_long show } } samsungpay spay_ready -> // samsung pay is ready samsungpaybutton setvisibility view visible else -> // not expected result samsungpaybutton setvisibility view invisible } } override fun onfail errorcode int, bundle bundle { samsungpaybutton setvisibility view invisible log d tag, "checksamsungpaystatus onfail $errorcode" } } 3 1 9 activating the samsung wallet app the samsungpay class provides the following api method to activate the samsung wallet app on a device fun activatesamsungpay activatesamsungpay is called to activate the samsung wallet app on the same device on which the partner app is running first, however, the partner app must check the samsung pay status with a getsamsungpaystatus call see section 4 2 above if the status is spay_not_ready and extra_error_reason is error_spay_setup_not_complete, the partner app needs to display an appropriate message to user, then call activatesamsungpay to launch the samsung wallet app so the user can sign in here’s an example of how to code this val serviceid = "partner_app_service_id" val bundle = bundle bundle putstring samsungpay partner_service_type, spaysdk servicetype inapp_payment tostring val partnerinfo = partnerinfo serviceid, bundle val samsungpay = samsungpay context, partnerinfo samsungpay activatesamsungpay 3 1 10 updating the samsung wallet app the samsungpay class provides the following api method to update the samsung wallet app on the device fun gotoupdatepage gotoupdatepage is called to update samsung wallet app on the same device on which the partner app is running as with all api calls, the partner app must first check the samsung pay status with getsamsungpaystatus if this returns spay_not_ready and extra_error_reason is error_spay_app_need_to_update, then the partner app needs to display an appropriate message to the user and call gotoupdatepage , which launches the samsung pay update page the following code sample reflects how to update samsung pay val serviceid = "partner_app_service_id" val bundle = bundle bundle putstring samsungpay partner_service_type, spaysdk servicetype inapp_payment tostring val partnerinfo = partnerinfo serviceid, bundle val samsungpay = samsungpay context, partnerinfo samsungpay gotoupdatepage 3 1 11 in-app online the main classes and interfaces involved here are samsungpay– class for a merchant app to get samsung pay sdk information and the status of samsung pay on the device paymentmanager – class to provide payment/transaction functionality cardinfolistener – interface for requestcardinfo result callbacks from samsung wallet customsheettransactioninfolistener – interface for transaction success/failure callbacks from samsung wallet; payment information is provided with a success callback and must be used by the merchant app for processing the payment the flow pictured next captures the essential online payment api process between merchant apps integrated with the samsung pay sdk and samsung wallet and the merchant’s payment gateway pg 3 1 12 api flow for in-app payments the api flow for samsung pay in-app payments involves a series of operations that ensure secure, seamless, and verified payment processing between the merchant app, samsung wallet, and the payment gateway pg these steps are illustrated in the flow diagram above and described below check the ready status of samsung pay use samsungpay getsamsungpaystatus to verify whether samsung pay is installed and supported on the device samsung pay is activated and ready for transactions the user has completed mandatory updates and account setup start the payment manager to establish the service binding and verify the merchant app establish a binding between your app and the samsung wallet app validate that the merchant app is authorized and registered prepare the sdk to handle payment operations get payment card information and the payment amount, including updates this step also includes displaying eligible cards to the user allowing the user to select a card for the transaction collecting or updating the payment amount get/update the user’s billing and shipping addresses, including an updated payment amount if shipping charges will be incurred if required by the transaction retrieve or update the user’s billing and shipping address recalculate and update the total payment amount e g , shipping cost impact authenticate the user trigger authentication via trusted user interface tui , using biometrics or other secure methods supported by samsung wallet submit payment information to pg this ensures the user has authorized the transaction send the tokenized payment data received from samsung pay to your designated payment gateway pg for transaction processing this can be done via a direct merchant server-to-pg connection, or samsung pg interface server if applicable verify transaction success or failure receive confirmation of transaction success or failure from the payment gateway communicate the result back to the user and update your app's ui and backend accordingly 3 1 13 token modes network vs gateway to complete the payment, the merchant’s designated payment gateway pg handles one of two types of tokens gateway tokens indirect or network tokens direct the samsung pay sdk supports both types the essential difference between the two types is who decrypts the token information network tokens require that the merchant app handles decryption of the token bundle or work with the pg to handle decryption, whereas gateway token decryption is handled by the pg via the samsung-pg interface server network token mode direct user selects samsung pay as the payment method at checkout in the merchant app and the samsung pay app requests partner verification from the samsung pay online payment server encrypted payment information is passed from the samsung pay app to the pg through the merchant app via the pg sdk applying the merchant's private key, pg decrypts the payment information structure and processes the payment through the acquirer and payment network upon receiving authorization or rejection, pg notifies the merchant app through its pg sdk gateway token mode indirect user selects samsung pay as the payment method at checkout in the merchant app and the samsung pay app requests partner verification from the samsung pay online payment server encrypted payment information and the partner id are passed to the samsung-pg interface server samsung-pg interface server sends a transaction authorization request to the pg on behalf of the merchant; pg authenticates the partner id before generating a transaction reference id reference id is passed to merchant app via sdk callback merchant app then passes the reference id to the pg for payment process execution samsung-pg interface server returns the payment token to the pg i e , gateway token it received from samsung pay app in step 2 pg continues payment processing with the acquirer and payment network the result approved/declined is returned to the merchant app on the device for display to the user check with your pg to determine its specific requirements for payment processing regardless of the pg model employed, direct or indirect, the goal is to offer samsung pay as a secure payment method within your merchant app the most common use case involves the following general steps to make a purchase, the user selects to “buy” or got to checkout after adding items to a shopping cart now in checkout, the user selects a payment option; for example, either the merchant’s “standard” method or samsung pay upon selecting samsung pay, the user is presented with a payment sheet that allows for card selection and shipping address confirmation with the option to add/modify information for this order, whereupon the user makes payment card selection from the list of enrolled cards chooses to change or add the delivery address enters required address information in the form presented and saves it authenticates the payment method, amount, and delivery with a biometric verification fingerprint, iris… or pin 3 1 14 checking registered/enrolled card information before displaying the samsung pay button, a partner app can query card brand information for the user’s currently enrolled payment cards in samsung wallet to determine if payment is supported with the enrolled card for example, if a merchant app accepts one card brand exclusively but the user has not registered any cards matching this brand in samsung wallet, the merchant app needs to determine whether or not to display the samsung pay button for this purchase checkout to query the card brand, use the requestcardinfo api method of the paymentmanager class the requestfilter is optional bundle data reserved for future use the merchant app does not need to set a value for it now however, before calling this method, cardinfolistener must be registered so its listener can provide the following events onresult - called when the samsung pay sdk returns card information from samsung wallet; returns information about enrolled cards or is empty if no card is registered onfailure - called when the query fails; for example, if sdk service in the samsung wallet app ends abnormally the following snippet shows how to retrieve the list of supported card brands from samsung pay val serviceid = "partner_app_service_id" val bundle = bundle bundle putstring samsungpay partner_service_type, spaysdk servicetype inapp_payment tostring val partnerinfo = partnerinfo serviceid, bundle val paymentmanager = paymentmanager context, partnerinfo paymentmanager requestcardinfo bundle , cardinfolistener // get card brand list //cardinfolistener is for listening requestcardinfo callback events val cardinfolistener cardinfolistener = object cardinfolistener { // this callback is received when the card information is received successfully override fun onresult cardresponse list<cardinfo> { var visacount = 0 var mccount = 0 var amexcount = 0 var dscount = 0 var brandstrings = "card info " var brand spaysdk brand? for i in cardresponse indices { brand = cardresponse[i] brand when brand { spaysdk brand americanexpress -> amexcount++ spaysdk brand mastercard -> mccount++ spaysdk brand visa -> visacount++ spaysdk brand discover -> dscount++ else -> { /* other card brands */ } } } brandstrings += " vi = $visacount, mc = $mccount, ax = $amexcount, ds = $dscount" log d tag, "cardinfolistener onresult $brandstrings" toast maketext context, "cardinfolistener onresult" + brandstrings, toast length_long show } /* * this callback is received when the card information cannot be retrieved * for example, when sdk service in the samsung wallet app dies abnormally */ override fun onfailure errorcode int, errordata bundle { //called when an error occurs during in-app cryptogram generation toast maketext context, "cardinfolistener onfailure " + errorcode, toast length_long show } } 3 1 15 creating a transaction request upon successful initialization of the samsungpay class, the merchant app needs to create a transaction request with payment information note as of sdk v2 0 00, the normal payment sheet is deprecated all merchant apps must now use the custom payment sheet, which offers more dynamic controls for tailoring the ui look and feel with additional customer order and payment data merchant app developers choosing to temporarily continue offering the normal sheet will need to configure their android manifest to reflect the pre-2 0 00 version of the sdk used to implement their app’s existing normal sheet, although this is not recommended in all cases, merchant app developers should update their apps with the latest version of the sdk as soon as possible to avoid timing out using an earlier version of the sdk when responding to samsung pay callbacks using the custom payment sheet to initiate a payment transaction with samsung pay’s custom payment sheet, your merchant app must populate the following mandatory fields in customsheetpaymentinfo merchant name - as it will appear in samsung pay’s payment sheet, as well as the user's card account statement amount - the constituent transaction properties currency, item price, shipping price, tax, total price which together determine the total amount the user is agreeing to pay the merchant cautionnot populating the mandatory fields throws an illegalargumentexception optionally, the following fields can be added to the payment information merchant id- can be used for the merchant’s own designated purpose at its discretion unless the merchant uses an indirect pg like stripe or braintree if an indirect pg is used, this field must be set to the merchant’s payment gateway id fetched from the samsung pay developers portal merchant id is mandatory if a merchant requests with a mada token, this field should be included in the payload order number - usually created by the merchant app via interaction with a pg this number is required for refunds and chargebacks in the case of visa cards, the value is mandatory the allowed characters are [a-z][a-z][0-9,-] and the length of the value can be up to 36 characters address - the user’s billing and/or shipping address see applying an addresscontrol for details allowed card brands - specifies card brands accepted by the merchant if no brand is specified, all brands are accepted by default if at least one brand is specified, all other card brands not specified are set to "card not supported’ on the payment sheet here’s the 'customsheetpaymentinfo' structure class customsheetpaymentinfo parcelable { private val version string? = null private val merchantid string? = null private val merchantname string? = null private val ordernumber string? = null private val addressinpaymentsheet addressinpaymentsheet = addressinpaymentsheet do_not_show private val allowedcardbrand list<spaysdk brand>? = null private val cardinfo cardinfo? = null private val iscardholdernamerequired = false private val isrecurring = false private val merchantcountrycode string? = null private val customsheet customsheet? = null private val extrapaymentinfo bundle? = null } your merchant app sends this customsheetpaymentinfo to samsung wallet via the applicable samsung pay sdk api methods upon successful user authentication in direct mode, samsung wallet returns the above "payment info" structure and a result string the result string is forwarded to the pg by your merchant app to complete the transaction it will vary based on the pg you’re using note if you want to add any other information for any card brand, you can add them in the extrapaymentinfo bundle the following example demonstrates how to populate customsheet in the customsheetpaymentinfo class see sample merchant app using custom payment sheet below for example usage of each customsheet control /* * make user's transaction details * the merchant app should send customsheetpaymentinfo to samsung wallet via * the applicable samsung pay sdk api method for the operation being invoked */ private fun makecustomsheetpaymentinfo customsheetpaymentinfo { val brandlist = arraylist<spaysdk brand> // if the supported brand is not specified, all card brands in samsung wallet are // listed in the payment sheet brandlist add paymentmanager brand visa brandlist add paymentmanager brand mastercard brandlist add paymentmanager brand americanexpress /* * make the sheetcontrols you want and add them to custom sheet * place each control in sequence with amountboxcontrol listed last */ val customsheet = customsheet customsheet addcontrol makebillingaddresscontrol customsheet addcontrol makeshippingaddresscontrol customsheet addcontrol makeplaintextcontrol customsheet addcontrol makeshippingmethodspinnercontrol customsheet addcontrol makeamountcontrol val extrapaymentinfo = bundle /* * you can add transaction type for mada card brand * the supported values are purchase and preauthorization * if you don't set any value, the default value is purchase */ extrapaymentinfo putstring spaysdk extra_online_transaction_type, spaysdk transactiontype preauthorization tostring val customsheetpaymentinfo = customsheetpaymentinfo builder setmerchantid "123456" setmerchantname "sample merchant" // merchant requires billing address from samsung wallet and // sends the shipping address to samsung wallet // show both billing and shipping address on the payment sheet setaddressinpaymentsheet customsheetpaymentinfo addressinpaymentsheet need_billing_send_shipping setallowedcardbrands brandlist setcardholdernameenabled true setrecurringenabled false setcustomsheet customsheet setextrapaymentinfo extrapaymentinfo build return customsheetpaymentinfo } 3 1 16 requesting payment with a custom payment sheet the startinapppaywithcustomsheet method of the paymentmanager class is applied to request payment using a custom payment sheet in samsung wallet the two methods are defined as follows startinapppaywithcustomsheet - initiates the payment request with a custom payment sheet the payment sheet persists for 5 minutes after the api is called if the time limit expires, the transaction fails updatesheet - must be called to update current payment sheet as of api level 1 5, a merchant app can update the custom sheet with a custom error message refer to updating sheet with custom error message when you call the startinapppaywithcustomsheet method, a custom payment sheet is displayed on the merchant app screen from it, the user can select a registered card for payment and change the billing and shipping addresses, as necessary the result is delivered to customsheettransactioninfolistener, which provides the following events onsuccess - called when samsung pay confirms payment it provides the customsheetpaymentinfo object and the paymentcredential json string customsheetpaymentinfo is used for the current transaction it contains amount, shippingaddress, merchantid, merchantname, ordernumber api methods exclusively available in the onsuccess callback comprise getpaymentcardlast4dpan – returns the last 4 digits of the user's digitized personal/primary identification number dpan getpaymentcardlast4fpan – returns the last 4 digits of the user's funding personal/primary identification number fpan getpaymentcardbrand – returns the brand of the card used for the transaction getpaymentcurrencycode – returns the iso currency code in which the transaction is valued getpaymentshippingaddress – returns the shipping/delivery address for the transaction getpaymentshippingmethod – returns the shipping method for the transaction for pgs using the direct model network tokens , the paymentcredential is a json object containing encrypted cryptogram which can be passed to the pg pgs using the indirect model gateway tokens like stripe, it is a json object containing reference card reference – a token id generated by the pg and status i e , authorized, pending, charged, or refunded refer to payment credential sample for details oncardinfoupdated - called when the user changes the payment card in this callback, updatesheet method must be called to update current payment sheet onfailure - called when the transaction fails; returns the error code and errordata bundle for the failure here’s how to call the startinapppaywithcustomsheet method of the paymentmanager class /* * customsheettransactioninfolistener is for listening callback events of in-app custom sheet payment * this is invoked when card is changed by the user on the custom payment sheet, * and also with the success or failure of online in-app payment */ private val transactionlistener = object customsheettransactioninfolistener { // this callback is received when the user changes card on the custom payment sheet in samsung pay override fun oncardinfoupdated selectedcardinfo cardinfo, customsheet customsheet { /* * called when the user changes card in samsung wallet * newly selected cardinfo is passed so merchant app can update transaction amount * based on different card if needed , */ val amountboxcontrol = customsheet getsheetcontrol amount_control_id as amountboxcontrol amountboxcontrol updatevalue product_item_id, 1000 0 //item price amountboxcontrol updatevalue product_tax_id, 50 0 // sales tax amountboxcontrol updatevalue product_shipping_id, 10 0 // shipping fee amountboxcontrol updatevalue product_fuel_id, 0 0, "pending" // additional item status amountboxcontrol setamounttotal 1060 0, amountconstants format_total_price_only // grand total customsheet updatecontrol amountboxcontrol // call updatesheet with amountboxcontrol; mandatory try { paymentmanager updatesheet customsheet } catch e java lang illegalstateexception { e printstacktrace } catch e java lang nullpointerexception { e printstacktrace } } /* * this callback is received when the payment is approved by the user and the transaction payload * is generated payload can be an encrypted cryptogram network token mode or the pg's token * reference id gateway token mode */ override fun onsuccess response customsheetpaymentinfo, paymentcredential string, extrapaymentdata bundle { /* * called when samsung pay creates the transaction cryptogram, which merchant app then sends * to merchant server or pg to complete in-app payment */ try { val dpan = response cardinfo cardmetadata getstring spaysdk extra_last4_dpan, "" val fpan = response cardinfo cardmetadata getstring spaysdk extra_last4_fpan, "" toast maketext context, "dpan " + dpan + "fpan " + fpan, toast length_long show } catch e java lang nullpointerexception { e printstacktrace } toast maketext context, "transaction onsuccess", toast length_long show } override fun onfailure errorcode int, errordata bundle { // called when an error occurs during cryptogram generation toast maketext context, "transaction onfailure $errorcode", toast length_long show } } private fun startinapppaywithcustomsheet { // show custom payment sheet try { val bundle = bundle bundle putstring samsungpay partner_service_type, spaysdk servicetype inapp_payment tostring val partnerinfo = partnerinfo serviceid, bundle paymentmanager = paymentmanager context, partnerinfo // request payment using samsung wallet paymentmanager startinapppaywithcustomsheet makecustomsheetpaymentinfo , transactionlistener } catch e illegalstateexception { e printstacktrace } catch e numberformatexception { e printstacktrace } catch e nullpointerexception { e printstacktrace } catch e illegalargumentexception { e printstacktrace } } when an address is provided by samsung wallet, onaddressupdated is called whenever address information is updated in the custom payment sheet you can use the updatesheet method to update the shipping fee or any other relevant information in the payment sheet set the errorcode to determine if the address provided by samsung wallet app is invalid, out of delivery, or does not exist for example, when the merchant does not support the product delivery to the designated location billing address from samsung wallet is not valid for tax recalculation for all such cases, the merchant app should call updatesheet with one of the following error codes error_shipping_address_invalid error_shipping_address_unable_to_ship error_shipping_address_not_exist error_billing_address_invalid error_billing_address_not_exist the sample code included below under applying the address control demonstrates how to use the updatesheet method for 'addresscontrol' in the payment sheet 3 1 17 payment credential sample the paymentcredential is the resulting output of the startinapppaywithcustomsheet method the structure varies depending on the pg you’re using and the integration model—direct or indirect the following paymentcredential is for a visa card for pg using direct network token mode – e g first data, adyen, visa cybersourse sample paymentcredential json output using jwe-only { "billing_address" {"city" "billingcity","country" "usa","state_province" "ca","street" "billingaddr1","zip_postal_code" "123456"}, "card_last4digits" "1122", "3ds" {"data" "eyjhbgcioijsu0exxzuilcjrawqioijcak91a1h2afv4wu5wofiwvgs2y25oactzwwfqzxhiehrvz0vfdhlhyy9npsisinr5cci6ikppu0uilcjjagfubmvsu2vjdxjpdhldb250zxh0ijoiulnbx1blssisimvuyyi6ikexmjhhq00ifq fg2oouvhdgkkivyba2s5kturpwueujkzeyxz7n6kalhqahszv3p5jabaoj-rokcznfjdg3qierzjktu7zxst9gwv4oclahpfdw64w0x6ttaxeyjiivkjug-edxxtwajeyeikgc68wehf1cltsqg4zlwi6upvcaywdppbn0hl0c5wcf5az4wabytv_fda5ahguypne70keqrtwdlacw9mzejx2xth7msd9ohoulr8luq-7gha17jhoobwgmoq9q0haocnm0ljwiuhkoryyu-njulnbkk8fzus_aiumgdv2yn9ygfqilmculb0vwuf0yekx6isgaxi0zqhliusjkcz_w auzzxog46lnrtk3q qe2llws30vzh-zduue8b045cnfrm2p-rjzgbnzchels3v26n64cfg1av5mtp5f-fswbj3ntp5x4v1nk8fmdy0uspxzemfvl5badgac7w9frxt6x5xv1fqu6-q-zkbxcb9bygownt983bckoe1bd5djxfbodlrc4j68ikdjc5m3lebdx6hv0aqzkmilch-jevl3awqykbny4vj7m3fizw7u1prli2zfwukxdfs4vwv3bpm4qudemvnhxj qtymdmn4ne93juljnmwkjg","type" "s","version" "100"}, "merchant_ref" "merchantid", "method" "3ds", "recurring_payment" false } decrypt using the merchant’s private key below is sample private key -----begin rsa private key----- miieowibaakcaqea4lzyjqr+dqd/xleoxct9jwtjxhd2ptjke9djtmijki0h2oc2ghow4ujhhy/1jvft2+zcnjtoxuvlp+76/dwa3bcwfrj+fpp6x5kkylpb+djdyo1ttumltnqcwymjb3u7jbc+xr4vkfrzqjxke7xhn/sbb82ue8c3smzvkynuji<…> -----end rsa private key----- the decrypted output will be similar to this { "amount" "1000", "currency_code" "usd", "utc" "1490266732173", "eci_indicator" "5", "tokenpan" "1234567890123456", "tokenpanexpiration" "0420", //the format is **mmyy** "cryptogram" "ak+zkbpmcorcabcd3agraoacfa==" } note for amex, it needs to be displayed in the format “yymmdd”, so i would like to add this processing the payload depending on the structure of the payment processing api provided by your pg, your merchant app can send either of these directly to the pg entire paymentcredential output extracted “3ds” part only consult your pg documentation for specific guidance when using indirect model e g stripe in indirect gateway token mode, paymentcredential is the pg’s token reference id and its status here’s a sample of the json output { "reference" "tok_18rje5e6szui23f2mefakep7", "status" "authorized" } for stripe, your merchant app should be able to pass this token object directly to charge or another appropriate payment processing api provided by the pg 3 1 18 push provisioning the following diagram illustrates the flows of the app-to-app apis for payment card push provisioning the main classes involved are samsung pay – for fetching samsung wallet app status and wallet information on the device paymentmanager – for push provisioning and invoking favorite cards payment functionalities cardmanager – for payment card management watchmanager – for all functions related to samsung pay watch 3 1 19 requesting registered card list in the samsung pay the getallcards method of the cardmanager class is used to request a list of all cards currently registered/enrolled in samsung wallet on the same device running the issuer’s app to succeed, the issuer app must pass valid partnerinfo to 'cardmanager' for caller verification 'cardfilter' narrows the card list returned by samsung wallet to the issuername specified please be noted that getsamsungpaystatus must be called before getallcards getallcards could not return a cards list when getsamsungpaystatus responds with a code other than spay_ready noteto get the cards list of samsung pay watch, you have to use the watchmanager class instead of the cardmanager class as of api level sdk version 1 4, cardfilter retrieves this information from the samsung pay developers portal certain issuers may need to register multiple issuer name s with the portal, depending on their app and/or the requirements of their token service provider tsp the getallcards parameter cardfilter matches the issuer name s specified with those registered in the portal only complete matches are returned this method is typically called when your partner app wants to check the card status it does not need to be called every time the partner app resumes therefore, you should create the card list with the 'oncreate ' method, rather than the 'onresume ' method the result of a getallcards call is delivered to getcardlistener, which provides the following events onsuccess - called when the operation succeeds; provides the list of all filtered cards and their status card information includes cardid, cardstatus, and extra cardinfo data onfail - called when the operation fails here’s an example of how to use the 'getallcards ' api method in your issuer app val cardfilter = bundle // since api level 1 4, cardfilter param is ignored partner does not need to use it here // it is retrieved from the samsung pay developers portal cardfilter putstring cardmanager extra_issuer_name, issuername cardmanager getallcards null, object getcardlistener{ override fun onsuccess cards mutablelist<card>? { // getting card status is success if cards == null || cards isempty { log e tag, "no card is found" return } else { // perform operation with card data for s in cards { log d tag, "cardid " + s cardid + "cardstatus " + s cardstatus // get extra card data if s cardinfo != null { val cardid = s cardid // since api level 2 13, id from card network val last4fpan = s cardinfo getstring cardmanager extra_last4_fpan val last4dpan = s cardinfo getstring cardmanager extra_last4_dpan val cardtype = s cardinfo getstring cardmanager extra_card_type val cardissuername = s cardinfo getstring cardmanager extra_issuer_name log d tag, "last4fpan $last4fpan last4dpan $last4dpan cardid $cardid" } } } } override fun onfail errorcode int, errordata bundle? { // getting card status is failed } } 3 1 20 getting wallet information the samsungpay class provides the getwalletinfo api method, which is called to request wallet information from the samsung wallet app prior to calling the addcard api, when you want to avoid duplicate provisioning your issuer app uses this information to uniquely identify the user and the samsung wallet app on a particular device wallet device management id, device id, and wallet user id note to get wallet information of samsung pay watch, you have to use the watchmanager class instead of the cardmanager class fun getwalletinfo list<string> keys, statuslistener callback the following example demonstrates how to use it // set the serviceid assigned by the samsung pay developers portal during service creation val serviceid = "sampleserviceid" val bundle = bundle bundle putstring samsungpay extra_issuer_name, "issuer name" bundle putstring samsungpay partner_service_type, servicetype app2app tostring val pinfo = partnerinfo serviceid, bundle val samsungpay = samsungpay context, pinfo // add bundle keys to get wallet information from samsung pay // this information can be delivered to the partner server for an eligibility check val keys = arraylist<string> keys add samsungpay wallet_user_id keys add samsungpay device_id samsungpay getwalletinfo keys, object statuslistener{ override fun onsuccess status int, walletdata bundle { // log d tag, "dowalletinfo onsuccess callback is called" ; // for visa, deviceid can be set to "clientdeviceid" as defined by visa val deviceid = walletdata getstring samsungpay device_id // for visa, walletuserid can be set to "clientwalletaccountid" as defined by visa val walletuserid = walletdata getstring samsungpay wallet_user_id } override fun onfail errorcode int, errordata bundle? { log e tag, "onfail callback is called, errorcode " + errorcode ; // check the extra error codes in the errordata bundle for all the reasons in // samsungpay extra_error_reason, when provided } } 3 1 21 adding a card to samsung pay your issuer app calls the 'addcard ' api method of cardmanager to add a card to samsung wallet by providing the required card details, your app can make it convenient and easy for users to add their bank-issued debit/credit cards to samsung wallet directly from your app without additional steps, like switching between apps note if you want to add a card to samsung pay watch, you have to use the 'watchmanager' class instead of the cardmanager class for most issuers, getwalletinfo suffices for requesting current wallet information the response from samsung wallet tells the issuer app whether or not the user’s card has already been added to samsung wallet or is ineligible for provisioning it is therefore recommended that you call getwalletinfo before displaying the add to samsung pay button if the card is eligible, display the “add” button and, if the user taps it, call addcard important remember to obtain the governing issuer implementation guide s and specifications from the respective card network and implement each network’s required handling in your partner app and server the 'addcard ' result is delivered to addcardlistener, which provides the following events onsuccess - called when the operation succeeds; provides information and status regarding the added card onfail - called when the operation fails; returns the error code and extra bundle data such as extra_error_reason or extra_request_id if provided onprogress - called to indicate the current progress of the 'addcard ' operation; can be used to show a progress bar to the user in the issuer app this callback is supported for tsm solution issuers in china and spain here’s an example of how to use the addcard api method in your issuer app val cardtype = card card_type_credit val tokenizationprovider string = addcardinfo provider_abcd // samsung pay does not provide detailed payload information; generate the provisioning payload in // accordance with your card network specifications val testpayload = "thisistestpayloadcardinfo1234567890" //bin bank identification number can be set to issuerid it is mandatory for some card network val issuerid = "123456" val carddetail = bundle carddetail putstring extra_provision_payload, testpayload carddetail putstring extra_issuer_id, issuerid val addcardinfo = addcardinfo cardtype, tokenizationprovider, carddetail cardmanager addcard addcardinfo, object addcardlistener { override fun onsuccess status int, card card? { log d tag, "onsuccess callback is called" ; } override fun onfail errorcode int, errordata bundle? { log d tag, "onfail callback is called" ; // check some extra error codes in the errordata bundle // such as samsungpay extra_error_reason or samsungpay extra_request_id if provided } override fun onprogress currentcount int, totalcount int, bundledata bundle? { log d tag,"onprogress callback is called " + currentcount + " / " + totalcount ; } } 3 1 22 adding a co-badge card to samsung pay co-badge payment cards combine two payment brands/networks to add a co-badge card through push provisioning, you must provide two different card network details one for the primary card network and another for the secondary card network issuer app calls the addcobadgecard api method of cardmanager to add a co-badge card to samsung pay in most cases, calling getwalletinfo will suffice to request current wallet information the response from samsung pay indicates whether the user's co-badge card has already been added to samsung pay or is ineligible for provisioning therefore, it is advisable to call getwalletinfo before displaying the add to samsung pay button if the co-badge card is eligible, display the "add" button and, upon user tapping, call addcobadgecard important please remember to refer to the relevant issuer implementation guide s and specifications provided by each card network and ensure that your partner app and server adhere to their specific requirements the addcobadgecard result is delivered to addcardlistener, which provides the following events onsuccess - called when the operation succeeds; provides information and status regarding the added card onfail - called when the operation fails; returns the error code and extra bundle data such as extra_error_reason or extra_request_id if provided onprogress - called to indicate the current progress of the 'addcard ' operation; can be used to show a progress bar to the user in the issuer app this callback is supported for tsm solution issuers in china and spain here’s an example of how to use the addcobadgecard api method in your issuer app notesamsung pay does not provide detailed payload information; generate the provisioning payload in accordance with your card networks specifications string cardtype = card card_type_credit; string primarytokenizationprovider = addcardinfo provider_abcd; //provide your primary card network payload string testprimarypayload = "thisistestprimarypayloadcardinfo1234567890"; string secondarytokenizationprovider = addcardinfo provider_efgh; //provide your secondary card network payload string testsecondarypayload = "thisistestsecondarypayloadcardinfo1234567890"; bundle primarycarddetail = new bundle ; primarycarddetail putstring addcardinfo extra_provision_payload, testprimarypayload ; addcardinfo primaryaddcardinfo = new addcardinfo cardtype, primarytokenizationprovider, primarycarddetail ; bundle secondarycarddetail = new bundle ; secondarycarddetail putstring addcardinfo extra_provision_payload, testsecondarypayload ; addcardinfo secondaryaddcardinfo = new addcardinfo cardtype, secondarytokenizationprovider, secondarycarddetail ; cardmanager addcobadgecard primaryaddcardinfo, secondaryaddcardinfo, new addcardlistener { @override public void onsuccess int status, card card { log d tag, "onsuccess callback is called" ; } @override public void onfail int error, bundle errordata { log d tag, "onfail callback is called" ; check some extra error codes in the errordata bundle such as samsungpay extra_error_reason or samsungpay extra_request_id if provided } @override public void onprogress int currentcount, int totalcount, bundle bundledata { log d tag,"onprogress callback is called " + currentcount + " / " + totalcount ; } } ; 3 1 23 sample applications sample apps, use cases, and ux strategies are included here to aid you in understanding the sdk and implementing it in your application sample source code and apks can be downloaded from download section sample merchant app included with the samsung pay sdk to demonstrate its features, the sample merchant app shows you how to implement the payment sheet’s dynamic controls to leverage additional customer order and payment data and/or create a more custom ui look and feel the following payment sheet controls are available addresscontrol plaintextcontrol amountboxcontrol spinnercontrol controls are applied to suit a particular purpose or need for example, displaying a promotion notice in the payment sheet using the plaintextcontrol applying an addresscontrol this control is used to display the billing or shipping address on the payment sheet based on samsung pay’s my info user profile or addresses provided by your merchant app during the transaction request when creating the control, controlld and sheetitemtype are needed to distinguish the billing address from the shipping address otherwise, your merchant app sets the following properties address title – displays a merchant-defined title on the payment sheet if empty, the default title such as “billing address” is displayed address – provides various methods to retrieve address details the merchant app can retrieve the phone number using the 'getphonenumber' method of 'customsheetpaymentinfo' address starting from api level 1 5, the addressee’s email address has also been added retrieve the email address using 'getemail' you can also set a display option for the shipping address with 'setdisplayoption' for more information, see the samsung pay sdk-api reference javadoc and the sample code included with the samsung pay sdk sheetupdatedlistener – used to capture the response from the samsung wallet app; merchant app must deliver to the samsung wallet app an amountboxcontrol to display payment information on a custom payment sheet when the onresult callback is called, the updatesheet method must also be called to update the current payment sheet errorcode – used for containing error codes directly related to the address the workflows for billingaddresscontrol the workflow for shippingaddresscontrol the following sample code demonstrates use of addresscontrol on the payment sheet fun makebillingaddresscontrol addresscontrol { val billingaddresscontrol = if !iszipcodeonly { // for billing address addresscontrol billing_address_id, sheetitemtype billing_address billingaddresscontrol addresstitle = "billing address" } else { /* * for billing address with zip code only * since api level 2 19, sheetitemtype zip_only_address * for us country only */ addresscontrol billing_address_id, sheetitemtype zip_only_address billingaddresscontrol addresstitle = "zip code" } //this callback is received when controls are updated billingaddresscontrol sheetupdatedlistener = sheetupdatedlistener return billingaddresscontrol } //listener for billing or zip code only billing address fun sheetupdatedlistener sheetupdatedlistener { return sheetupdatedlistener { updatedcontrolid string, customsheet customsheet -> log d tag, "onresult billingaddresscontrol updatedcontrolid $updatedcontrolid" val addresscontrol = customsheet getsheetcontrol updatedcontrolid as addresscontrol val billaddress = addresscontrol address //validate only zipcode or billing address and set errorcode if needed if addresscontrol sheetitem sheetitemtype == sheetitemtype zip_only_address { val errorcode int = validatezipcodebillingaddress billaddress log d tag, "onresult updatesheetbilling errorcode $errorcode" addresscontrol errorcode = errorcode customsheet updatecontrol addresscontrol } else { val errorcode = validatebillingaddress billaddress log d tag, "onresult updatesheetbilling errorcode $errorcode" addresscontrol errorcode = errorcode customsheet updatecontrol addresscontrol } // update transaction values val amountboxcontrol = customsheet getsheetcontrol amount_control_id as amountboxcontrol amountboxcontrol updatevalue product_item_id, 1000 0 amountboxcontrol updatevalue product_tax_id, 50 0 amountboxcontrol updatevalue product_shipping_id, 10 0 amountboxcontrol updatevalue product_fuel_id, 0 0, "pending" amountboxcontrol setamounttotal 1060 0, amountconstants format_total_price_only customsheet updatecontrol amountboxcontrol try { // call updatesheet for the full amountboxcontrol; mandatory paymentmanager updatesheet customsheet } catch e illegalstateexception { e printstacktrace } catch e nullpointerexception { e printstacktrace } } } // for shipping address fun makeshippingaddresscontrol addresscontrol { val shippingaddresscontrol = addresscontrol shipping_address_id, sheetitemtype shipping_address shippingaddresscontrol addresstitle = "shipping address" val shippingaddress = customsheetpaymentinfo address builde setaddressee "name" setaddressline1 "addline1" setaddressline2 "addline2" setcity "city" setstate "state" setcountrycode "usa" setpostalcode "zip" setphonenumber "555-123-1234" setemail "user@samsung com" build shippingaddresscontrol address = shippingaddress /* * set address display option on custom payment sheet * if displayoption is not set, then default addresscontrol is displayed on custom payment sheet * the possible values are combination of below constants * {display_option_addressee} * {display_option_address} * {display_option_phone_number} * {display_option_email} */ var displayoption_val = addressconstants display_option_addressee // addressee is mandatory displayoption_val += addressconstants display_option_address displayoption_val += addressconstants display_option_phone_number displayoption_val += addressconstants display_option_email shippingaddresscontrol displayoption = displayoption_val return shippingaddresscontrol } here’s how these controls display on a custom payment sheet billing address control zip code billing address control shipping address control applying a plaintextcontrol this control is used for displaying a title with two lines of text or a single line of text without a title on the payment sheet when allocating this control, a controlid is needed the merchant app sets both the title, as applicable, and the text diagrammed below is the flow between your merchant app and samsung pay plaintextcontrol flow the merchant app code invoking this class would look something like the following fun makeplaintextcontrol plaintextcontrol { val plaintextcontrol = plaintextcontrol "exampleplaintextcontrolid" plaintextcontrol settext "plain text [example]", "this is example of plaintextcontrol" return plaintextcontrol } and this is how it displays on the custom payment sheet applying an amountboxcontrol amountboxcontrol is used for displaying purchase amount information on the payment sheet it requires a controlid and a currencycode, and consists of item s and amounttotal, defined as follows and diagrammed on the next page item – consists of id, title, price, and extraprice if there is an extraprice in amountboxcontrol, its text is displayed on the payment sheet even though there is an actual numerical price value if there is no extraprice, then currencycode with the price value is displayed amounttotal – consists of price and displayoption the displayoption allows predefined strings only your merchant app can set the text to “estimated amount”, “amount pending”, “pending”, “free”, and so forth the ui format for the string is different for each option note the setamounttotal api may accept strings that are not predefined as an argument, but it generates an invalid parameter condition or returns an error code in such cases for details, see the javadoc samsung pay sdk-api reference, available in the documentation folder of your downloaded sdk package here’s a coding example to demonstrate the use of amountboxcontrol in a payment sheet fun makeamountcontrol amountboxcontrol { val amountboxcontrol = amountboxcontrol amount_control_id, "usd" amountboxcontrol additem product_item_id, "item", 1000 0, "" amountboxcontrol additem product_tax_id, "tax", 50 0, "" amountboxcontrol additem product_shipping_id, "shipping", 10 0, "" amountboxcontrol setamounttotal 1060 0, amountconstants format_total_price_only amountboxcontrol additem 3, product_fuel_id, "fuel", 0 0, "pending" return amountboxcontrol } the merchant app can also add new items using the 'additem' method of 'amountcontrolbox' during callback important your merchant app needs to call the updatevalue item_id method of amountboxcontrol to update each amount item then call customsheet updatecontrol to make the changes take effect in customsheet eventually, paymentmanager updatesheet 'customsheet' must be called to let samsung pay know that no further action is pending in the merchant app when the custom sheet is updated, the merchant can add new items to amountboxcontrol for example, if the user selects a specific card in the payment sheet which the merchant offers, a discount item can be added via the updatesheet // example for adding new item while updating values val amount = sheet getsheetcontroll "id_amount" amount updatevalue "itemid", 900 0 amount updatevalue "taxid", 50 0 amount updatevalue "shippingid", 10 0 amount updatevalue "fuelid", 0 0 // add “discount” item amount additem 4, "discountid", "discount", -60 0, "" amount setamounttotal 1000 0, amountconstants format_total_price_only sheet updatecontrol amount // call updatesheet with amountboxcontrol; mandatory try { paymentmanager updatesheet sheet } catch e illegalstateexception { e printstacktrace } catch e nullpointerexception { e printstacktrace } applying the spinnercontrol this control is used for displaying spinner options on a payment sheet when creating the control, controlid, title, and sheetitemtype are needed to distinguish between the types of spinner to be displayed your merchant app sets the following properties with spinnercontrol title – the merchant-defined spinner title to appear the payment sheet sheetitemtype – provides various types of spinner a shipping_method_spinner and an installment_spinner are the two types of spinner available as of api level 1 6 note shipping_method_spinner can be used when the shipping address comes from the samsung wallet app; i e , when the customsheetpaymentinfo addressinpaymentsheet option is set to need_billing_and_shipping or need_ shipping_spay when the shipping address is provided by the merchant app send_shipping or need_billing_ send_shipping , it is not changeable in the payment sheet the shipping fee if applied must be pre-calculated on the merchant app side here’s an example of constructing a spinnercontrol within your merchant app // construct spinnercontrol for shipping method val spinnercontrol = spinnercontrol shippingmethod_spinner_id, "shipping method ", sheetitemtype shipping_method_spinner // let the user can select one shipping method option on the payment sheet spinnercontrol additem "shipping_method_1", getstring android r string standard_shipping_free spinnercontrol additem "shipping_method_2", getstring android r string twoday_shipping spinnercontrol additem "shipping_method_3", getstring android r string oneday_shipping spinnercontrol selecteditemid = "shipping_method_1" // set default option // listen for sheetcontrol events spinnercontrol setsheetupdatedlistener sheetupdatedlistener { updatedcontrolid, customsheet -> val amountboxcontrol = customsheet getsheetcontrol amount_control_id as amountboxcontrol val spinnercontrol = customsheet getsheetcontrol updatedcontrolid as spinnercontrol when spinnercontrol selecteditemid { "shipping_method_1" -> amountboxcontrol updatevalue product_shipping_id, 10 0 "shipping_method_2" -> amountboxcontrol updatevalue product_shipping_id, 10 + 0 1 "shipping_method_3" -> amountboxcontrol updatevalue product_shipping_id, 10 + 0 2 else -> amountboxcontrol updatevalue product_shipping_id, 10 0 } amountboxcontrol setamounttotal 1000 + amountboxcontrol getvalue product_shipping_id , amountconstants format_total_price_only customsheet updatecontrol amountboxcontrol // call updatesheet with amountboxcontrol; mandatory try { paymentmanager updatesheet customsheet } catch e illegalstateexception { e printstacktrace } catch e nullpointerexception { e printstacktrace } } // construct spinnercontrol for installment plan val spinnercontrol = spinnercontrol installment_spinner_id, "installment", sheetitemtype installment_spinner spinnercontrol additem "installment_1", "1 month without interest" spinnercontrol additem "installment_2", "2 months with 2% monthly interest" spinnercontrol additem "installment_3", "3 months with 2 2% monthly interest" spinnercontrol selecteditemid = "installment_1" // set default option // listen for sheetcontrol events spinnercontrol setsheetupdatedlistener sheetupdatedlistener { updatedcontrolid, customsheet -> val amountboxcontrol amountboxcontrol = customsheet getsheetcontrol amount_control_id as amountboxcontrol val spinnercontrol = customsheet getsheetcontrol updatedcontrolid as spinnercontrol val totalinterest = 0 0 when spinnercontrol selecteditemid { "installment1" -> amountboxcontrol updatevalue product_total_interest_id, totalinterest "installment2" -> // calculate total interest again and updatevalue amountboxcontrol updatevalue product_total_interest_id, totalinterest "installment3" -> // calculate total interest again and updatevalue amountboxcontrol updatevalue product_total_interest_id, totalinterest else -> amountboxcontrol updatevalue product_total_interest_id, totalinterest } amountboxcontrol setamounttotal 1000 + amountboxcontrol getvalue product_total_interest_id , amountconstants format_total_price_only customsheet updatecontrol amountboxcontrol // call updatesheet with amountboxcontrol; mandatory try { paymentmanager updatesheet customsheet } catch e illegalstateexception { e printstacktrace } catch e nullpointerexception { e printstacktrace } } update sheet with custom error message to display a custom error message on the payment sheet, use updatesheet with customerrormessage fun updatesheet sheet customsheet, errorcode int, customerrormessage string this api method is an extended version of the existing updatesheet sheet method which gives the merchant the ability to display a custom error message in the payment sheet’s authentication area it can be used to inform the user of any foreseen error scenarios encountered // update sheet with custom_messsage error code paymentmanager updatesheet customsheet, paymentmanager custom_message,"phone number entered is not valid please change your phone number " sample issuer app the samsung pay sdk also provides a sample issuer app to showcase samsung pay sdk features issuer app can add card to samsung wallet by selecting specific token service provider tsp from the dropdown menu to add cobadge card you need to select primary and secondary token service providers tsp from the dropdown menus for more information, refer to the samsung pay sdk api reference and sample code 3 1 24 api references
Develop Samsung Pay
doc3 2 samsung pay sdk flutter plugin 3 2 1 flutter plugin overview the samsung pay sdk flutter plugin allows developers to integrate select features of samsung wallet into flutter-based android apps running on samsung devices it acts as a bridge between the flutter environment and the native samsung pay sdk, enabling secure and seamless payments through samsung pay purpose the primary aim of this plugin is to bring samsung pay sdk functionality into the flutter ecosystem—making it easier for developers to integrate mobile wallet capabilities without deep native android coding supported operations the samsung pay sdk flutter plugin supports the following major operations in-app payment lets users pay for goods and services within a partner app using samsung wallet push provisioning enables users to add bank cards directly to samsung wallet from the issuer’s app by providing required card details what’s included in the plugin package to support seamless integration, the flutter plugin package typically includes samsung pay sdk flutter plugin dart interface, platform channel code, and native android sdk wrappers java/kotlin contains all classes, interfaces, and native libraries needed to communicate with samsung pay services api reference documentation detailed descriptions of each supported api method and parameters usage guidance for implementing features like getsamsungpaystatus , activatesamsungpay , and transaction callbacks sample merchant & issuer apps complete working examples of how to accept in-app payments push provision a card into samsung wallet handle callback responses and errors demonstrates full implementation using flutter ui and platform logic benefits of using the flutter plugin cross-platform development with native payment features faster time to market by avoiding full native sdk integration pre-built sample apps and apis to accelerate onboarding seamless integration with samsung’s trusted payment environment 3 2 2 samsung pay sdk flutter plugin architecture the following diagram illustrates the high-level architecture and core interactions between the samsung pay sdk flutter plugin and a partner app at this level, the plugin enables partner apps to leverage samsung pay for key operations such as push provisioning for issuers and in-app payments for merchants key components and roles partner app - a flutter-based app developed by a merchant or issuer it integrates samsung pay features to support in-app or online payments merchants push provisioning and management issuers samsung pay sdk flutter plugin - the plugin layer embedded in the partner app it enables direct communication between the flutter app and samsung pay services on the device by bridging native sdk apis samsung pay app - the native samsung pay samsung wallet application on the user’s device it securely handles payment authorization, tokenization, card management, and transaction ui financial network - the back-end payment ecosystem, including payment gateways pgs acquirers and issuers card associations e g , visa, mastercard these entities work together to process transactions initiated through samsung pay under merchant agreements 3 2 3 setting up flutter plugin environment establishing a stable and well-configured development environment is essential for the successful integration of the samsung pay sdk flutter plugin into your partner app the following prerequisites and recommendations will help ensure a smooth setup and implementation prerequisites & requirements platform compatibility ensure your app is targeting android devices that support samsung pay for detailed android system requirements, refer to the [samsung pay android sdk overview] service registration to use the plugin, merchants and issuers must first register a service through the samsung pay developer portal this includes obtaining a valid service id sid and service type required for integration refer to the [service registration guide] for step-by-step instructions download the flutter plugin obtain the official samsung pay sdk flutter plugin package, which includes plugin libraries and dependencies api documentation sample flutter apps for merchant and issuer use cases the plugin has the following directory structure folder contents docs api reference documentation libs samsungpaysdkflutter_v1 03 00 flutter plugin – contains the samsung pay apis to be used by your partner app samples sample apps 3 2 4 integrate samsung pay sdk flutter plugin be sure to do the following before attempting to use the plugin if not already part of your environment, download and install an ide android studio is recommended download the samsung pay sdk flutter plugin configure your ide to integrate the samsung pay sdk flutter plugin with your partner app go to pubspec yaml and enter the following dependency dependencies samsung_pay_sdk_flutter path plugin_directory_path\ [note] if your plugin path is c \users\username\downloads, the dependency will be like below dependencies samsung_pay_sdk_flutter path c \users\username\downloads\ for android proguard rules and dexguard, please check the android sdk overview 3 2 5 common flow once the setup is complete, you're ready to start integrating samsung pay features into your partner app using the samsung pay sdk flutter plugin the plugin provides apis for the following core functionalities supported operations via apis check samsung wallet status activate the samsung wallet app update the samsung wallet app checking samsung wallet status the first step is to create a samsungpaysdkflutter instance this instance checks whether samsung wallet is supported and ready to use on the user’s device based on the result, your app will determine whether to display the samsung pay button for both merchant payments and issuer push provisioning important the partner app must initialize partnerinfo, passing the serviceid and servicetype these are assigned in the samsung pay developers portal and are used for partner verification blocked list checking version control between the plugin and the samsung wallet app string serviceid; map<string,dynamic> data; static final samsungpaysdkflutterplugin = samsungpaysdkflutter partnerinfo serviceid 'partner_app_service_id', data {spaysdk partner_service_type servicetype app2app name tostring } ; after setting partnerinfo, your partner app can now call getsamsungpaystatus this method of the samsungpay class must be called before using any other feature in the samsung pay sdk flutter plugin future<void> getsamsungpaystatus statuslistener? statuslistener the result is delivered to statuslistener and provides onsucccess and onfail events check the android sdk common flow for more details the following sample code shows how to use the getsamsungpaystatus api method myhomepage samsungpaysdkflutterplugin getsamsungpaystatus statuslistener onsuccess status, bundle async { showstatus status, bundle ; }, onfail errorcode, bundle { showerror errorcode, bundle ; } ; activating the samsung wallet app the samsungpaysdkflutter class provides the following api method to activate the samsung wallet app on a device future<void> activatesamsungpay activatesamsungpay is called to activate the samsung wallet app on the same device on which the partner app is running first, the partner app must check the samsung wallet status with a getsamsungpaystatus call if the status is spay_not_ready and extra_error_reason is error_spay_setup_not_complete, the partner app needs to display an appropriate message to user, then call activatesamsungpay to launch the samsung wallet app so the user can sign in here’s an example of how to code this samsungpaysdkflutterplugin activatesamsungpay ; updating the samsung wallet app the samsungpaysdkflutter class provides the following api method to update the samsung wallet app on the device future<void> gotoupdatepage gotoupdatepage is called to update samsung wallet app on the same device on which the partner app is running as with all api calls, the partner app must first check the samsung wallet status with getsamsungpaystatus if this returns spay_not_ready and extra_error_reason is error_spay_app_need_to_update, then the partner app needs to display an appropriate message to the user and call gotoupdatepage , which launches the samsung wallet update page the following code sample reflects how to update samsung wallet samsungpaysdkflutterplugin gotoupdatepage ; 3 2 6 in-app online merchant applications can initiate secure in-app payments by interacting with the samsung pay sdk flutter plugin this process allows apps to display a custom payment sheet, retrieve card information, and handle payment requests smoothly within the app the following functionalities are ready to perform a variety of payment operations checking registered/enrolled card information before displaying the samsung pay button, a partner app can query card brand information for the user’s currently enrolled payment cards in samsung wallet to determine if payment is supported with the enrolled card to query the card brand, use the requestcardinfo api method of the samsungpaysdkflutter class the merchant app does not need to set a value for it now however, before calling this method, cardinfolistener must be registered so its listener can provide onresult and onfailure events the following snippet shows how to retrieve the list of supported card brands from samsung wallet samsungpaysdkflutterplugin requestcardinfo cardinfolistener {onresult paymentcardinfo showcardlist paymentcardinfo ; }, onfailure errorcode, bundle { showerror errorcode, bundle ; } ; creating a transaction request upon successful initialization of the samsungpaysdkflutter class, the merchant app needs to create a transaction request with payment information using the custom payment sheet to initiate a payment transaction with samsung wallet’s custom payment sheet, your merchant app must populate the following mandatory fields in customsheetpaymentinfo merchant name - as it will appear in samsung wallet’s payment sheet, as well as the user's card account statement customsheet - is called when the user changes card on the custom payment sheet in samsung wallet optionally, the following fields can be added to the payment information merchant id - can be used for the merchant’s own designated purpose at its discretion unless the merchant uses an indirect pg like stripe or braintree if an indirect pg is used, this field must be set to the merchant’s payment gateway id fetched from the samsung pay developers portal order number - usually created by the merchant app via interaction with a pg this number is required for refunds and chargebacks in the case of visa cards, the value is mandatory the allowed characters are [a-z][a-z][0-9,-] and the length of the value can be up to 36 characters address - the user’s billing and/or shipping address allowed card brands - specifies card brands accepted by the merchant if no brand is specified, all brands are accepted by default if at least one brand is specified, all other card brands not specified are set to "card not supported’ on the payment sheet here’s the 'customsheetpaymentinfo' structure string? merchantid; string merchantname; string? ordernumber; addressinpaymentsheet? addressinpaymentsheet; list<brand>? allowedcardbrand; paymentcardinfo? cardinfo; bool? iscardholdernamerequired; bool? isrecurring; string? merchantcountrycode; customsheet customsheet; map<string,dynamic>? extrapaymentinfo; your merchant app sends this customsheetpaymentinfo to samsung wallet via the applicable samsung pay sdk flutter plugin api methods upon successful user authentication in direct mode, samsung wallet returns the above "payment info" structure and a result string the result string is forwarded to the pg by your merchant app to complete the transaction it will vary based on the pg you’re using the following example demonstrates how to populate customsheet in the customsheetpaymentinfo class list<brand> brandlist = []; brandlist add brand visa ; brandlist add brand mastercard ; brandlist add brand americanexpress ; customsheetpaymentinfo customsheetpaymentinfo= customsheetpaymentinfo merchantname "merchantname", customsheet customsheet ; customsheetpaymentinfo setmerchantid "123456" ; customsheetpaymentinfo setmerchantname "sample merchant" ; customsheetpaymentinfo setaddressinpaymentsheet addressinpaymentsheet need_billing_send_shipping ; customsheetpaymentinfo setcardholdernameenabled true ; customsheetpaymentinfo setrecrringenabled false ; customsheetpaymentinfo setcustomsheet customsheet ; customsheetpaymentinfo allowedcardbrand = brandlist; return customsheetpaymentinfo; requesting payment with a custom payment sheet the startinapppaywithcustomsheet method of the samsungpaysdkflutter class is applied to request payment using a custom payment sheet in samsung wallet the two methods are defined as follows startinapppaywithcustomsheet - initiates the payment request with a custom payment sheet the payment sheet persists for 5 minutes after the api is called if the time limit expires, the transaction fails updatesheet - updates the custom payment sheet if any values on the sheet are changed as of api level 1 5, a merchant app can update the custom sheet with a custom error message refer to updating sheet with custom error message when you call the startinapppaywithcustomsheet method, a custom payment sheet is displayed on the merchant app screen from it, the user can select a registered card for payment and change the billing and shipping addresses, as necessary the result is delivered to customsheettransactioninfolistener, which provides the following events onsuccess - called when samsung wallet confirms payment it provides the customsheetpaymentinfo object and the paymentcredential json string customsheetpaymentinfo is used for the current transaction it contains amount, shippingaddress, merchantid, merchantname, ordernumber api methods exclusively available in the onsuccess callback comprise getpaymentcardlast4dpan – returns the last 4 digits of the user's digitized personal/primary identification number dpan getpaymentcardlast4fpan – returns the last 4 digits of the user's funding personal/primary identification number fpan getpaymentcardbrand – returns the brand of the card used for the transaction getpaymentcurrencycode – returns the iso currency code in which the transaction is valued getpaymentshippingaddress – returns the shipping/delivery address for the transaction getpaymentshippingmethod – returns the shipping method for the transaction for pgs using the direct model network tokens , the paymentcredential is a json object containing encrypted cryptogram which can be passed to the pg pgs using the indirect model gateway tokens like stripe, it is a json object containing reference card reference – a token id generated by the pg and status i e , authorized, pending, charged, or refunded refer to payment credential sample for details oncardinfoupdated - called when the user changes the payment card in this callback, updatesheet method must be called to update current payment sheet onfailure - called when the transaction fails, returns the error code and errordata bundle for the failure here’s how to call the startinapppaywithcustomsheet method of the samsungpaysdkflutter class class customsheettransactioninfolistener{ function paymentcardinfo paymentcardinfo, customsheet customsheet oncardinfoupdated; function customsheetpaymentinfo customsheetpaymentinfo, string paymentcredential, map<string, dynamic>? extrapaymentdata onsuccess; function string errorcode, map<string, dynamic> bundle onfail; customsheettransactioninfolistener {required this oncardinfoupdated, required this onsuccess, required this onfail} ; } void oncardinfoupdated cardinfo selectedcardinfo, customsheet customsheet { amountboxcontrol amountboxcontrol = customsheet getsheetcontrol amount_control_id as amountboxcontrol; amountboxcontrol updatevalue product_item_id, 1000 ; amountboxcontrol updatevalue product_tax_id, 50 ; amountboxcontrol updatevalue product_shipping_id, 10 ; amountboxcontrol updatevalue product_fuel_id, 0, "pending" ; amountboxcontrol setamounttotal 1060, amountconstants format_total_price_only ; customsheet updatecontrol amountboxcontrol ; } } void startinapppaywithcustomsheet customsheetpaymentinfo customsheetpaymentinfo,customsheettransactioninfolistener? customsheettransactioninfolistener { try{ methodchannelsamsungpaysdkflutter? startinapppaywithcustomsheet customsheetpaymentinfo, customsheettransactioninfolistener ; }on platformexception catch e { print e ; } } override fun onsuccess response customsheetpaymentinfo, paymentcredential string, extrapaymentdata bundle {} override fun onfailure errorcode int, errordata bundle? {} 3 2 7 push provisioning the app-to-app service, also known as push provisioning, allows issuer apps to seamlessly add payment cards to the samsung wallet on a user’s samsung device—directly from within the app—using the samsung pay sdk flutter plugin this integration enhances the user experience by eliminating the need to manually launch samsung wallet or scan physical cards requesting registered card list in the samsung wallet the getallcards method of the cardmanager class is used to request a list of all cards currently registered/enrolled in samsung wallet on the same device running the issuer’s app to succeed, the issuer app must pass valid partnerinfo to 'cardmanager' for caller verification 'cardfilter' narrows the card list returned by samsung wallet to the issuername specified please be noted that getsamsungpaystatus must be called before getallcards getallcards could not return a cards list when getsamsungpaystatus responds with a code other than spay_ready as of api level sdk version 1 4, cardfilter retrieves this information from the samsung pay developers portal certain issuers may need to register multiple issuer name s with the portal, depending on their app and/or the requirements of their token service provider tsp the getallcards parameter cardfilter matches the issuer name s specified with those registered in the portal only complete matches are returned this method is typically called when your partner app wants to check the card status it does not need to be called every time the partner app resumes therefore, you should create the card list with the 'oncreate ' method, rather than the 'onresume ' method the result of a getallcards call is delivered to getcardlistener, which provides the following events onsuccess - called when the operation succeeds; provides the list of all filtered cards and their status card information includes cardid, cardstatus, and extra cardinfo data onfail - called when the operation fails here’s an example of how to use the 'getallcards ' api method in your issuer app samsungpaysdkflutterplugin getallcards getcardlistener onsuccess list { showcardlist list ; }, onfail errorcode, bundle { showerror errorcode, bundle ; } ; getting wallet information the samsungpay class provides the getwalletinfo api method, which is called to request wallet information from the samsung wallet app prior to calling the addcard api, when you want to avoid duplicate provisioning your issuer app uses this information to uniquely identify the user and the samsung wallet app on a particular device wallet device management id, device id, and wallet user id void getwalletinfo statuslistener? statuslistener the following example demonstrates how to use it string serviceid; spaysdk partner_service_type servicetype app2app name tostring samsungpaysdkflutter partnerinfo serviceid "", data {} ; samsungpay=samsungpay context,partnerinfo val keys = arraylist<string> keys add samsungpay wallet_dm_id keys add samsungpay device_id keys add samsungpay wallet_user_id samsungpaysdkflutterplugin getwalletinfo statuslistener onsuccess status, bundle async { val deviceid string? = walletdata getstring samsungpay device_id val walletuserid string? = walletdata getstring samsungpay wallet_user_id }, onfail errorcode, bundle { util showerror context, errorcode, bundle ; } ; adding a card to samsung wallet your issuer app calls the addcard api method of cardmanager to add a card to samsung wallet by providing the required card details, your app can make it convenient and easy for users to add their bank-issued debit/credit cards to samsung wallet directly from your app without additional steps, like switching between apps for most issuers, getwalletinfo suffices for requesting current wallet information the response from samsung wallet tells the issuer app whether or not the user’s card has already been added to samsung wallet or is ineligible for provisioning it is therefore recommended that you call getwalletinfo before displaying the add to samsung pay button if the card is eligible, display the “add” button and, if the user taps it, call addcard the addcard result is delivered to addcardlistener, which provides the following events onsuccess - called when the operation succeeds; provides information and status regarding the added card onfail - called when the operation fails; returns the error code and extra bundle data such as extra_error_reason or extra_request_id if provided onprogress - called to indicate the current progress of the 'addcard ' operation; can be used to show a progress bar to the user in the issuer app this callback is supported for tsm solution issuers in china and spain here’s an example of how to use the addcard api method in your issuer app string cardtype = walletcard card_type_credit_debit; string tokenprovider = addcardinfo provider_abcd; string testpayload = "testpayloadcardinfoforflutterplugin"; map<string, dynamic> carddetail = {}; carddetail[addcardinfo extra_provision_payload] = testpayload; var addcardinfo = addcardinfo cardtype, tokenprovider,carddetail ; myapp samsungpaysdkflutterplugin addcard addcardinfo, addcardlistener onsuccess status, card { print "success $status / data $card" ; },onfail errorcode, bundle { util showerror context, errorcode, bundle ; print "error $errorcode / data $bundle" ; },on-progress currentcount, totalcount, bundle { print "currentcount $currentcount / totalcount $totalcount / data $bundle" ; } ; adding a co-badge card to samsung pay co-badge payment cards include two payment brands or networks when adding a co-badge card using push provisioning, you need to supply the card details for both networks one as the primary and the other as the secondary issuer app calls the addcobadgecard api method of cardmanager to add a co-badge card to samsung pay in most cases, calling getwalletinfo will suffice to request current wallet information the response from samsung pay indicates whether the user's co-badge card has already been added to samsung pay or is ineligible for provisioning therefore, it is advisable to call getwalletinfo before displaying the add to samsung pay button if the co-badge card is eligible, display the "add" button and, upon user tapping, call addcobadgecard important please remember to refer to the relevant issuer implementation guide s and specifications provided by each card network and ensure that your partner app and server adhere to their specific requirements the addcobadgecard result is delivered to addcardlistener, which provides the following events onsuccess - called when the operation succeeds; provides information and status regarding the added card onfail - called when the operation fails; returns the error code and extra bundle data such as extra_error_reason or extra_request_id if provided onprogress - called to indicate the current progress of the 'addcard ' operation; can be used to show a progress bar to the user in the issuer app this callback is supported for tsm solution issuers in china and spain here’s an example of how to use the addcobadgecard api method in your issuer app note samsung pay does not provide detailed payload information; generate the provisioning payload in accordance with your card networks specifications string cardtype = walletcard card_type_credit_debit; string primarytokenprovider = addcardinfo provider_abcd; //provide your primary card network payload string testprimarypayload = "thisistestprimarypayloadcardinfo1234567890"; string secondarytokenprovider = addcardinfo provider_efgh; //provide your secondary card network payload string testsecondarypayload = "thisistestsecondarypayloadcardinfo1234567890"; map<string, dynamic> primarycarddetails={}; primarycarddetails[addcardinfo extra_provision_payload] = testprimarypayload; map<string, dynamic> secondarycarddetails={}; secondarycarddetails[addcardinfo extra_provision_payload] = testsecondarypayload; var primaryaddcardinfo = addcardinfo cardtype, primarytokenprovider, primarycarddetails ; var secondaryaddcardinfo = addcardinfo cardtype, secondarytokenprovider, secondarycarddetails ; myapp samsungpaysdkflutterplugin addcobadgecard primaryaddcardinfo, secondaryaddcardinfo, addcardlistener onsuccess status, card { print "success $status / data $card" ; },onfail errorcode, bundle { print "error $errorcode / data $bundle" ; },on-progress currentcount, totalcount, bundle { print "currentcount $currentcount / totalcount $totalcount / data $bundle" ; } ; 3 2 8 sample apps sample applications sample apps with ux strategies are included here to aid you in understanding the sdk and implementing it in your application sample source code and apks can be downloaded from download section sample merchant app the sample merchant app shows you how to implement the payment sheet’s dynamic controls to leverage additional customer order and payment data and/or create a more custom ui look and feel the following payment sheet controls are available addresscontrol plaintextcontrol amountboxcontrol spinnercontrol controls are applied to suit a particular purpose or need check this android sdk sample merchant app for details sample issuer app the samsung pay sdk flutter plugin also provides a sample issuer app to showcase samsung pay sdk features for more information, refer to the javadoc samsung pay sdk api reference and sample code
success story design, galaxy watch, marketplace
blogthis year at sdc18 the first-ever best of 2018 samsung galaxy apps awards winners were announced! the awards recognize the top publishers who have stood out amongst the galaxy apps store’s boutique of expertly curated apps. to kick-off our ‘best of 2018’ series, we spoke with zhu guangxu, this year’s winner for best themes designer to get some insights on how he creates themes that stand out from the crowd. how did you get into designing themes? i graduated from college with a major in electrical engineering, but during my sophomore year, i inadvertently came across theme stores. out of curiosity, i did some research on themes, and taught myself how to make them. i created some themes which made it to the online store. many people liked them, and that’s when i realized creating themes could be more than a hobby. how would you describe your approach to design? a good theme takes time to create and perfect before it is ready to be used on a smartphone. my inspiration comes from the world around me, examining every little detail, which is far more complicated than a theme. that is the soul and essence of designers. what is your process for designing themes? i start with the wallpaper, and base the logos on that design to match the colours, paying close attention to the details. what is the most important thing to consider when designing themes? when it comes to theme design, the user’s first impression is everything. overall style and general likability of a theme are the main things i consider during theme design. watch zhu guangxu’s acceptance speech for the best of 2018 theme designer award. what is the biggest technical challenge you faced as a themes designer? when designing themes, i would start off by trying to create the best design possible, and then would often would run into technical issues with the smartphone operating systems. however, thanks to a strong team, i was able to work around those issues to still create the quality theme designs i had in mind. what design element do you think all good themes have in common? themes come in all kinds of styles, from super cool, to classic minimalist, to purely beautiful. because themes are so diverse, it’s hard to pinpoint a specific design element that makes them stand out. but no matter the theme style, you can always tell when a lot of work has gone into creating the wallpaper and logos, a trademark of a quality theme. how do you keep your theme designs fresh and relevant? i pay close attention to the smartphone industry, specifically market trends and consumer insights. i’ll often create and design interfaces based on what consumers are currently excited about. what advice do you have for designers who are starting out to have a successful themes business? keep working on new themes and promoting high quality free themes. this will help you build a loyal following who will be looking out for your next designs. how has samsung helped your business? i became a samsung designer about six months ago and it’s been a great resource in my themes development. working with samsung gives me access to monthly reports that help me get a sense of what themes are popular with consumers, to help inform my future designs. so far things are going well, and i look forward to more ways to collaborate with samsung in the future. thanks to zhu guangxu for sharing his advice on theme design. be sure to follow us on @samsung_dev for more interviews with the best of 2018 winners coming out in the next couple of weeks. for now, you can find out more about the program in our samsung best of 2018 winners announced post.
Zhu Guangxu
events mobile, game
blogin april, samsung galaxy gamedev went to croatia for reboot develop blue. we sent two technical staff and an account manager for a whole host of activities, and i’ll admit that we looked at the event (which is new to us) as a rather speculative attempt to connect with game developers. after all, reboot previously had no technical track and has only been running for a handful of years; maybe it would turn out to be a non-event. but reboot managed to exceed all our expectations. we had approximately 60 seriously-interesting and highly-competent game developers in our sessions. alon or bach, who heads our vulkan standards effort, did a great job in a talk on advanced vulkan programming techniques, which are used in croteam’s serious engine for mobile. alon then went on to host a panel discussion on the merits of vulkan. this panel featured some lively and informative input from karlo jež from croteam, christian forfang from arm, and graham wihlidal from ea’s seed group. quiz time! watch the above video of alon presenting at reboot, then answer the following multiple-choice questions (scroll to the end of the blog the answers). 1. what is the most significant performance gain you can reasonably expect to see when you completely fix some badly-chosen pipeline barriers in a trivial vulkan app? a. 25% b. 50% c. 100% d. nothing, there’s no such thing as a badly-chosen pipeline barrier. 2. in general, what’s the preferred draw order for opaque geometry in vulkan? a. left to right b. right to left c. top to bottom d. bottom to top e. front to back f. back to front g. some other order that isn’t listed here. 3. in terms of texture formats, why is a “tiled” buffer generally preferred to a “linear” buffer? a. samsung’s tiling architectures store tiled buffers on chip. b. reducing power consumption is more important for mobile devices than protecting bandwidth. c. there’s a bug in the driver. d. ha! it’s a trick question! tiling isn’t preferred. e. texture fetches cooperate better with the cache that way. 4. to make sure you were paying attention -- and for two special bonus points -- what animal did alon reference in his talk, and why? on the account management side, david pither spent most of his meal and coffee breaks over the three days having enlightening conversations with both developers and publishers who might benefit from collaborating with samsung’s galaxy gamedev group. it was business networking at its best, and we came back with a long list of action items which has kept david busy for weeks. david also set up conversations with folks that we regularly work with like sega, croteam, and ea. it’s always good to keep in touch with the big boys of gaming. we now know more about their technology and publishing roadmaps, which means we now know more about how we can help. my trip home was a bit of a disappointment. getting home roughly 15 hours late isn’t high on my list of “fun ways to start a holiday,” but it certainly won’t stop me (and more importantly) samsung from going back next year. in fact, my enthusiasm levels for the reboot events are so high that we plan to attend the reboot develop red event in banff in october. and of course, we’ll be back in croatia next spring. hopefully, we’ll see you there as well! reboot blue, and reboot red – they’re both firmly in our calendar from here on. soon we’re going reboot purple. we’re adding a lot more technical info over the coming months, so make sure you revisit the blog soon to learn more about vulkan. in the meantime, to keep you going: a gentle intro: vulkan-tutorial.com/introduction a set of beginner's guides: khronos.org/blog/beginners-guide-to-vulkan getting in deep: khronos.org/developers/library/2019-vulkanised-is-back (.pdf format) youtube.com/user/khronosgroup (videos) jet set vulkan : reflecting on the move to vulkan quiz answers 1: c 2: e 3: e 4: a hedgehog – because alon’s fellow speaker’s name is “karlo jež” and jež is croatian for hedgehog!
Richard Huddy
announcement mobile
blogthe galaxy store developer api has launched! providing programmatic access to key functions of seller portal, the galaxy store developer api lets you manage your apps and in-app items or check app performance, without having to use the seller portal ui. the galaxy store developer api contains a set of server-to-server apis which provides access to different areas of seller portal: content publish api: view, modify, submit, and change the status of apps registered in galaxy store seller portal iap publish api: view, register, modify, and remove samsung in-app purchase (iap) items gss (galaxy store statistics) api: view statistics about apps registered in galaxy store content publish api use the content publish api to manage your apps registered in seller portal to: view a list of all of your registered apps view information about a single registered app, such as the title, status, description, binary information, and more modify app information, including images, icons, and binaries submit an app for review (an app must be reviewed before being offered for sale in galaxy store) change the status of a registered app to for_sale, suspended, or terminated upload files required when submitting or updating an app see content publish api for more information. iap publish api use the iap publish api to manage your in-app items of your registered apps in seller portal to: view information about in-app items for all of your registered apps view in-app item information for a single registered app, such as the title, status, description, price, and more register an in-app item modify an in-app item remove an in-app item see iap publish api for more information. gss api use the gss api to view statistics about your registered apps in seller portal to: view statistics for all of your registered apps, such as new downloads, downloads by devices, sales, and item sales view statistics about a single registered app, such as new downloads, sales, item purchases, average rating, ratings volume, item sales, item buyers, new item buyers, and arppu (average revenue per paying user) see gss metric api for more information about viewing statistics. get started are you ready to start using the galaxy store developer api? learn more about its requirements by going to the seller portal notice or galaxy store developer api. each api also includes examples showing usage and expected results.
success story uiux, design, mobile, marketplace
blogrecognized for “best creative app” in our best of galaxy store awards 2019 is concepts by tophatch. tophatch empowers creative people with design tools that simplify the creative process with smarter, more intuitive technology. david brittain, co-founder and ceo of tophatch, shares how concepts got started, what it takes to maintain your app’s performance, and tips on how indie designers can establish a successful app development business. tell us about concepts. concepts is an infinite creative workspace for visual thinkers, designers and illustrators. concepts is used by designers at companies like unity, illumination entertainment, hp, and disney globally to create and share everything from visual notes and storyboards to architectural layouts and product designs., we built concepts from the ground up for touch and stylus-based devices. when tablets first began to come out, we saw other apps were transplanting awkward desktop mechanics to mobile interfaces instead of writing for the new ecosystem. we saw that design on a mobile platform could be a lot more intuitive and fun and knew that much more was possible. we've been working on our vision for 7 years now, and our software, stylus, and device performance are so fluid that our designers prefer concepts over paper. how is the app used? concepts is a powerful creative tool that allows you to explore and communicate ideas with a quick, natural workflow. the app allows you to sketch, edit, and communicate your ideas with liquid, vector-based brushes, and precision tools. the infinite canvas lets you flow with your ideas as far as they’ll go, with fluid pens and brushes that come in designer copic colors. the app's customizable layout, easy-to-use layers, drag+drop imports, and precision grids help you sketch and design effortlessly. everything you draw is an editable vector that can be updated and moved around the canvas, saving you valuable work time.. concepts is used by creative professionals for note taking, mind mapping, drawing, storyboarding, graphic design, product iteration, interior design and architectural planning. what is concepts' development methodology? our development methodology is highly iterative. we take each feature through a complete design cycle. we focus on building one feature at a time, iterate until it’s clean and well developed, then ship a beta as quickly as we can to hear from our users. they are a fantastic group who give us insightful feedback, which we incorporate before releasing the final product. this means we're delivering releases every week on one platform or another. tell us about the tophatch team behind concepts. our company has been distributed globally from the very start - often called remote, but it works well for us. ben and i started the company and worked together on concepts for a year before meeting in-person. we embrace the benefits of a distributed team and avoid the downsides where we can. that means trusting each team member to get their work done and embracing asynchronous workflows. people in the team work the hours and days that work best for them and plan and schedule their work to minimize blocking dependencies on other people. was concepts designed for mobile phones or tablets? is there a difference? concepts is designed for tablet and stylus first, as the larger screen gives users the most space to sketch and think. when we brought it to android, we were likely the first major app built for chrome os first - it has a large screen, stylus, and resizable windows we wanted to make sure we supported well. we then made it work for phones, although our design did account for this up-front. it’s a challenge to offer the same tools and functionality on really small screens. ultimately, we have to bias our decisions to the devices our paying users care about the most, which are the ones that give them the most space to work. what’s your approach to user experience and design principles in app development? our general philosophy is that a good design interface allows creators to focus on what they want to get done. concepts is a creative app that helps you to work efficiently, so tools are simple, customizable, and only where you need them. if you forget you're using the app as you're "in the zone”, then we have achieved our goal. in concrete terms, this means minimizing the steps in a workflow, avoiding pop-ups and notifications that block progress, and allowing the user to customize layout and tools so the features they need are close at hand (or tap). another key principle for us is taking a humble position - we don't assume we have the right answers. we listen closely to what our customers want, we prototype features, get feedback, and then adapt. sometimes this is painful as it means starting again from scratch on a feature we've put weeks of effort into, but in the long run, it's the right choice. how have you maintained your app’s performance since launch? we focus on the long-term success and health of concepts. we are constantly looking at all aspects of the app's performance. how are we doing with downloads? how well do users convert to becoming paying users? how much time do they spend using the app? we then have to pick an area of focus and look at how to improve that area. roughly speaking, we tend to spend 3-6 months focusing on one area at a time, as we have found this level of commitment is needed to get results. it's often hard to move the needle unless you commit to a few cycles of changes - this way you can measure what you try, see the results, and adapt your approach. what advice do you have for indie developers and designers attempting to develop a successful app business? focus. that's the biggest competitive advantage you have. find your niche that the big companies are not paying attention to. build something amazing that is loved by your group of customers. and if your business model requires you making money, make sure you are asking for money from those customers from the very beginning. it's a very clear metric as to whether you are building something that meets a customer's needs. once you have conquered the niche, expand from there. what is next for concepts? our big focus over the coming months is cross-platform workflows. our goal is to make it easy to share and collaborate on content across android, windows, and ios. how has samsung helped your business? the number one way samsung helps is by producing so many amazing products that support a stylus. nine out of the top ten devices that use concepts on android are made by samsung! a high performance tablet that supports palm rejection and a stylus with pressure and tilt response is key to concepts being a great experience. with the best of galaxy store awards 2020 selections approaching mid-year, what tips do you have to stand out from the crowd? it's probably not what they want to hear, but i'd recommend not focusing on awards. focus on making your customers happy :) . we want to thank david for talking with us about tophatch’s award winning design tools, how concepts was developed and the importance of monitoring app performance and tips for indie developers interested in building a successful app business. if you’re on a samsung galaxy device, you can check out their app. follow us on twitter at @samsung_dev for more developer interviews as well as tips for building games, apps, and more for the galaxy store. find out more about our best of galaxy store awards.
Samsung Developers
Learn Developers Podcast
docseason 1, episode 1 previous episode | episode index | next episode this is a transcript of one episode of the samsung developers podcast, hosted by and produced by tony morelan a listing of all podcast transcripts can be found here host tony morelan senior developer evangelist, samsung developers instagram - twitter - linkedin guest jong woo samsung game services in this episode of pow, i interview jong woo, vice president of games services for samsung electronics in the u s jong’s got a great story not just what he is doing here at samsung related to the gaming industry, but his time before arriving at samsung where he helped take a little game offered on facebook to become one of the successful mobile games of all time, candy crush saga listen download this episode topics covered building games for galaxy store revenue sharing and monetization driving engagement with samsung game launcher gaming culture, past and present helping businesses grow with samsung next android developers transcript note transcripts are provided by an automated service and reviewed by the samsung developers web team inaccuracies from the transcription process do occur, so please refer to the audio if you are in doubt about the transcript tony morelan 00 02 hey, i'm tony morelan and this is pow! podcast of wisdom from the samsung developer program, where we talk about the latest tech new trends and give insight into all of the opportunities available for developers looking to create for samsung on today's show, i interviewed jong woo, vice president of game services for samsung electronics in the us, jong's got a great story, not just what he's doing here at samsung related to the gaming industry, but his time before arriving at samsung, where he helped take a little game offered on facebook to become one of the most successful mobile games of all time, candy crush saga so i'm going to start off with a real basic question who is jong woo? jong woo 00 47 i'm one of those lucky guys i'd say that gets to do professionally what i'm also very passionate about, personally, and that's gaming i am an avid gamer i love playing games all sorts of games from board games to console and pc games so you know, i've actually had the opportunity to work in the gaming industry for the past 15 plus years or so so most recently, i headed up business development and partnerships for king digital entertainment and i was actually kings first us based hire and they moved me from new york to california, back in 2011 and at that time, king was a web-based sort of casual game developer and they were looking to make the pivot into social and eventually mobile so i opened up their san francisco office and helped that helped the company pivot through from the web based into facebook initially, and then into mobile and it was a pretty fun and crazy time getting to bring candy crush saga to market launch that game and be a part of that games, explosive growth tony morelan 02 04 how many years were you at king? jong woo 02 06 so i was at king for almost three years and after that three-year period, i moved to head up business development and marketing for a game publisher called machine zone and at that time, machine zone had just launched a game called game of war and, you know, i watched that game climb the top grossing charts very quickly and this was at a time when, you know, people and pundits in the industry, were saying that, you know, mobile gamers in the west like in the united states, they said they will never gravitate towards hardcore mmo rpg games, right? if you looked at the top grossing charts on mobile during that time, it was casual games and social casino games, predominantly, and you know, everyone once said that these were these hardcore genres of gaming they were for, you know, the asian markets like the korea, china and japan but he was game of war sort of, you know, at least proving the look like they were proving the pundits wrong and so i had an opportunity to meet with the ceo of machines zone, got to understand, you know, what the company was about and, you know, made the determination for myself that this wasn't necessarily an exception to the rule but this was sort of a trend, a sort of a trend that was happening in the mobile gaming space and so i made the move from king to machine zone and yeah, got to really see firsthand what live operations really means for those gaming as a service, right, this type of live operations that typically you would see for sort of pc large pc mmo rpg games you were starting to see that sort of live operations machine being replicated on mobile and driving tremendous value and so you know, that's sort of, i was able to sort of witness sort of both ends of sort of the mobile gaming genre spectrum from sort of casual puzzle games, to really hardcore, massively multiplayer synchronous rpg games tony morelan 04 24 so we understand that, after those years working for two very influential gaming companies, that you then got out of the gaming space and actually got into the charitable space jong woo 04 37 that's right the charitable project was sort of a passion project of mine and about around 2017 you know, i came to the realization that the mobile gaming landscape was changing, and not necessarily changing for the better, right? i think less than less people were organically going into the app stores right like, we don't go to the app store's just to go in and see what's new that week anymore right? that was a, a large, a very big phenomenon when, you know smart form smartphone adoption was still sort of, you know, hockey sticking, right? you got a new iphone or a new android device, and you wanted to go into the app stores and see what cool new apps were there but nowadays, you know, even when we upgrade our smartphones, we just back up and, and restore, right, and we're not going into these app stores anymore and we have sort of the seven or eight apps that we have just sort of so much integrated into our life, that we're not really looking to expand beyond those services or games, right and because of that, you know, you start to see discoverability die with regards to games you know, the viral hooks that helped games like candy crush saga scale massively they were being replaced by you know, some ad tech and this ad mobile advertising ecosystem and so in order for you to critically build a massive players, you needed a massive war chest of marketing funds, and the most successful games in mobile gaming were not necessarily the most innovative or even the most fun, right? they were the ones that had, you know, a marketing plan and a marketing budget to go and execute scale and so you got this weird split in the industry, you got hyper casual, which was sort of a genre that got introduced in the midst of sort of this landscape shift and so you're talking about low risk, low cost games really designed to retain users for minutes and not days or months anymore and you know, it was quick revenue you, you got somebody to play a game for 10 minutes, and in that 10 minutes, you showed them 20 ads, and then if they deleted your app, that's okay there was always another one waiting in the wings and then the other side of that spectrum, you got, you know, games that were getting super aggressive with monetization practices where, you know, free to play started to feel more like play, pay to win you know, and, you know, i can understand why these game publishers are adopting these more aggressive monetization practices, because they had to keep up with the rising costs of the marketing, you know, in order to sort of continue scaling and so that was the time when i decided maybe it was a time for a change for me and i left the gaming industry and started a charitable giving app and right around the time i was adopting this idea, fintech was booming there were companies and mobile applications trying to help people do everything related to their finances, right like from saving to investing, budgeting, like you got venmo and peer to peer payments, but i didn't see anyone really thinking about utilizing the fintech infrastructure and the tools to help people give back and you know, particularly for millennials, who are the most socially conscious generation right now, this was something that they have always said is super important to them right? when they think about what companies they want to work for, they think about sort of the social responsibility of these companies, right, they have causes that they care very passionate about and the disconnect that i saw in the marketplace was that charitable organizations had a hard time sort of marketing and soliciting funds from millennials because the truth be told, like the roi wasn't necessarily positive, right? it's much easier to continue hitting up the sort of the older generation, the 50 pluses who will attend your gallows and you know, right there sort of like annual giving checks to you, right so that's, that's the way tribal organizations are marketing and so those sort of this disconnect that i was hoping to bridge with, with this initiative, that i that i had started post machines tony morelan 09 03 so from there, though you then decide to get back into gaming that's right it's about that time that i understand someone from samsung then reached out to you to try and get you to come join join the folks over here is that correct? jong woo 09 17 that's right so like samsung had reached out probably, you know, five, six years ago, when i was still starting out at machines or, you know, they were, they've been looking to build out a gaming business pretty early on, i think and at that time, i had always told the hr recruiter person from samsung, no, i'm good, i'm good and most recently into that in early 2019 this person had reached back out to me right around the time of gdc, which is the game developers conference in san francisco, asking if i would meet him for a cup of coffee and so i went and met with him and he told me about what samsung was thinking about with regards to gaming and building a services business around gaming and so, you know, in, i agreed at that time to continue the discussion and this was sort of in now this landscape where, you know, games like fortnight had launched right, and fortnight was sort of this new the embodiment of this new genre of game, right, that wasn't monetizing from a pay to win standpoint anymore, right? like, there is nothing inside a game like fortnight that you can pay for that helps you play that game better, right? it was purely sort of cosmetics inside that game and then, you know, fortnight crafted a partnership or epic games that developed the publisher of fortnight crafted a partnership with samsung and samsung's galaxy store was sort of the exclusive android app store distributing fortnight on mobile right and so this made me think maybe there's an opportunity here for me to come in and help samsung really grow a gaming ecosystem because samsung has tried and there has been a lot of stops and starts here but i think, you know, the i felt like the timing for this was not right, where samsung could really become a meaningful player in the gaming space tony morelan 11 37 so, as the vp of game services for samsung, tell me exactly what does that cover for samsung? jong woo 11 44 sure game services covers the galaxy store and game launcher within our mobile device ecosystem tony morelan 11 52 so tell me why is it beneficial for developers to build for galaxy store when really, they could just have their apps available? on the google play store? jong woo 12 02 yeah, that's a great question and the question that, you know, we get from all the developers that we talk to right and, you know, we certainly don't believe that it's necessarily an either-or situation, right? you know, but what we want to do is we want to provide developers a story ecosystem that allows for better discoverability, right? we want to sort of create an ecosystem that is curated for the best in class games the google play store is generally bloated with a lot of content and for an individual developer, particularly a game developer to get noticed within this ecosystem is nearly impossible right? and, you know, like we mentioned, people just aren't going in looking for new content on their own anyways, like most of that traffic, going into the google play store, is being driven through paid media from you know, facebook ads or what have you, right so we wanted to build a thriving ecosystem inside the galaxy store that isn't bloated with content that is really curated for the best in class the galaxy store is one part of the samsung mobile ecosystem, right that it also includes things like samsung pay and samsung daily there is a, there's a whole suite of owned and operated services within your galaxy device that has a lot of users, right and a lot of engaged, people are opting in into these services on a regular basis and so, you know, our ecosystem is really designed very well to drive discoverability of new content within our ecosystem and we sort of share that inventory across all our owned and operated properties and so this really strong value proposition that i think the value the galaxy store brings to game publishers is that we are able to augment the marketing initiatives that they are doing with some of these discoverability mechanisms and channels and because we also work with fewer game developers, because it is sort of a curated game store we get to build relationships with these developers and work closely with them to craft promotions and marketing initiatives on a regular cadence right? we're and we're, as part of that we're able to also activate a myriad of other businesses within the samsung ecosystem, from samsung members and rewards, as well as our device marketing initiatives to really help drive game awareness, engagement and monetization for our game publishing partners tony morelan 14 35 and i'm sure developers want to hear about the revenue sharing can you share a little bit about the revenue share model and why it's unique to samsung? jong woo 14 42 yeah, so i mean, i think, you know, obviously, the revenue share for you know, app stores generally you know, we talked about 7030 now, i think tim sweeney from epic games has very publicly said that, you know, the revenue shares for these app stores should not be 7030 and i think the entire sort of development developer ecosystem has responded, well, initially, it was wait can we really say that? and then sort of quickly followed by? yeah, i think that's true right and i think, you know, samsung has is in a position where we can be flexible with our revenue shares, we can work closely with our publishing partners to determine the revenue shares that will allow them to really thrive within our ecosystem, right and build businesses that are sustainable within our store platform so there is a want on our side to work closely with our game publishing partners to determine what the right revenue share is going to be, you know, given their marketing activities and given the engagement of our audience to those games that's going to allow both the platform as well as the game and the publishers to really grow and thrive tony morelan 16 07 so you had mentioned that game services also covers game launcher? can you explain what is game launcher? and why is it? why is it so special? sure jong woo 16 15 so game launcher was initially designed to help mobile gamers aggregate their game icons into like a single location so it's sort of like this really nice game folder, if you will and the utility of that was that it really decluttered your home screen and so you can imagine sort of the level of engagement with this app, right? the average game launcher, user opens game launcher more than 80 times a month and so that's like, nearly three times a day, right? so definitely high engagement and what's really sort of special about game launcher is that this is now a property that people are opting into or sort of launching on their own voluntarily, multiple times a day so we've got this really deep engagement here but that engagement right now, or the utility of that engagement really centers around sort of getting access to the games you want to play and so we want to expand the utility of game launcher to drive deeper engagement within this ecosystem around gaming right? and we believe that there is more than just playing games that you know, avid gamers do, right? they are engaging, and in communities, they are watching other gamers play via livestream they are checking out youtube videos to get tips and tricks they are, you know, reading about games, through a myriad of different publications and content sources they are, you know, on reddit communities, they are on discord like there is this whole ecosystem of games outside of the game itself, right and so you know, what, we're looking to do with game launcher and truly make it special and unique is because start to become a hub for all of that gaming activity outside of actually playing the game tony morelan 18 12 i want to kind of circle back to something you'd mentioned earlier and you were talking about how monetization you know, there's some drawbacks to that tell me about like, creativity wise, do you see that it's limiting people's, you know, developers ability to create, you know, unique games? jong woo 18 26 i do at the end of the day, you know, when you are, you know, starting out as a game developer and build, you know, you make a decision to build a game company, right? you are looking to find that balance between doing something creative and innovative right as and also generating revenue from it to sustain your business but i think when costs of scaling and marketing your game are driven by the market from you know, real time bidding and programmatic, sort of ecosystems on the mobile advertising side and then the revenue shares remain at 7030 there's sort of a squeezing of margins, that's tends to happen, right? in order to maximize that equation, or optimize that equation, you need to start getting more aggressive with monetization right? and when you start getting aggressive with monetization, you start to lose i think, the creativity inside your game when you have to start focusing on how do i ensure that i can scale up this game and really focus on the revenue you realize you need to take less risk, right building a game they say is sort of a hit driven business, you know, very much like hollywood studios and moviemaking and to a certain extent, i think that is true and so you know, when you are in a situation where the costs of marketing your game are so high and you know what kind of critical mass you need to really scale your game from a player's perspective, taking a lot of risks in terms of pushing the envelope for innovation, it becomes prohibitively expensive, right? because there is a likelihood that the game might completely flop and so that's why, you know, our hope with the galaxy store and the samsung gaming ecosystem is that we can provide a value proposition back to the, to the developers and whether that be in sort of, you know, better marketing, through our discoverability channels that is designed to help augment whatever marketing you know, these publishers are trying to do, as well as you know, potentially better revenue share on the back end we can we can start to unshackle the shackles if you will, of sort of this this business machine and allow people sort of the flexibility and the breathing room to be more creative with their game design, and their gameplay tony morelan 21 03 so you had talked a little bit about gaming culture, and you know, knowing that you've been in this industry for so many years, i'm sure you've seen that culture change and evolve tell me a bit about like, what was the culture when gaming first started, you know, started coming onto the scene here, and then how it's evolving and where it's going jong woo 21 20 yeah it's been a really interesting shift from sort of this underground basement, sort of nerdy boys only kind of sort of culture phenomenon, right where there was also sort of a stigma around gaming being sort of like that good for you you know, like, nothing beneficial really comes from it you know, some people have even said, you know, i've tried to try to tie gaming into sort of, like, you know, real world phenomenons like gun violence or whatever it is, right, like, people have tried to put gaming and sort of there's negative light and it's now become sort of this aspirational lifestyle and oh, and it's expanding beyond the actual games themselves, right? like you are now starting to see personalities, people, you know, almost celebrities coming from sort of this gaming world and you're seeing things like esports and live streaming they they've moved from this sort of niche underground thing into sort of full mainstream pop culture legitimacy, right? you're seeing content creators from twitch or youtube are esports athletes becoming these celebrities with these massive fan bases who are extending beyond just you know, their gameplay it's going into you know, instagram and it's going into twitter, and twitch and youtube and these people are becoming full blown influencers and celebrities right a lot of them even have hollywood agents, right? who are negotiating, you know, variety of different deals on their behalf so with this, you're starting to now see sort of fashion and lifestyle also being heavily influenced by this gaming culture and a massive group of young gen z gamers and even non-gamers who are aspiring to this lifestyle right and i kind of equated to the skateboarding culture where skateboarding used to be very underground, right? and very niche and then it sort of translates now into this mainstream cultural phenomenon where it's very sort of equivalent to it like street wear, where people wear vans, and you know, wait in line for hours for you know, drops from supreme and they've never owned a skateboard in their lives it's fair right, so yeah, so you know, i think it's and i think the social distancing sort of environment that we are in now is only sort of like accelerating this change, right, like gaming, and socially hanging out and sort of like an online environment is, is sort of feeding more into this culture and, and breeding more legitimacy into it and it's sort of, frankly, it's really exciting to see tony morelan 24 26 yeah, definitely i mean, my son's a big-time fortnight player, and some of his best friends he's never met i mean, they live in hawaii, canada, germany i mean, it is really neat that he's got this this social group that really spans the globe, that you know, truly are some of his best friends jong woo 24 44 that's right and i think you know, and the same as it has been for me as well in the past, right, like there are people like when you play a game every day, you engage with the same people, whether they're in your guild or your clan or you know, your squad you engage with these people that you've met actually inside the game on a regular basis right on nearly daily and oftentimes spending hours with them, you probably spend more time with these friends that you've never met in real life before, then you do your actual friends right? and so yeah, it builds this sort of, like new network, as well as this sort of new definition of i think what friends can be and it's really cool i think that they all get to socially hang out inside of these games, right? like, you could be playing fortnight with your squad and it's not necessarily about you know, getting that victory royale and winning, right? it's just sort of about doing this really fun activity together, chatting and hanging out while you do it and so i think i love the idea of games becoming now this sort of like social platform for hanging out tony morelan 25 52 so tell me in what way is samsung moving beyond the galaxy store and game launcher on mobile devices? jong woo 25 57 yeah but there are a lot of initiatives from the services standpoint around gaming beyond the galaxy store, but it's still relatively early days right now, for example, we are thinking about, like, what is the leanback gaming content look like, given that there's so much viewership on twitch, you know, particularly with sort of social distancing and covid these days now, most of gaming tends to be lean in where you're sort of like engaging with this content interactively but you know, twitch is now demonstrating that there is this massive and captive audience who is willing to sort of lean back and just watch other people play games and so what does that necessarily mean? and how does that translate into, let's say, tv screens? you know, does that mean that, you know, people are willing to do this in their living room, as opposed to sort of like on you know, laptop screens and i think we also sort of think about how samsung can stay ahead of the curve with regards to upcoming gaming trends that we're starting to see, right and, you know, i personally am trying to figure out how samsung can lead the charge in things like cloud gaming, or vr and ar, right these, these technologies and these platforms that are around and people have talked about some for many, many years, but haven't really gotten into sort of like mass scale yet so you know, we're definitely thinking about a lot of these things right now tony morelan 27 34 so i want to talk a little bit about samsung next so samsung, next is a division here at samsung that helps build and grow software and services from entrepreneurs and organizations that complement samsung's hardware tell me how they're getting involved with game services jong woo 27 49 so we work closely with samsung next so samsung, as you mentioned, is sort of that early stage venture arm of samsung and part of their remit is to invest and build sort of early and growth stage startups that can complement samsung's existing business initiatives or actually even jumpstart completely new strategic initiatives that, you know, we, as a company decide to expand into and i think sort of given the strategic priority that gaming, from a service standpoint, has within the entire organization of samsung, and it's not just the mobile, right you know, the visual display division, the pc divisions, you know, the r&d and hardware division, there's a lot of different potential stakeholders are who are very interested in and gaming, what gaming can look like for samsung and so, you know, we engaged really closely with samsung next, to figure out what kind of companies are doing really innovative things in the gaming space that might help us jumpstart some of these gaming initiatives, particularly around you know, some of the things that i just mentioned before cloud gaming ar vr ar, you know, as well as you know, complementing existing businesses like the galaxy store, you know, we, we, i try to work with samsung next to identify those needs that we might have as we think about the strategy of go to market for some of these various initiatives and then samsung next also helps us to better understand sort of the landscape of early stage companies and the really cool, innovative things that they're working on tony morelan 29 28 so what advice do you have for gaming companies looking to build a relationship with samson? jong woo 29 32 yeah, you know, i would say, definitely reach out to us we do want to know what you're building and the more innovative the better right the galaxy store and the gaming ecosystem that we are striving to build we are building it because we want to foster innovation, right? and, and so you know, we want games that can push the envelope of gaming on mobile devices can be we want companies to be thinking about you unique technologies, you know, housed inside of our devices like 5g and edge computing, and what can that enable from a gameplay standpoint? and so, you know, we love seeing what the development community comes up with and so, you know, definitely, i would say, reach out to us and you can reach out to us through our website, which is developer samsung com tony morelan 30 22 excellent well, hey, jong, i want to thank you very much for taking the time to join me on this podcast it was a lot of fun to chat and get to know you yeah thanks a lot outro 30 29 looking to start creating for samsung, download the latest tools to code your next app, or get software for designing apps without coding at all sell your apps to the world on the samsung galaxy store check out developer samsung com today and start your journey with samsung the pow! podcast is brought to you by the samsung developer program and produced by tony morelan
Develop Smart TV
docsamsung checkout this topic describes how you can develop a billing system for your tizen net tv application, to allow users to make purchases within your application related info tizen tv service billing namespace samsung checkout dpi portal guide samsung checkout for web applications samsung checkout dpi portal samples samsung checkout net application samsung checkout web application samsung checkout offers an optimized purchase experience for your users on samsung tvs the user can quickly and safely register a payment method and make frictionless payments repeatedly within the tv environment in addition, samsung checkout provides a comprehensive global monetization platform, which allows you to integrate various business models and promotional campaigns into your services the tv-optimized purchase experience provides the user a quick and simple 3-step checkout, once a payment method is registered the checkout requires only number-centric information to be entered, making it easy to use with a tv remote control users can register their payment method directly on the tv or through a mobile phone to use samsung checkout within your net application, the user needs tv samsung smart tv, 2018 or later model payment method credit or debit card, paypal, or samsung pay in korea security tizen secureime, 2nd-screen card registration mobile or pc account samsung account for sharing account and payment information with galaxy phones importanta samsung account is mandatory for using samsung checkout samsung checkout assumes that the user is logged in to samsung account at all times you can manage your product application and product sales through the dpi digital product inventory and process the actual purchase through samsung checkout importantall application data that is saved locally on a tv is deleted when the application is deleted from that tv if the user's purchase history is saved only in the tv storage and not remotely, and the user deletes and reinstalls the application, all application settings and content are removed, including purchased content if your application saves purchase information in the tv storage only, inform the user that uninstalling the application deletes their purchased content the dpi portal provides functions, such as "purchase history unapply" and "refund", to help you address situations when your customer inadvertently deletes application data before proceeding with the unapply and refund processes, you must contact a samsung representative by going to "samsung apps tv seller office > support" and creating a "1 1 q&a" support ticket samsung checkout purchase process when a user wants to purchase a product on your application, samsung checkout provides a common purchase gui, which identifies the user and confirms first the purchase and then the purchase completion after the user completes the purchase, samsung checkout returns the purchase result to your application product, purchase, and payment management the following figure illustrates how you can use samsung checkout and the information in the dpi server to manage in-app purchases and payments in your application request the purchase list retrieve the customer purchase list using a purchase list api request respond to the purchase list content if there are products in the purchase list which are not applied, verify the purchase and apply the products if there are products in the purchase list which have been refunded, retrieve the products send the application result to the server request the product list request the product information list using a products list api request the user purchases the product when the user selects “buy” in the application, provide a common purchase gui through samsung checkout the user can enter a voucher or coupon code to modify the purchase price the user confirms the purchase by entering a pin on the common purchase gui, or biometric information on samsung pay samsung checkout delivers the purchase result to your application request the purchase list update the customer purchase list verify the purchase verify the purchase using a verify purchase api request apply the product apply the product using an apply product api request, and send the application result to the server dpi service environment the dpi service provides information on buyable products in your application and the purchase history of your customers it serves the appropriate product information for the user's country, provides user-specific purchase information, and manages applying the product after purchase the dpi service also assures purchase integrity and provides security through preventing fraudulent access the dpi service environment is divided into 2 separate zones operating zone prd for live production applications when you submit your application for publishing, set it to use the operating zone notewhen a refund of a real payment is made in the operating zone, a charge is applied on you consequently, do not use the operating zone for testing staging zone dev for development and testing the purpose of the staging zone is to facilitate the billing linkage development this environment minimizes the exceptional country-specific cases that can happen when real payments are made in the operating zone the staging zone also includes a dummy payment testing option, where the user does not need to register any payment method, but can still use all the dpi services as in real payment transactions dummy payment actual payment table 1 dummy and actual payment screens the following figure illustrates the dpi service environments implementation information for each dpi service environment is described in the following table service environment details operating zone environment web portal https //dpi samsungcheckout com/ example billingrequestservertype servertype = billingrequestservertype prd; string securitykey = "*****"; // your security key issued by dpi portal // can be different from sandbox's ssecurity key staging zone environment web portal https //sbox-dpi samsungcheckout com/ example billingrequestservertype servertype = billingrequestservertype dev; string securitykey = "*****"; // your security key issued by dpi portal staging zone with dummy payment environment web portal https //sbox-dpi samsungcheckout com/ example billingrequestservertype servertype = billingrequestservertype dummy; string securitykey = "*****"; // your security key issued by dpi portal table 2 dpi service environment details when you submit your application for publishing, make sure that it has been fully integrated with the billing system ensure that the application detects the service environment and sets the server type accordingly check that the product and price information in the operating zone prd matches the tested information in the staging zone dev no data is automatically shared between the zones registering a test user payment method when the user registers their credit card as a payment method in samsung checkout, they can do it through their mobile phone or computer web site by entering the authentication code when you are creating a test user for your application, pay attention to the url you use to enter your authentication code and register a payment method each url requests a different server to handle the payment operating zone prd https //www samsungcheckout com or http //www payon tv staging zone dev https //sbox samsungcheckout com or http //sbox payon tv
Develop Samsung IAP
docmanage subscription price change after your app and subscription are for sale in galaxy store, if you have a manager account with the "applications manager" authority or are the owner of the seller portal account where the app is registered, you can increase or decrease the regular subscription price the subscription price can be updated by country, for one or more countries for example, if the exchange rate for a currency changes, you can update the price of a subscription for each country that uses that currency the subscription price can be set in usd and each country’s currency topics covered in this page include how to change a subscription price subsequent price changes how to view subscription price changes how to adjust an existing subscription price change how to cancel a subscription price change how to change a subscription price for information on how to change a price for a non-subscription product, refer to management of in-app products log in to seller portal, go to the apps page, and select the app which has the subscription for which you want to update the price from the app details page, click the in app purchase tab select the subscription whose price you want to update from the subscription page, click edit select the price tab and click set new price to set the price for all countries, select the all countries checkbox, enter a new price to change the price for all countries, and click apply or, to set a new price for individual countries, select the countries and enter a new price you can also filter the countries displayed by region using the region filter buttons near the top of the page verify the countries for which you are updating the price click save to confirm that you want to update the prices if you are increasing the subscription price, select the checkbox if you want to apply the price increase to new subscribers only or unselect the checkbox if you want to apply the price increase to new subscribers and existing subscribers then, click ok click save at the bottom of the edit subscription page after you save your updates, there is a seven 7 day waiting period before the new price is applied during this 7-day waiting period, you can adjust or cancel these updates subsequent price changes after the 7-day waiting period, when the price update is applied in galaxy store, you cannot change the price of the subscription in the same country again until a specific amount of time after the pre-notification period has ended for all existing subscribers that is, the updated price must have been applied to all existing subscribers in all countries the amount of time to wait after the pre-notification period has ended for all existing subscribers is based on the length of the subscription period the end of the pre-notification period for an existing subscriber is defined in one of two ways the pre-notification period ends when the existing subscriber has acknowledged the price increase notification the existing subscriber must have consented to or rejected the price change from the consent page or, if the existing subscriber ignores the notifications they neither consent to nor reject the price increase from the consent page , the pre-notification period ends when the existing subscriber's subscription ends the following table describes the amount of time you must wait before you can update the price of a subscription again the minimum pre-notification period is listed for your convenience, but the actual wait time is likely to be longer see pre-notification period for more information subscription period minimumpre-notification period before renewal date wait time to update price again weekly 2 weeks end of 7-day waiting period + minimum pre-notification period + 7 days monthly 1 month end of 7-day waiting period + minimum pre-notification period + 1 month 3 months 2 months end of 7-day waiting period + minimum pre-notification period + 3 months 6 months 2 months end of 7-day waiting period + minimum pre-notification period + 3 months annual 2 months end of 7-day waiting period + minimum pre-notification period + 3 months if a country is not selectable, it means that the pre-notification period has not ended for all existing subscribers in that country when the pre-notification period has ended for all existing subscribers, the country can be selected for another price increase how to view subscription price changes if you need to review previous prices changes or determine the next step after making an accidental price change, you can view when a price was updated, when the price change was applied to the subscription, and the region in which the price change was made to view price change information for a subscription log in to seller portal, go to the apps page, and select the app which has the subscription for which you want to view price changes from the app details page, click the in app purchase tab select the subscription for which you want to view all price updates from the edit subscription page, click here the price change history page displays all price updates by date you can specify a date range to filter the dates that are displayed when a specific date is expanded, the countries that were updated are displayed, along with the old and new subscription price, and if consent is required you can filter this list by region and consent requirement click back to exit this page how to adjust an existing subscription price change if it has been less than seven days after you have initially updated the price of a subscription in seller portal if you have updated the price more than once, this is the first time you updated the price in seller portal , you can edit the price changes after seven days after you have initially updated a subscription in seller portal , you cannot make any additional changes to adjust an existing subscription price change log in to seller portal, go to the apps page, and select the app which has the subscription for which you want to update the price from the app details page, click the in app purchase tab select the subscription for which you want to view all price updates from the item details page, click here from the price change history page, if not already expanded, click on the date to view the list of countries whose price has been updated and for which you want to change the price updates click edit update the list and click next verify the countries for which you are updating the price if you are increasing the subscription price, select the checkbox if you want to apply the price increase to new subscribers only or unselect the checkbox if you want to apply the price increase to new subscribers and existing subscribers then, click save click save at the bottom of the item details page notethe window of time for adjusting the subscription price change is not changed if you make edits to an existing set of price changes, the window of time to be able to make adjustments is not reset for example, if there are three days left in the 7-day waiting period, after you make your adjustments, the waiting period remains at three days it does not reset to seven days how to cancel a subscription price change if it has been less than seven days after you have initially updated the subscription prices in seller portal if you have updated the price more than once, this is the first time you updated the price in seller portal , you can cancel the update after seven days after you have initially updated a subscription in seller portal , you cannot cancel the update log in to seller portal, go to the apps page, and select the app which has the subscription for which you want to cancel the updated the price from the app details page, click the in app purchase tab select the subscription for which you want to view all price updates from the item details page, click here from the price change history page, if not already expanded, click on the date to view the list of countries whose price has been updated and for which you want to cancel the price updates click cancel settings click yes to cancel this set of subscription price updates if you cancel a subscription price increase but a subscription was purchased by a new subscriber at the increased price, the new subscriber continues to pay the increased price until they cancel the subscription
We use cookies to improve your experience on our website and to show you relevant advertising. Manage you settings for our cookies below.
These cookies are essential as they enable you to move around the website. This category cannot be disabled.
These cookies collect information about how you use our website. for example which pages you visit most often. All information these cookies collect is used to improve how the website works.
These cookies allow our website to remember choices you make (such as your user name, language or the region your are in) and tailor the website to provide enhanced features and content for you.
You have successfully updated your cookie preferences.