Filter
-
Content Type
-
Category
Mobile/Wearable
Visual Display
Digital Appliance
Platform
Recommendations
Filter
tutorials mobile
bloggift cards and loyalty cards, for your service and issue them to users who can add them to the samsung wallet application on their device. samsung wallet cards are signed with the rs256 asymmetric algorithm. the rs256 signing algorithm requires a private key, which is a personal credential that must never be shared in the application. consequently, a separate server application is needed to store the key and sign the wallet card data (cdata). when the user taps the "add to samsung wallet" button in the application, the server application creates and signs the wallet card data, then returns a jwt token that is used to add the wallet card to the user's samsung wallet application. figure 1: "add to wallet" flow this tutorial uses kotlin to demonstrate how to implement the "add to wallet" feature in an android mobile application that adds movie tickets to samsung wallet. it also shows how to generate the wallet cards using a spring boot server. you can follow along with the tutorial by downloading the sample code files. develop the mobile application to implement the "add to wallet" button in the mobile application, you must configure the application, implement the application ui, and define the application logic for the button. configuring the mobile application project create an application project and configure it to connect to and communicate with the server through rest api requests: in android studio, create a new project. to implement rest api support in the application, add the following retrofit library dependencies to the application's "build.gradle" file: 'com.squareup.retrofit2:retrofit:2.11.0' 'com.squareup.retrofit2:converter-gson: 2.11.0' to enable communication with the server, add the following permissions to the "androidmanifest.xml" file: <uses-permission android:name="android.permission.internet"/> <uses-permission android:name="android.permission.access_network_state"/> <uses-permission android:name="android.permission.access_wifi_state"/> to enable testing with a local non-https server, add the following attribute to the "application" element in the "androidmanifest.xml" file: android:usescleartexttraffic="true" implementing the application ui the application ui consists of two screens: the movie tickets list and a ticket detail page. in the application code, define a movie data class that contains details for the movie tickets that can be added to samsung wallet. data class movie( val name:string, val studio:string, val ticketnumber:string, ) create a recyclerview that displays the list of movie tickets as buttons on the main screen. each button has a listener that opens the detail page for the ticket. you can study the implementation details in the sample code. to check whether the device supports samsung wallet, send an http get request to the following endpoint, where build.model is the model of the device: https://api-us3.mpay.samsung.com/wallet/cmn/v2.0/device/available?servicetype=wallet&modelname=${build.model} create the ticket detail page layout in the "activity_movie_detail.xml" file. the "add to wallet" button is implemented on this page. figure 2: detail page layout implement the ticket detail page functionality in the moviedetailactivity activity class in the application code. for this demonstration, the movie ticket data is predefined in the application code. in a real application, the data is usually retrieved in real time from an external database. val movielists = listof<movie>( movie("the wallet", "samsung studios", "a-01"), movie("crying sea", "laplace studio","h-07"), movie("canoe", "terra productions", "r-03") ) val position:int = intent.getintextra("movieposition", 0) val movie:movie = movielists[position] binding.mvnametext.text = movie.name binding.mvstudiotext.text = movie.studio binding.mvticketnumber.text = "ticket: ${movie.ticketnumber}" binding.addtowalletbutton.setonclicklistener { // request server to generate card data // retrieve signed card data from server // add card to samsung wallet application } when the user taps the "add to wallet" button, onclicklistener() is triggered. its functionality is defined later in this tutorial. connecting to the server to communicate with the server: in the tokenresponse class, define the structure of the json response to be received from the server. the status field indicates whether the token generation request was successful, and the jwt field contains the generated cdata in the form of a jwt token. data class tokenresponse( val status: string, val jwt:string ) in the "apiclient.kt" file, define a retrofitclient object that is used to establish the connection with the server. define the apiinterface interface, which defines the api request and response: the api endpoint url is base_url/movie/{id}, where {id} is the movie ticket id to be added the expected response from the endpoint is a tokenresponse object. define an apiclient object that extends apiinterface and creates a retrofitclient instance to establish the server connection. object retrofitclient { private const val base_url = "http://192.xxx.xxx.xxx:8080" // define your server url val retrofit: retrofit by lazy { retrofit.builder() .baseurl(base_url) .addconverterfactory(gsonconverterfactory.create()) .build() } } interface apiinterface { @get("/movie/{id}") suspend fun getmovie(@path("id") movieid:int): response<tokenresponse> } object apiclient { val apiservice: apiinterface by lazy { retrofitclient.retrofit.create(apiinterface::class.java) } } adding card data to samsung wallet to request cdata generation from the server and add the wallet card to samsung wallet: in the addtowalletbutton.setonclicklistener() method within the moviedetailactivity class, send a request to the server to generate cdata for the selected movie ticket. if cdata generation is successful, to add the movie ticket to samsung wallet, send an http request containing the cdata token to the following endpoint url: https://a.swallet.link/atw/v1/{card id}#clip?cdata={cdata token} for more information about this endpoint, see data transmit link. binding.addtowalletbutton.setonclicklistener { coroutinescope(dispatchers.main).launch { val response = apiclient.apiservice.getmovie(position) if(response.issuccessful && response.body()!=null){ startactivity(intent( intent.action_view, uri.parse("http://a.swallet.link/atw/v1/3aabbccddee00#clip?cdata=${response.body()!!.jwt}"))) // replace '3aabbccddee00' part with your card id } } } notethe generated cdata is valid for 30 seconds, so it is recommended to generate the cdata only when the "add to samsung wallet" button is clicked. if the cdata has expired by the time the token is sent to samsung wallet, the user can receive a "request timed out" error. generate signed wallet card data the server application must be configured to receive the card data request from the mobile application and return a signed jwt token. this part of the tutorial uses the spring boot framework. configuring the server project to create and configure a server application to generate and sign wallet card data: in the spring initializr tool or any supported java ide, create a spring boot project and open the sample code. to configure the server to receive rest api requests from the mobile application, add the "spring web" dependency to the project. define a token data class. make sure it has the same attributes as the tokenresponse data class defined in the mobile application. data class token(val status:string, val jwt:string initialize a tokencontroller class that receives the incoming requests and returns a token object in response. @restcontroller @requestmapping("movie") class tokencontroller { @getmapping(path = ["/{movieid}"]) fun getmovie(@pathvariable movieid:int): token { return token("success", "{dummy_cdata}") // cdata generation logic } } the cdata generation and signing logic is described in the next section. implementing card data signing logic for easier understanding, this section describes a simplified implementation of the cdata generation sample code. in the server application project, copy the following credential files to the "sample/securities/" directory. samsung public key from the samsung certificate ("samsung.crt") partner public key from your partner certificate ("partner.crt") partner private key from the private key file ("partner.key") to handle the certificate files and signing algorithms, add the following dependencies to the server application's "build.gradle" file: implementation 'com.nimbusds:nimbus-jose-jwt:9.37.3' implementation 'org.bouncycastle:bcprov-jdk18on:1.77' in a new "jwtgen.kt" file, define a readcertificate() method that reads the public keys from the certificates and a readprivatekey() method that reads the private key from the key file. private val partner_id = "4048012345678912345" // replace with your partner id private val samsungpublickey = readcertificate(getstringfromfile("sample/securities/samsung.crt")) private val partnerpublickey = readcertificate(getstringfromfile("sample/securities/partner.crt")) private val partnerprivatekey = readprivatekey(getstringfromfile("sample/securities/partner.key")) fun readprivatekey(key: string): privatekey { val keybyte = readkeybyte(key) lateinit var privatekey: privatekey val pkcs8spec = pkcs8encodedkeyspec(keybyte) try { val kf = keyfactory.getinstance("rsa") privatekey = kf.generateprivate(pkcs8spec) } catch (e: invalidkeyspecexception) { e.printstacktrace() } catch (e: nosuchalgorithmexception) { e.printstacktrace() } return privatekey } fun readcertificate(cert: string): publickey { lateinit var certificate: certificate val keybyte = readkeybyte(cert) val `is`: inputstream = bytearrayinputstream(keybyte) try { val cf = certificatefactory.getinstance("x.509") certificate = cf.generatecertificate(`is`) } catch (e: certificateexception) { e.printstacktrace() } return certificate.publickey } private fun readkeybyte(key: string): bytearray { val keybyte: bytearray val bais = bytearrayinputstream(key.tobytearray(standardcharsets.utf_8)) val reader: reader = inputstreamreader(bais, standardcharsets.utf_8) val pemreader = pemreader(reader) var pemobject: pemobject? = null try { pemobject = pemreader.readpemobject() } catch (e: ioexception) { e.printstacktrace() } keybyte = if (pemobject == null) { base64.getdecoder().decode(key) } else { pemobject.content } return keybyte } fun getstringfromfile(path: string?): string { try { val file = file(objects.requirenonnull(classloader.getsystemclassloader().getresource(path)).file) return string(files.readallbytes(file.topath())) } catch (e: ioexception) { throw runtimeexception(e) } } generating card data cdata token generation is implemented in the "jwtgen.kt" file: read the file containing raw json data that defines the ticket data structure. for this demonstration, use the "ticket.json" file in the "sample/payload/" directory of the cdata generation sample code. generate or fill in the required ticket details. for example, the "{title}" and "{seatnumber}" fields are replaced with the movie title and seat number. for information about the complete json structure, see wallet cards. convert the json data to a jwe object. encrypt the jwe object with the samsung public key. build the custom jws header for samsung wallet cards. sign and validate the complete jws object with your partner private and public key using the rs256 asymmetric algorithm. this is the cdata token. private val currenttimemillis = system.currenttimemillis() private val plaindata:string = getstringfromfile("sample/payload/ticket.json") .replace("{refid}", uuid.randomuuid().tostring()) .replace("{language}", "en") .replace("{createdat}", currenttimemillis.tostring()) .replace("{updatedat}", currenttimemillis.tostring()) .replace("{issuedate}", currenttimemillis.tostring()) .replace("{startdate}", (currenttimemillis + timeunit.days.tomillis(1)).tostring()) .replace("{enddate}", (currenttimemillis + timeunit.days.tomillis(1) + +timeunit.hours.tomillis(2)).tostring()) fun generatecdata(moviename: string, movieticktno:string): string{ // modify data as needed val data = plaindata.replace("{title}", "\"$moviename\"") .replace("{seatnumber}","\"$movieticktno\"") //print(data) return generate(partner_id, samsungpublickey, partnerpublickey, partnerprivatekey, data) } private fun generate(partnerid: string, samsungpublickey: publickey, partnerpublickey: publickey, partnerprivatekey: privatekey, data: string): string { val jweenc = encryptionmethod.a128gcm val jwealg = jwealgorithm.rsa1_5 val jweheader = jweheader.builder(jwealg, jweenc).build() val encryptor = rsaencrypter(samsungpublickey as rsapublickey) val jwe = jweobject(jweheader, payload(data)) try { jwe.encrypt(encryptor) } catch (e: joseexception) { e.printstacktrace() } val payload = jwe.serialize() val jwsalg = jwsalgorithm.rs256 val utc = system.currenttimemillis() val jwsheader = jwsheader.builder(jwsalg) .contenttype("card") .customparam("partnerid", partnerid) .customparam("ver", "2") .customparam("utc", utc) .build() val jwsobj = jwsobject(jwsheader, payload(payload)) val rsajwk = rsakey.builder(partnerpublickey as rsapublickey) .privatekey(partnerprivatekey) .build() val signer: jwssigner try { signer = rsassasigner(rsajwk) jwsobj.sign(signer) } catch (e: joseexception) { e.printstacktrace() } return jwsobj.serialize() } returning the signed token in the server application code, when the server receives a request at the movie/{movieid} endpoint, the tokencontroller class calls the jwtgen.generatecdata() method with the movie id, which generates and returns the cdata jwt token in the api response. in this tutorial, since the movie ticket list was predefined in the mobile application project, make sure the same movie data class and list are defined here too. @restcontroller @requestmapping("movie") class tokencontroller { @getmapping(path = ["/{movieid}"]) fun getmovie(@pathvariable movieid:int): token { val movielists = listof<movie>( movie("the wallet", "samsung studios", "a-01"), movie("crying sea", "laplace studio","h-07"), movie("canoe", "terra productions", "r-03") ) if( movieid>2){ // implement your verification logic return token("failure", "") } else{ val cdata = jwtgen.generatecdata(movielists[movieid].name, movielists[movieid].ticketnumber) return token("success", cdata) } } } testing the application to test your "add to wallet" integration: connect the server and the mobile device to the same network. launch the server and mobile applications. in the mobile application, tap a movie ticket in the list. its detail page opens. tap add to samsung wallet. the server generates and returns the cdata token. the samsung wallet application launches on the device and the movie ticket information is added to it. figure 3: ticket added to samsung wallet summary implementing the "add to wallet" feature enables your users to add your digital content, such as tickets, passes, and loyalty cards, to the samsung wallet application on their mobile device as wallet cards. in addition to implementing the "add to samsung wallet" button in your mobile application, you must also create a server application that securely generates and signs the wallet card data and returns it to the mobile application for transmitting to samsung wallet. for more information about adding "add to wallet" to your application, see implementing atw button. you can also study the extended sample application (clicking this link downloads the sample code) and the api reference. if you have questions about or need help with the information presented in this article, you can share your queries on the samsung developers forum. you can also contact us directly for more specialized support through the samsung developer support portal. resources click the links below to download the sample code. android app sample code extended android app sample code cdata generation server sample code
Mobassir Ahsan
Develop Samsung Pay
apioverview package class tree index help package com samsung android sdk samsungpay v2 card class addcardinfo java lang object com samsung android sdk samsungpay v2 card addcardinfo all implemented interfaces android os parcelable public class addcardinfo extends object implements android os parcelable this class provides card information for enrollment since api level 1 2 nested class summary nested classes/interfaces inherited from interface android os parcelable android os parcelable classloadercreator<t extends object>, android os parcelable creator<t extends object> field summary fields modifier and type field description static final string extra_issuer_id key to represent issuer bin range static final string extra_key_moscow_transit key to send extra transit card data to samsung pay for russia virtual troika project the format of the data should be json string object static final string extra_provision_payload key to represent encrypted blob from issuer on carddetail bundle static final string extra_samsung_pay_card key to represent a samsung pay card for push provisioning if the key value is true, the current push provisioning card will have a samsung pay card type in samsung pay application this is only for specific issuer in uk static final string provider_amex indicates that the card tokenization provider is amex static final string provider_discover indicates that the card tokenization provider is discover static final string provider_elo indicates that the card tokenization provider is elo static final string provider_gemalto indicates that the card tokenization provider is gemalto static final string provider_gift indicates that the card tokenization provider is gift static final string provider_loyalty indicates that the card tokenization provider is loyalty static final string provider_mastercard indicates that the card tokenization provider is mastercard static final string provider_mir indicates that the card tokenization provider is mir static final string provider_napas indicates that the card tokenization provider is napas static final string provider_pagobancomat indicates that the card tokenization provider is pagobancomat static final string provider_paypal indicates that the card tokenization provider is paypal static final string provider_plcc indicates that the card tokenization provider is plcc static final string provider_vaccine_pass indicates that the card tokenization provider is vaccinepass refer cardmanager addcard addcardinfo, addcardlistener in detail static final string provider_visa indicates that the card tokenization provider is visa fields inherited from interface android os parcelable contents_file_descriptor, parcelable_write_return_value constructor summary constructors constructor description addcardinfo string cardtype, string tokenizationprovider, android os bundle carddetail constructor to create addcardinfo instance method summary all methodsinstance methodsconcrete methods modifier and type method description android os bundle getcarddetail api to get card details string getcardtype api to get card type string gettokenizationprovider api to get tokenization provider example vi, mc, ax, ds, and so on void setcarddetail android os bundle carddetail api to set extra card details void setcardtype string cardtype api to set card type void settokenizationprovider string tokenizationprovider api to set tokenization provider methods inherited from class java lang object equals, getclass, hashcode, notify, notifyall, tostring, wait, wait, wait field details extra_provision_payload public static final string extra_provision_payload key to represent encrypted blob from issuer on carddetail bundle since api level 1 2 see also constant field values extra_issuer_id public static final string extra_issuer_id key to represent issuer bin range this field is mandatory for elo since api level 1 2 see also constant field values provider_visa public static final string provider_visa indicates that the card tokenization provider is visa since api level 1 2 see also constant field values provider_mastercard public static final string provider_mastercard indicates that the card tokenization provider is mastercard since api level 1 2 see also constant field values provider_amex public static final string provider_amex indicates that the card tokenization provider is amex since api level 1 2 see also constant field values provider_discover public static final string provider_discover indicates that the card tokenization provider is discover since api level 1 2 see also constant field values provider_plcc public static final string provider_plcc indicates that the card tokenization provider is plcc since api level 1 2 see also constant field values provider_gift public static final string provider_gift indicates that the card tokenization provider is gift since api level 1 2 see also constant field values provider_loyalty public static final string provider_loyalty indicates that the card tokenization provider is loyalty since api level 1 2 see also constant field values provider_paypal public static final string provider_paypal indicates that the card tokenization provider is paypal since api level 2 0 see also constant field values provider_gemalto public static final string provider_gemalto indicates that the card tokenization provider is gemalto since api level 2 3 see also constant field values provider_napas public static final string provider_napas indicates that the card tokenization provider is napas since api level 2 3 see also constant field values provider_mir public static final string provider_mir indicates that the card tokenization provider is mir since api level 2 3 see also constant field values provider_pagobancomat public static final string provider_pagobancomat indicates that the card tokenization provider is pagobancomat since api level 2 7 see also constant field values extra_samsung_pay_card public static final string extra_samsung_pay_card key to represent a samsung pay card for push provisioning if the key value is true, the current push provisioning card will have a samsung pay card type in samsung pay application this is only for specific issuer in uk since api level 2 14 see also constant field values provider_vaccine_pass public static final string provider_vaccine_pass indicates that the card tokenization provider is vaccinepass refer cardmanager addcard addcardinfo, addcardlistener in detail cardmanager cardmanager = new cardmanager ct, pinfo ; string cardtype = card card_type_vaccine_pass; string tokenizationprovider = addcardinfo provider_vaccine_pass; string payload = "please follow json object specification"; bundle carddetail = new bundle ; carddetail putstring addcardinfo extra_provision_payload, payload ; addcardinfo addcardinfo = new addcardinfo cardtype, tokenizationprovider, carddetail ; cardmanager addcard addcardinfo, new addcardlistener { @override public void onsuccess int status, card card { log d tag, "onsuccess callback is called" ; } @override public void onfail int errorcode, bundle errordata { log e tag, "onfail callback is called, errorcode " + errorcode ; if errordata != null && errordata containskey spaysdk extra_error_reason_message { log e tag, "onfail extra reason message " + errordata getstring spaysdk extra_error_reason_message ; } } @override public void onprogress int currentcount, int totalcount, bundle bundledata { log d tag,"onprogress callback is called " + currentcount + " / " + totalcount ; } } ; json object specification mandatory fields version, cardid, type, cardart, qrdata, decoding, chunks, chunk, provider name, patient name, vaccine product, vaccine date, performer { "version" "1 0", "cardid" "xxxx-xxxxx-xxxxxxxxx", "type" "vaccinationrecordcard", "cardart" "https //issuer logo url location/logo png", "qrdata" { "decoding" "none", "chunks" [ "shc /012345678901234567890123456789" ] }, "expirationdate" "20231011", "provider" { "name" "vaccine pass provider name" }, "issuer" { "name" "vaccine pass issuer name" }, "patient" { "dateofbirth" "19510120", "name" { "family" "anyperson", "given" "john b " } }, "vaccinations" [ { "vaccine" { "product" "moderna", "lot" "0000001", "date" "20210101" }, "performer" { "name" "abc general hospital", "identityassurancelevel" "ial1 2" } }, { "vaccine" { "product" "moderna", "lot" "0000007", "date" "20210129" }, "performer" { "name" "abc general hospital", "identityassurancelevel" "ial1 2" } } ] } since api level 2 18 see also constant field values extra_key_moscow_transit public static final string extra_key_moscow_transit key to send extra transit card data to samsung pay for russia virtual troika project the format of the data should be json string object since api level 2 17 see also constant field values provider_elo public static final string provider_elo indicates that the card tokenization provider is elo since api level 2 21 see also constant field values constructor details addcardinfo public addcardinfo @nonnull string cardtype, @nonnull string tokenizationprovider, @nonnull android os bundle carddetail constructor to create addcardinfo instance parameters cardtype - card type to add tokenizationprovider - tokenization provider of the card carddetail - card detail which partner wants to pass to samsung pay throws illegalargumentexception - if not allowed card type is used or carddetail does not contain extra_provision_payload nullpointerexception - if tokenizationprovider or carddetail is null since api level 1 2 method details setcarddetail public void setcarddetail android os bundle carddetail api to set extra card details parameters carddetail - card detail which partner wants to pass to samsung pay bundle key-value pairs are defined as follows keys values extra_provision_payload string provisionpayload throws nullpointerexception - if carddetail is null illegalargumentexception - if carddetail does not contain extra_provision_payload since api level 1 2 settokenizationprovider public void settokenizationprovider string tokenizationprovider api to set tokenization provider parameters tokenizationprovider - tokenization provider of the card tokenization provider can be one of the following provider_visa provider_mastercard provider_amex provider_discover provider_gemalto provider_plcc provider_gift provider_loyalty provider_paypal provider_napas provider_mir provider_pagobancomat provider_elo throws nullpointerexception - if tokenization provider is null since api level 1 2 setcardtype public void setcardtype string cardtype api to set card type parameters cardtype - card type to add card type can be one of the following card card_type_credit_debit card card_type_credit card card_type_debit throws illegalargumentexception - if not allowed card type is used since api level 1 2 getcarddetail public android os bundle getcarddetail api to get card details since api level 1 2 gettokenizationprovider public string gettokenizationprovider api to get tokenization provider example vi, mc, ax, ds, and so on since api level 1 2 getcardtype public string getcardtype api to get card type since api level 1 2 samsung electronics samsung pay sdk 2 21 00 - sep 06 2024
success story mobile
blogjeanne hsu, senior marketing manager for developer relations at samsung, chatted with yuki he, chairperson, ceo and founder of joyme. jeanne hsu (jh): yuki, what was your professional journey that led you to joyme? yuki he (yh): i entered the internet industry in 2003 and joined tencent in product management when they started their product team. i was doing entertainment and social apps like qq and qq pets. i enjoyed working in this industry and developed a more profound interest in social products. later on in 2013, i started working on overseas products, got familiar with the global internet market, and was responsible for a utility product. at that time, samsung also partnered with us to include our product. i also got a chance to visit samsung's south korean headquarters to discuss other partnership matters. in 2015, i participated in the entrepreneurial process of musical.ly (later became tiktok) as a director. i saw a promising future of combining live video and social interaction. i wanted to use both to connect people virtually and in real time no matter where they were located. i saw the vast opportunities in the u.s. market, so i left and decided to build my own company, joyme. jh: where is joyme located? yh: joyme is in various regions including the los angeles (u.s.), singapore, brazil, and the middle east. jh: how many employees work at joyme? yh: we have 500 people total including 300 employees and 200 contractors. jh: how did the relationship with samsung first start? yh: we published liveme in galaxy store in 2020. we already had a relationship with samsung from my previous work. so this was a natural extension of the partnership. jh: best of galaxy store award – 2021 best entertainment app for joyme's liveme app. what does it mean to win this award? yh: we take this award very seriously and especially thank samsung for the recognition. samsung has many users and is one of the largest store platforms in the world. samsung is a world-renowned company, with a prominent brand name. winning this award also gives us great motivation to continue creating even better products for samsung users. jh: in what ways have you promoted winning the award? yh: we have promoted this fantastic news through the media agency and received positive market feedback. we plan to promote the award-winning news through international media, liveme's social media, and the official website. we believe the recognition from samsung is going to boost our branding and let more samsung users get to know more about us. winning the award gives us great motivation to continue doing what we do best: give our users and the entertainment community the best service. liveme – 2021 best entertainment app jh: what have you noticed about mobile trends and liveme? yh: the mobile phone camera has changed people's lives when they interact with their phones. you can be anywhere in the world to connect online with people, show your talent, expand your circle of friends, and share parts of your life. bringing the community closer together is the original concept of liveme. i felt the video and interactive components were important. people can go online with liveme and feel happier. jh: are there any unique aspects or optimizations to the galaxy store version of liveme? yh: we integrated the payment channel sdk with the samsung iap (in-app purchase) sdk. our base operation is android. galaxy store is very good for the developer so we don't have to do different versions. it saves a lot of time and resources. in the future, we hope to have deeper integration with samsung. jh: how did you come up with the concept for liveme? yh: in 2015, livestream video was not as popular as it is now; people took pics. but the camera performance on mobile phones was becoming more sophisticated and advanced. i found that many users gradually developed taking videos on their mobile phones. video is a richer content carrier than still images or plain text. i could see the future of information transmission trends. then video transmission changed; it was faster and people could send full rich videos instead of choppy/frozen bits of pixels. now instead of just watching a video, people could interact with live video streams. users could respond with comments or emojis in real time. the live-stream video experience further enhanced the connection between people. for example, people can stay at home and make friends all over the world. they use this platform to show off their talents. having this vision of connecting the world was the original idea that inspired me to develop liveme. broadcasters and business model jh: i noticed on facebook that liveme's tagline reads: “create content, meet friends, and make money.” tell me more about liveme and the business model. how do the broadcasters make money? yh: broadcasters earn money by presenting engaging content in their livestream channel. they can build up a global fan base. then viewers can send virtual gifts to show their appreciation. they also encourage people to subscribe to their channel. for example, out of 100k people that enter a broadcaster's room, 20% could give them gifts like flower animations and virtual diamonds. the more gifts they receive from their fans, the better. it shows a very active community. some broadcasters see this as a hobby, but some make it their professional career. we're not talking about famous celebrities who have their own channels but rather the uber driver, bar singer or amateur dancer. they can use liveme as an entertainment channel and make money doing it as a living. we help 300,000 broadcasters earn money in the u.s. globally we have a million broadcasters that are making good money via liveme. it's a very powerful story. not only do they receive gifts from their fans, but they also get benefits from liveme. we also give the broadcasters gifts depending on the volume and activity of their fan base. it helps incent broadcasters to generate new content. every month, we give several millions of u.s. dollars to the broadcasters. what's more, we have an ongoing plan with a $60 million investment to support our broadcasters and creators. we're able to offer jobs to people all over: in the u.s., brazil, japan, and the middle east, just to mention a few. jh: what a strong message. “we believe in you, and are willing to pay you for your creativity attracting a large fan base.” it's an intriguing business model. what else are broadcasters doing to increase their audience? yh: we have talented broadcasters who create content and make friends by livestreaming. they can interact with viewers. fans can also beam in to the “room”, do challenges and play mini games with the broadcasters. there can be up to nine people in a livestreaming room. youtube cannot do that. fans then become part of the action with other community members. and there are more people who are commenting, giving gifts, and cheering these people on. having this very interactive community lends itself to many creative ideas. we can combine games with the livestreaming: in soccer, the broadcaster guards the goalpost and another person kicks the ball, in real-time. people can play casual games together. then the community interacts as they play games, dance or sing. it's very entertaining! app ideas, discoverability and reach jh: how many apps has joyme published, and how many are on galaxy store? yh: liveme and photogrid are the two main apps of joyme. liveme is a live video social app and photogrid is a video and photo editing app. both liveme and photogrid are on galaxy store. jh: where do you get your app ideas? yh: user feedback is important to us. they give us ideas and inspiration. we learn from other apps (funny and creative ideas from games and apps). we'll also run campaigns to celebrate special events like our 6th birthday this past april; fans sent us video birthday cards. we do marketing research to see if there is new technology we could use. for example, new technologies like virtual character ai improves the user creative experience in our apps. jh: what is the work flow when designing, developing and publishing an app? yh: there are six steps for our app development and publishing. first, we need to list out the product project needs. it is necessary to determine the project's overall plan, the timeline, the general framework, the main functions, and the core belief of the app. what are the needs of target users? what kind of value can this app create for the user? once the app has its primary functions defined, we research to understand potential competitors and competitive environment. for example, is it a saturated market or a competitive market? next is the realization of the app function by designing the first draft of ui and ux. after multiple meetings and rendering, we will have the final interface design ready. the product will then enter the research and development stage. while forming the app with programming, we prepare everything in the app store account for release. the next step is to test the app. we test the app thoroughly before release by having internal test users test the first version and extract user feedback to improve and optimize the user experience. finally, it is time to publish the app. we'll use the app store account to release and publish the tested app, and leave three to five days to fix any bugs after the app is released. jh: with all the competition for apps, what has been your strategy for discoverability? yh: we buy ads traditionally from google and meta, etc. every app developer does that. but we have a community of broadcasters who can promote our apps as well. they will share their live-steaming with their fans by cross-promoting from other channels they've cultivated. we can see that more people are making friends and enjoying the interaction with the broadcasters. friends are telling others about broadcasters that appeal to them. there's nothing more compelling than the “tell a friend” concept. we do some pr and marketing events. before covid, we used to do live in-person promotions with iheartradio; one was for the event music house. we hosted parties in la and san francisco with broadcasters, asking them to invite their friends to join in. we found that people share their experiences on social media. it was a fun way to promote the liveme app to their friends. now we hold other online events, building on our platform, so people worldwide can participate. jh: what has been your strategy for generating revenue? yh: liveme generates revenue by iap (in-app purchases) for virtual gifts to support favorite broadcasters or participate in in-app events. to encourage users to be more engaged, we create monthly competitions with different themes, holidays, and unique virtual 3d animation gifts to best express users' distinct support styles. jh: in the last five years, liveme is in 85 countries. how do you attribute your growth and expansion? yh: liveme started with multiple tests and trials in a few countries to build a solid foundation. in the early stages, it is necessary to confirm if the product provides valuable services for users that reflect the actual demand in a pilot before launching a large-scale expansion. the internet industry is getting so competitive that users' needs and requirements change every second. it is truly a great challenge for our developers. our fundamental strategy is making good products and services that genuinely exceed user expectations. joyme has also been exploring and improving under the same principle. jh: what is in the future for joyme / liveme? yh: our mission is to "connect the world and spread happiness." joyme will continue to devote itself to creating exciting pan-entertainment products. in the future, we will also develop immersive meta-universe experience products. everyone is facing different obstacles in life under the influence of the pandemic, so i hope joyme can create products that give more companionship, happiness, and love to bring our global users together. feedback and advice jh: what advice would you give developers looking to bring their apps to galaxy store? yh: for specifics about galaxy store, i recommend the following: become familiar with the policy for galaxy store. if developers ignore this, their apps will soon be off-line. understand how to control the risk of payments. different platforms have varying risks. get good feedback from users and cooperate with samsung. we do activities together with samsung and benefit from their promotions. incent galaxy store users. we give gifts to galaxy store users, such as free coins to buy gifts to send to broadcasters. it encourages users to buy more coins and engage with liveme. jh: why is it important to offer your app on galaxy store? yh: our main market is the u.s. and samsung has a major presence there. marketing jh: where is liveme on galaxy store? yh: https://galaxy.store/liveme jh: what are some of the ways you promote liveme? yh: here are our websites and channels: website - https://www.liveme.com/ facebook - https://www.facebook.com/streamliveme/ twitter - https://twitter.com/streamliveme (@streamlivem) youtube - https://www.youtube.com/c/livemeofficial/featured instagram - https://www.instagram.com/streamliveme/ diversity and inclusion jh: what is joyme doing related to diversity and inclusion? yh: joyme supports multiple languages and is available in many countries, so focusing on content localization based on local culture, trends, and holidays is essential. we are committed to meeting the needs of our diverse users and respecting different cultures and religions. our goal is to create a supportive community that includes all races, religions, and cultures to connect users in the various regions. our management team is 40% to 50% women; some of them have been with me for more than five years, building a good relationship with each other. we also have offices in eight countries with different nationalities and cultures, all working together. jh: i understand you were involved in the women's entrepreneurship day (wed) summit. tell us more about that. yh: yes, thanks for asking. this international annual wed summit empowers women and girls worldwide to alleviate poverty their communities. i spoke to encourage them to become active participants in the economy by becoming leaders, innovators, and entrepreneurs. it gave me an opportunity to share my story with young women from all over the world and highlight how liveme is empowering women to share their talents and follow their passions. fun jh: what do you do for fun outside of work? yh: i enjoy playing different sports and fitness; i am also into singing. i was the singer of the official theme song "song of tencent" for tencent. i participated in many singing competitions during my college years and was pretty good at it. if i didn't become a product manager in the internet industry, i would probably have become a singer. yuki singing in fact, that was one reason i launched liveme. i started out as a broadcaster and gained a lot of fans by singing and dancing. everyone has the opportunity to grow their channel. nobody knew i was the ceo of the company. once they found out, they said “i knew yuki before as a broadcaster.” now, i leave the broadcasting to the other talent. jh: it's great you started as a broadcaster. so you know firsthand how to showcase your singing and dancing talents. kudos to you! thank you so much for this interview yuki. yh: you're very welcome. i am happy to chat with you. additional resources on the samsung developers site the samsung developers site has many resources for developers looking to build for and integrate with samsung devices and services. stay in touch with the latest news by creating a free account and subscribing to our monthly newsletter. visit the marketing resources page for information on promoting and distributing your apps. finally, our developer forum is an excellent way to stay up-to-date on all things related to the galaxy ecosystem.
Jeanne Hsu
Distribute Galaxy Store
docgift cards and household appliances 2 5 2 apps must not promote or enable gambling including, but not limited to, lotteries, casino activities, sweepstakes, and sports betting 2 5 3 for game apps with an 19+ age restriction that are published in south korea, the apps must be granted game rating and administration committee grac rating certificate noteon a case-by-case basis and subject to applicable laws and other criteria, local samsung subsidiaries may approve apps 2 6 user-generated content 2 6 1 apps with user-generated content must have a mechanism to filter restricted content from the app 2 6 2 apps with user-generated content must provide measures to resolve intellectual property infringement 2 6 3 apps with user-generated content must provide users with a method and instructions to report to the app’s registering person or entity issues of restricted content or intellectual property infringement 2 7 advertisements 2 7 1 ads must be clearly identified as ads and must not harm app or device usability 2 7 2 ads must provide close and skip buttons and make them clearly visible 2 7 3 the content of ads must be appropriate for the app’s age rating 2 7 4 apps must not contain or present ads that have the following types of content • violence toward or abuse of humans or animals • sexual content including, but not limited to, pornography, pedophilia, and bestiality • websites that have a sexual emphasis or adult toys, videos, or products including, but not limited to, adult friend finder and dating websites • ads in kids category apps that contain content that is not appropriate for children • obscene, vulgar, or inappropriate language • defamatory, libelous, slanderous, or unlawful content • promotion of or unnecessary references to alcohol, tobacco including electronic cigarettes , and drugs • offensive references or discrimination towards individual persons or groups of people based on race, gender, sexual preference or identity, ethnicity, nationality, disability, religion, political identity, or ideology • overtly political communication • illegal activities, services, or substances • description, depiction, or encouragement of illegal substances • illegal, false, or deceptive investment or money-making advice, promotions, or opportunities • system notifications, push notifications, or similar notifications without user consent • pharmaceutical products that are not certified in the countries that the apps are published in • content that reasonable public consensus may find to be improper or inappropriate 3 legal this section relates to lawful matters in addition to the requirements below, apps must comply with the local laws of the country of sale be sure to check each country’s local laws 3 1 privacy 3 1 1 apps that access, collect, use, transmit, or share user data including, but not limited to, user location, calendar, and sms/mms information must comply with all applicable local laws, the european union’s general data protection regulation gdpr and the samsung service terms and conditions 3 1 2 apps that access, collect, use, transmit, or share user data must display a user data privacy policy in their apps and provide the url of the policy during app registration in seller portal 3 1 3 the app privacy policy must include the following information • collected user data items and types • purposes of using user data • list of third-parties with which the app shares user data and shared data types • user data items and data types that the app shares with third-parties • user data retention period and user data deletion for example, upon account deletion or app uninstallation • method of notifying users when the privacy policy is revised • user data-related privileges such as reading, revising, or deleting data that can be requested by users 3 1 4 when the user data privacy policy is revised, users must be notified when the privacy policy url is changed, the privacy policy url in the app registration must be updated 3 1 5 apps must not access, collect, use, transmit, or share user data without legitimate user consent in accordance with local laws 3 1 6 apps must not require that the user grant more permissions or provide more personal information than the minimum necessary for the app to successfully support its features 3 1 7 apps must not display advertisements or push messages based on user data without first getting user consent to do so 3 1 8 apps must not initiate or support security warnings or malicious means that try to get user data 3 2 intellectual property copyright, trademark etc 3 2 1 apps must not copy aspects of any app published in galaxy store 3 2 2 apps must not support the download of any other app by a direct method from inside the app for example, through an apk 3 2 3 apps must not display, depict, or use any samsung identifiers including, but not limited to, samsung brand names, logos, trademarks, and service marks 3 2 4 apps must not contain any reference that suggests that the app or its registering person or entity has a relationship with samsung or misleads users about any samsung device 3 2 5 apps that include free and open source software foss must comply with applicable open source software license terms and conditions 3 2 6 apps must not include, present, or use any material whose use is protected by the laws of any country that the app is published in including, but not limited to, copyrighted, trademarked, and patented material without first getting the permission of the rightful owner, maintain evidence of the permission, and must present a copy of the permission to samsung app content must not contain protected or slightly modified material without the owner’s consent, including, but not limited to • business names, trademarks, service marks, colors, fonts, or logos that can mislead users • watch brand names or logos, styles, or inspired designs • sports club names or logos, or official colors or design • names, images, and other content protected by intellectual property rights and publicity rights for example, from movies, tv, and game guides • fan-made content • protected logos or brand names of products including, but not limited to automobiles, motorcycles, handbags, and cameras • images of products including, but not limited to, automobiles, motorcycles, cameras, and handbags when the product brand can be identified • images of private buildings not visible from a public space, and copyrighted images of any building or structure for example, st peter’s basilica, illuminated eiffel tower, and the empire state building • works, names, photos, likenesses, or signatures of any person or celebrity generally, while they are living or less than 70 years after their death 3 2 7 for apps that include, present, or use material protected by the laws of the countries that the app is published in, or support a method to share or download material not owned by the person or entity who registered the app, the person or entity must first get the permission of the rightful owner, maintain evidence of the permission, and must present a copy of the permission to samsung noteif you find protected material inappropriately inside a galaxy store app or inappropriately available via a galaxy store app, please directly contact the app seller to resolve the issue in the case that the seller cannot be reached, you can report the violation here 3 3 kids category 3 3 1 apps published in the kids category of galaxy store • must comply with applicable children’s privacy laws and statutes of the countries that the apps are published in including, but not limited to, the children’s online privacy protection act coppa and european union’s general data protection regulation gdpr • must be designed for children under 13 years of age • must not contain links to outside of the app 3 4 miscellaneous 3 4 1 apps must comply with all local laws of the countries that the apps are published in 3 4 2 apps must observe and comply with all legal requirements and local customs of the countries that the apps are published in 3 4 3 for apps published in south korea • apps must comply with the act on promotion of information and communications network utilization and information protection, and all other relevant republic of korea laws • app registration must specify the required and optional permissions and describe why and how they are used • in-app payments/purchases apps offering forms or methods of randomized virtual items for purchase, such as but not limited to loot boxes or loot crates, must disclose the odds of receiving those items to customers prior to purchase noteyou can download the guideline on the disclosure of probability information in game rating and administration committee grac 3 4 4 apps must not visually or audibly present or encourage any type of the following content • overtly political communication • illegal activities, services, or substances • illegal, false, or deceptive investment or money-making advice, promotions, or opportunities • pharmaceutical products that are not certified in the countries that the apps are published in
events game, mobile
blogbeing the host of the samsung developers podcast, i have had the opportunity to interview many great game developers over the years, but had yet to immerse myself in the gaming community. that was until i attended gdc 2022, the game developers conference held at moscone center in san francisco. gdc is the premiere conference related to the gaming industry. the annual conference brings together game designers, audio producers, programmers, artists, writers, and many more industry professionals from all around the world. networking at the expo as with most conferences, networking was one of the key benefits of being at an in-person conference. walking the expo floor allowed me to chat with so many amazing tech companies to learn about the latest game development tools and services. dolby. connecting with the reps at dolby, we talked about the different ways our team at samsung can help promote dolby atmos, their simulated surround sound technology available on samsung devices, to mobile game developers. wigi. the amazing people at wigi (women in games international) are doing great things. i learned how they are impacting the global games industry to advance economic equality and diversity for women and their allies. sequence. as i explored the expo, i was on the lookout for anything related to web3 and nfts. the team at sequence told me how they are helping game developers build for web3 and the world of nfts in the marketplace/metaverse, and simplifying crypto-transactions for gamers. sessions & sessions, and more sessions the expo floor was a great quick overload of everything game-tech-related, but the sessions allowed for a more comprehensive learning environment on many diverse game development topics. during the five-day conference, i attended over 25 sessions, learning in great detail from many inspirational speakers. sessions covered everything from designing and programming, to business and marketing, and so much more. below are highlights from several of my favorite sessions. free-to-play summit: the f2p game design challenge steve meretzky, abigail rindo, fawzi mesmar, shelby moledina, amanda schuckman free-to-play has dominated the gaming market and has intrigued me because it is a big part of mobile gaming. this session was very insightful as each of the different teams pitched their game ideas, explaining how they would generate revenue within a free-to-play game. the winners of this challenge quickly became audience favorites with their animal sanctuary game concept and real-world connection, giving players the opportunity to donate to their favorite animal foundation. session description: for many years, the game design challenge was one of the most popular sessions at the gdc. now, the advisory board of the free-to-play summit is proud to revive this gdc tradition, with a free-to-play focused version of the challenge. four free-to-play designers will have been given marching orders, and tasked with designing a game around that given problem. all four will present their idea to the summit audience, followed by an audience vote. innovative thinking and lively presentations are in store for all attendees! the theme of this year's challenge is designing for minnows. free-to-play games are almost always tuned to extract most of their revenue from "whales" -- those super-fans of the game who spend the big bucks, while the other 99.9% of the game's players spend little or nothing on it. we've challenged three free-to-play designers to come up with a design for a game that will extract the vast majority of its revenue not from "whales" but from "minnows" ... players who, over their entire lifetime, spend $10 or less. lost words: beyond the page dan gabriel of all the sessions that i attended, this one touched me the most. i wanted to learn more about the importance of narrative within the gameplay but received so much more from this session. dan gabriel’s approach to public speaking felt more like a storyteller than a conference speaker. lost words: beyond the page is not just a game, but a way for people to learn about themselves as they experience the challenges of life. session description: lost words: beyond the page leads the player into a rabbit hole of emotions to emerge, weary but fulfilled, on the other side of grief. attend to see how narrative and gameplay work together to create a deep, emotional bond. how metaphors pull the player deeper into the experience and how psychology shaped a story of a girl, a gran and a fantasy world. 'unpacking': the fun behind the foley jeff van dyck i love sound and everything that comes with the production of capturing sound effects (foley). seeing how this small team (husband, wife, and daughter) took on the challenge of not only creating 14,000 unique sounds, but also integrating all 14,000 sound files into the game and how that created its own set of challenges. session description: "unpacking has 14,000 foley audio files!" was a tweet that went viral in nov 2021. audio director and composer jeff van dyck (alien isolation, total war, ea sports) takes us through the unexpected complexity he and his wife angela encountered while they produced the foley for unpacking. understanding nfts: a sea-change for f2p games jordan blackman this session was exactly what i was hoping for: more insight into the new world of nfts (non-fungible tokens), blockchain, and crypto, and how they can impact f2p (free-to-play) games. as web3 games are developed, we will see more disruption to the current f2p space because these games are powered by the player community and not a single entity. session description: nfts are a consumer-driven phenomenon growing at dizzying speeds. more than merely a new way to offer iap, nft technology is set to disrupt game fundraising, community development, social media marketing, and even the very nature of the consumer/creator relationship. in this session, game designer jordan blackman will show the surprising ways nfts are already changing the game, as well as some predictions of what is to come. 'wordle': doing the opposite of what you're meant to josh wardle i am one who has definitely been swept up in the wordle craze, and getting to hear from the creator of wordle, josh wardle ... yes that is his name, was fascinating. the story of how he created the game was simple. the stories he shared about the simple connections people were making through sharing their daily wordle were absolutely wonderful. session description: wordle went from a personal gift to a global phenomenon in 3 months. this talk explores the decisions that were made throughout its development that run contrary to conventional wisdom around building successful mobile games, from wordle's origins to its seven-figure sale to the new york times. the talk also explores the human elements and considerations of creating, growing, and selling a game, both from the perspective of the developer and the game's audience. gdc vault: stream on-demand even though the conference has concluded, many of the sessions will be available to stream on-demand through the gdc vault. sponsored sessions are available for free, while technical sessions and gdc show content will require a paid subscription. if you are looking for samsung content, be sure to check out the following samsung sessions that were presented at gdc. you can view two of the sessions on youtube and all are available on the gdc vault. game performance optimization with causal models youtube · gdc vault what if your phone's avatar is in the game or metaverse? youtube · gdc vault new gpu, the ultimate reality! gdc vault unfolding your gaming potential with galaxy gamedev gdc vault awards show celebration the high point of the conference definitely was the awards show, presented by both the independent games festival and the game developers choice awards. the evening was full of recognizing not only the amazing winners, but all those nominated and truly how creative, innovative, and engaging the past year in game development has been. you can check out the full awards show below. inscryption the big winner of the evening was inscryption, taking home not only game of the year from game developers choice awards, but also the grand prize award from igf, along with awards for excellence in audio, excellence in design, and excellence in narrative. game description: from the creator of pony island and the hex comes the latest mind melting, self-destructing love letter to video games. inscryption is an inky black card-based odyssey that blends the deckbuilding roguelike, escape-room style puzzles, and psychological horror into a blood-laced smoothie. darker still are the secrets inscrybed upon the cards... unpacking the viral game with over 14,000 sounds somehow turned the painstaking task of unpacking boxes into an experience of peace and tranquility. unpacking won both the game developers choice award for best innovation and for best audio. game description: unpacking is a zen game about the familiar experience of pulling possessions out of boxes and fitting them into a new home. part block-fitting puzzle, part home decoration, you are invited to create a satisfying living space while learning clues about the life you're unpacking. over the course of eight house moves, you are given a chance to experience a sense of intimacy with a character you never see and a story you're never told. papetura the game i am most excited about is papetura, winners of igf’s excellence in visual art award. the mysterious and artistically quirky world is an absolute pleasure for the eyes, playing out in a real-life, stop-motion world. game description: papetura is an atmospheric point & click adventure game, handcrafted entirely out of paper. little creatures pape and tura will face monsters that will try to burn down their beloved paper world. closing these are just a few of the many highlights i experienced during gdc this past year. explore the gdc vault for yourself to experience gdc 2022 and impact the game developer community with whatever your expertise may be. see you at gdc 2023, march 20-24 in san francisco! official conference photos were made available via the gdc flickr account: www.flickr.com/photos/officialgdc. learn more about gaming trends and samsung’s participation at this year’s game developers conference here. be sure to also follow us on @samsung_dev to keep up-to-date on the latest developer news, and keep an eye on our blogs for other helpful resources. you can also sign up for the samsung developer program to take advantage of exclusive benefits and access helpful developer resources.
Tony Morelan
Develop Smart TV
apigift card it is a dictionary in json format, so you have to parse it to use for more information, please refer to "promotionalcodedetail" at the below 1 21 promotionalcodedetail this defines data set of promotionalcodedetail parameter that contains showregisterpromotionalcodedata dictionary dictionary promotionalcodedetail { domstring appliedcouponcount; domstring[] appliedcouponlist; domstring registedbenefitcount; domstring[] registedbenefitlist; }; the following values are supported appliedcouponcount it returns the number of applied coupon count appliedcouponlist it returns the list of applied coupon registedbenefitcount it returns the number of benefit registedbenefitlist it returns the list of benefit code 1 22 showregistercreditcarddata this defines data set that is coming from showregistercreditcard api dictionary showregistercreditcarddata { domstring opendeeplinkresult; domstring? opendeeplinkdetail; }; the following values are supported opendeeplinkresult it returns "success" in success, "fail" in failure opendeeplinkdetail [optional] it is optional and not used now 1 23 showpurchasehistorydata this defines data set that is coming from showpurchaseshistory api dictionary showpurchasehistorydata { domstring opendeeplinkresult; domstring opendeeplinkdetail; }; the following values are supported opendeeplinkresult it returns "success" in success, "fail" in failure opendeeplinkdetail it returns the detail information of refund or cancel it is a dictionary in json format, so you have to parse it to use for more information, please refer to "purchasehistorydetail" at the below 1 24 purchasehistorydetail this defines data set of purchasehistorydetail parameter that contains showpurchasehistorydata dictionary dictionary purchasehistorydetail { domstring invoicerefundcount; domstring[] invoicerefundlist; domstring subscriptioncancelcount; domstring[] subscriptioncancellist; }; the following values are supported invoicerefundcount it returns the number of product that user make refunded invoicerefundlist it returns array that contains the list of refunded invoice id subscriptioncancelcount it returns the number of subscription product that user make cancelled subscriptioncancellist it returns array that contains the list of cancelled subscription 1 25 serviceavailabledata defines a dictionary for data returned by the isserviceavailable api dictionary serviceavailabledata { domstring apiresult; }; the following values are supported apiresult isserviceavailable api result dictionary in json format this value is json string type data, so please use it by json parsing after you parse this value, you can use it in serviceavailableapiresult format at the below 1 26 serviceavailableapiresult defines a dictionary for the serviceavailabledata dictionary 'apiresult' parameter dictionary serviceavailableapiresult { domstring status; domstring result; domstring serviceyn; }; the following values are supported status returns "100000" on success and other codes on failure result returns "success" on success serviceyn returns "y" if the service is available 2 interfaces 2 1 billingmanagerobject defines a webapi object instance of the tizen samsung product api the webapis billing object enables access to billing api functionality [nointerfaceobject] interface billingmanagerobject { readonly attribute billingmanager billing; }; webapi implements billingmanagerobject; since 2 4 attributes readonly billingmanager billing billing api namespace 2 2 billingmanager provides methods for billing functionalities [nointerfaceobject] interface billingmanager { void buyitem domstring appid, tvservertype servertype, domstring paymentdetails, billingbuydatasuccesscallback onsuccess, optional errorcallback? onerror ; void getproductslist domstring appid, domstring countrycode, domstring pagesize, domstring pagenumber, domstring checkvalue, tvservertype servertype, billingproductslistcallback onsuccess, optional errorcallback? onerror ; void applyinvoice domstring appid, domstring customid, domstring invoiceid, domstring countrycode, tvservertype servertype, billingapplyinvoicecallback onsuccess, optional errorcallback? onerror ; void verifyinvoice domstring appid, domstring customid, domstring invoiceid, domstring countrycode, tvservertype servertype, billingverifyinvoicecallback onsuccess, optional errorcallback? onerror ; void getservicecountryavailability domstring appid, domstring[] countrycodes, domstring checkvalue, tvservertype servertype, billinggetservicecountryavailabilitycallback onsuccess, optional errorcallback? onerror ; void getuserpurchaselist domstring appid, domstring customid, domstring countrycode, domstring pagenumber, domstring checkvalue, tvservertype servertype, billinggetuserpurchaselistcallback onsuccess, optional errorcallback? onerror ; void cancelsubscription domstring appid, domstring invoiceid, domstring customid, domstring countrycode, tvservertype servertype, billingcancelsubscriptioncallback onsuccess, optional errorcallback? onerror ; void isserviceavailable tvservertype servertype, billingisserviceavailablecallback onsuccess, optional errorcallback? onerror ; domstring getversion ; }; methods buyitem enables implementing the samsung checkout client module within the application after authenticating the purchase information through the application, the user can proceed to purchase payment void buyitem domstring appid, tvservertype servertype, domstring paymentdetails, billingbuydatasuccesscallback onsuccess, optional errorcallback? onerror ; product tv privilege level public privilege http //developer samsung com/privilege/billing parameters appid application id servertype billing server type paymentdetails payment parameters orderitemid[mandatory]/ordertitle[mandatory]/ordertotal[mandatory]/ordercurrencyid[mandatory]/orderid[optional]/ordercustomid[mandatory] onsuccess returns "payresult" and "paydetail" if there is no internal error occurs until client to server data communication payresult, can still contains error when billing server confirms that the given parameters does not have expected value or have problem while processing it paydetail, can have additional data when it's returned, such as invoiceid please refer to the development guide of "buyitem" for details onerror [optional][nullable] optional callback method to invoke if an internal error occurs before the client to server data communication securityerror, if the application does not have the privilege to call this method unknownerror, if other error occur, such as internal error or "billing client already running" error exceptions webapiexception with error type typemismatcherror, if any of input parameter is not compatible with its expected type with error type invalidvalueserror, if servertype contains an invalid value since 2 4 code example var strappid = ""; var struid = webapis sso getloginuid ; var paymentdetails = new object ; paymentdetails orderitemid="pid_2_consum_cupn"; paymentdetails ordertitle="hello consum us coupon"; paymentdetails ordertotal="2"; paymentdetails ordercurrencyid="usd"; paymentdetails ordercustomid=struid; var stringifyresult = json stringify paymentdetails ; var onsuccess = function data {}; var onerror = function error {}; webapis billing buyitem strappid, "dev", stringifyresult, onsuccess, onerror ; getproductslist retrieves the list of products registered on the billing dpi server void getproductslist domstring appid, domstring countrycode, domstring pagesize, domstring pagenumber, domstring checkvalue, tvservertype servertype, billingproductslistcallback onsuccess, optional errorcallback? onerror ; product tv privilege level public privilege http //developer samsung com/privilege/billing parameters appid application id countrycode tv country code pagesize number of products retrieved per page maximum 100 pagenumber requested page number 1 ~ n checkvalue security check value required parameters = "appid" + "countrycode" the check value is used by the dpi service to verify api requests it is a base64 hash generated by applying the hmac sha256 algorithm on a concatenated string of parameters using the dpi security key you can see the example how to generate checkvalue from the following code example you can use any open library to generate the hmac sha256 hash the following example uses the cryptojs library servertype billing server type onsuccess returns the product list if there is no internal error occurs until client to server data communication apiresult, can still contains error when billing server confirms that the given parameters does not have expected value or have problem while processing it when cpstatus value from apiresult is "100000", it means server communication is done properly and other values are valid in returns onerror [optional][nullable] optional callback method to invoke if an internal error occurs before the client to server data communication securityerror, if the application does not have the privilege to call this method unknownerror, if any other error occurs exceptions webapiexception with error type typemismatcherror, if any of input parameter is not compatible with its expected type with error type invalidvalueserror, if servertype contains an invalid value since 4 0 code example var strsecuritykey = ""; // the dpi security key is issued at the dpi portal var strappid = ""; var strcountrycode = webapis productinfo getsystemconfig webapis productinfo productinfoconfigkey config_key_service_country ; var reqparams = strappid + strcountrycode; var hash = cryptojs hmacsha256 reqparams, strsecuritykey ; var strcheckvalue = cryptojs enc base64 stringify hash ; var onsuccess = function data {}; var onerror = function error {}; webapis billing getproductslist strappid, strcountrycode, "100", "1", strcheckvalue, "dev", onsuccess, onerror ; applyinvoice updates the apply status of purchase item to dpi server void applyinvoice domstring appid, domstring customid, domstring invoiceid, domstring countrycode, tvservertype servertype, billingapplyinvoicecallback onsuccess, optional errorcallback? onerror ; product tv privilege level public privilege http //developer samsung com/privilege/billing parameters appid application id customid same value as "ordercustomid" parameter for the buyitem api samsung account uid invoiceid invoice id of purchased item that you want to update apply status countrycode tv country code servertype billing server type onsuccess returns purchase apply status if there is no internal error occurs until client to server data communication apiresult, can still contains error when billing server confirms that the given parameters does not have expected value or have problem while processing it when cpstatus value from apiresult is "100000", it means server communication is done properly and other values are valid in returns onerror [optional][nullable] optional callback method to invoke if an internal error occurs before the client to server data communication securityerror, if the application does not have the privilege to call this method unknownerror, if any other error occurs exceptions webapiexception with error type typemismatcherror, if any of input parameter is not compatible with its expected type with error type invalidvalueserror, if servertype contains an invalid value since 4 0 code example var strappid = ""; var struid = webapis sso getloginuid ; var invoiceid = ""; // issued by getproductslist var strcountrycode = webapis productinfo getsystemconfig webapis productinfo productinfoconfigkey config_key_service_country ; var onsuccess = function data {}; var onerror = function error {}; webapis billing applyinvoice strappid, struid, invoiceid, strcountrycode, "dev", onsuccess, onerror ; verifyinvoice checks whether a purchase, corresponding to a specific "invoiceid", was successful void verifyinvoice domstring appid, domstring customid, domstring invoiceid, domstring countrycode, tvservertype servertype, billingverifyinvoicecallback onsuccess, optional errorcallback? onerror ; product tv privilege level public privilege http //developer samsung com/privilege/billing parameters appid application id customid same value as "ordercustomid" parameter for the buyitem api samsung account uid invoiceid invoice id that you want to verify whether a purchase was successful countrycode tv country code servertype billing server type onsuccess returns the payment status if there is no internal error occurs until client to server data communication apiresult, can still contains error when billing server confirms that the given parameters does not have expected value or have problem while processing it when cpstatus value from apiresult is "100000", it means server communication is done properly and other values are valid in returns onerror [optional][nullable] optional callback method to invoke if an internal error occurs before the client to server data communication securityerror, if the application does not have the privilege to call this method unknownerror, if any other error occurs exceptions webapiexception with error type typemismatcherror, if any of input parameter is not compatible with its expected type with error type invalidvalueserror, if servertype contains an invalid value since 4 0 code example var strappid = ""; var struid = webapis sso getloginuid ; var invoiceid = ""; // issued by getproductslist var strcountrycode = webapis productinfo getsystemconfig webapis productinfo productinfoconfigkey config_key_service_country ; var onsuccess = function data {}; var onerror = function error {}; webapis billing verifyinvoice strappid, struid, invoiceid, strcountrycode, "dev", onsuccess, onerror ; getservicecountryavailability get service country availability for samsung checkout void getservicecountryavailability domstring appid, domstring[] countrycodes, domstring checkvalue, tvservertype servertype, billinggetservicecountryavailabilitycallback onsuccess, optional errorcallback? onerror ; product tv privilege level public privilege http //developer samsung com/privilege/billing parameters appid application id countrycodes to check multiple countrycodes available add as array, only uppercase allowed ex countrycodes=["de","us","kr"] checkvalue security check value required parameters = "appid" + "countrycodes" the check value is used by the dpi service to verify api requests it is a base64 hash generated by applying the hmac sha256 algorithm on a concatenated string of parameters using the dpi security key you can see the example how to generate checkvalue from the following code example you can use any open library to generate the hmac sha256 hash the following example uses the cryptojs library servertype billing server type onsuccess returns the service availability status of each country if there is no internal error occurs until client to server data communication apiresult, can still contains error when billing server confirms that the given parameters does not have expected value or have problem while processing it when cpstatus value from apiresult is "100000", it means server communication is done properly and other values are valid in returns onerror [optional][nullable] optional callback method to invoke if an internal error occurs before the client to server data communication securityerror, if the application does not have the privilege to call this method unknownerror, if any other error occurs exceptions webapiexception with error type typemismatcherror, if any of input parameter is not compatible with its expected type with error type invalidvalueserror, if servertype contains an invalid value since 5 5 code example var strsecuritykey = ""; // the dpi security key is issued at the dpi portal var strappid = ""; var countrycodes = ["de","us","kr"]; var reqparams = strappid + "deuskr"; var hash = cryptojs hmacsha256 reqparams, strsecuritykey ; var strcheckvalue = cryptojs enc base64 stringify hash ; var onsuccess = function data {}; var onerror = function error {}; webapis billing getservicecountryavailability strappid, countrycodes, strcheckvalue, "dev", onsuccess, onerror ; getuserpurchaselist retrieves the user's purchase list void getuserpurchaselist domstring appid, domstring customid, domstring countrycode, domstring pagenumber, domstring checkvalue, tvservertype servertype, billinggetuserpurchaselistcallback onsuccess, optional errorcallback? onerror ; product tv privilege level public privilege http //developer samsung com/privilege/billing parameters appid application id customid same value as "ordercustomid" parameter for the buyitem api samsung account uid countrycode tv country code pagenumber requested page number 1 ~ n checkvalue security check value required parameters = "appid" + "customid" + "countrycode" + "itemtype" + "pagenumber" itemtype, must use 2 as value "all items" the check value is used by the dpi service to verify api requests it is a base64 hash generated by applying the hmac sha256 algorithm on a concatenated string of parameters using the dpi security key you can see the example how to generate checkvalue from the following code example you can use any open library to generate the hmac sha256 hash the following example uses the cryptojs library servertype billing server type onsuccess returns the purchase list if there is no internal error occurs until client to server data communication apiresult, can still contains error when billing server confirms that the given parameters does not have expected value or have problem while processing it when cpstatus value from apiresult is "100000", it means server communication is done properly and other values are valid in returns onerror [optional][nullable] optional callback method to invoke if an internal error occurs before the client to server data communication securityerror, if the application does not have the privilege to call this method unknownerror, if any other error occurs exceptions webapiexception with error type typemismatcherror, if any of input parameter is not compatible with its expected type with error type invalidvalueserror, if servertype contains an invalid value since 4 0 code example var strsecuritykey = ""; // the dpi security key is issued at the dpi portal var strappid = ""; var struid = webapis sso getloginuid ; var strcountrycode = webapis productinfo getsystemconfig webapis productinfo productinfoconfigkey config_key_service_country ; var strpagenumber = "1"; var reqparams = strappid + struid + strcountrycode + "2" + strpagenumber; var hash = cryptojs hmacsha256 reqparams, strsecuritykey ; var strcheckvalue = cryptojs enc base64 stringify hash ; var onsuccess = function data {}; var onerror = function error {}; webapis billing getuserpurchaselist strappid, struid, strcountrycode, strpagenumber, strcheckvalue, "dev", onsuccess, onerror ; cancelsubscription cancels a subscription product void cancelsubscription domstring appid, domstring invoiceid, domstring customid, domstring countrycode, tvservertype servertype, billingcancelsubscriptioncallback onsuccess, optional errorcallback? onerror ; product tv privilege level public privilege http //developer samsung com/privilege/billing parameters appid application id invoiceid invoice id of subscription that you want to cancel customid same value as "ordercustomid" parameter for the buyitem api samsung account uid countrycode tv country code servertype billing server type onsuccess returns the subscription cancellation status if there is no internal error occurs until client to server data communication apiresult, can still contains error when billing server confirms that the given parameters does not have expected value or have problem while processing it when cpstatus value from apiresult is "100000", it means server communication is done properly and other values are valid in returns onerror [optional][nullable] optional callback method to invoke if an error occurs before the client to server data communication securityerror, if the application does not have the privilege to call this method unknownerror, if any other error occurs exceptions webapiexception with error type typemismatcherror, if any of input parameter is not compatible with its expected type with error type invalidvalueserror, if servertype contains an invalid value since 4 0 code example var strappid = ""; var struid = webapis sso getloginuid ; var invoiceid = ""; // issued by getproductslist var strcountrycode = webapis productinfo getsystemconfig webapis productinfo productinfoconfigkey config_key_service_country ; var onsuccess = function data {}; var onerror = function error {}; webapis billing cancelsubscription strappid, invoiceid, struid , strcountrycode , "dev", onsuccess, onerror ; isserviceavailable checks whether the billing server is available however, this api will be replaced by getservicecountryavailability after deprecation void isserviceavailable tvservertype servertype, billingisserviceavailablecallback onsuccess, optional errorcallback? onerror ; product tv privilege level public privilege http //developer samsung com/privilege/billing parameters servertype billing server onsuccess returns the server availability onerror [optional][nullable] optional callback method to invoke if an internal error occurs before the client to server data communication securityerror, if the application does not have the privilege to call this method unknownerror, if any other error occurs exceptions webapiexception with error type typemismatcherror, if any of input parameter is not compatible with its expected type with error type invalidvalueserror, if any input parameter contains an invalid value since 4 0 deprecated 5 5 code example var onsuccess = function data {}; var onerror = function error {}; webapis billing isserviceavailable "dev", onsuccess, onerror getversion retrieves the billing api version domstring getversion ; product tv privilege level public privilege http //developer samsung com/privilege/billing return value domstring billing api version exceptions webapiexception with error type securityerror, if the application does not have the privilege to call this method with error type notsupportederror, if this feature is not supported with error type unknownerror, for any other error since 4 0 code example var version = webapis billing getversion ; 2 3 billingbuydatasuccesscallback defines the payment success callback [callback = functiononly, nointerfaceobject] interface billingbuydatasuccesscallback { void onsuccess billingbuydata data ; }; methods onsuccess callback method returning the payment status void onsuccess billingbuydata data ; privilege level public privilege http //developer samsung com/privilege/billing parameters data payment status code example void onsuccess data { if data payresult == 'success' { // implement success logic } else { // implement cancel or fail logic } } 2 4 billingbuydata defines the payment result and information [nointerfaceobject] interface billingbuydata { attribute domstring payresult; attribute domstring paydetail; }; attributes domstring payresult payment result domstring paydetail payment information it is same with paymentdetails param of buyitem 2 5 billingproductslistcallback defines the product list success callback [callback = functiononly, nointerfaceobject] interface billingproductslistcallback { void onsuccess productslistdata data ; }; methods onsuccess callback method returning the product list request status void onsuccess productslistdata data ; privilege level public privilege http //developer samsung com/privilege/billing parameters data it includes getproductlist api result but you can't use it as it is you have to parse it as json format data code example void onsuccess data { var resproductslist = json parse data apiresult ; if resproductslist cpstatus == "100000" { // implement success logic } else { // implement cancel or fail logic } } 2 6 billingapplyinvoicecallback defines the apply invoice success callback [callback = functiononly, nointerfaceobject] interface billingapplyinvoicecallback { void onsuccess applyinvoicedata data ; }; methods onsuccess callback method returning the apply invoice request status void onsuccess applyinvoicedata data ; privilege level public privilege http //developer samsung com/privilege/billing parameters data it includes applyinvoice api result but you can't use it as it is you have to parse it as json format data code example void onsuccess data { resapplyproduct = json parse data apiresult ; if resapplyproduct cpstatus == "100000" { // implement success logic } else { // implement cancel or fail logic } } 2 7 billingverifyinvoicecallback defines the payment verification success callback [callback = functiononly, nointerfaceobject] interface billingverifyinvoicecallback { void onsuccess verifyinvoicedata data ; }; methods onsuccess callback method returning the payment verification request status void onsuccess verifyinvoicedata data ; privilege level public privilege http //developer samsung com/privilege/billing parameters data it includes verifyinvoice api result but you can't use it as it is you have to parse it as json format data code example void onsuccess data { resverifypurchase = json parse data apiresult ; if resverifypurchase cpstatus == "100000" { // implement success logic } else { // implement cancel or fail logic } } 2 8 billinggetuserpurchaselistcallback defines the purchase history success callback [callback = functiononly, nointerfaceobject] interface billinggetuserpurchaselistcallback { void onsuccess userpurchasedata data ; }; methods onsuccess callback method returning the purchase history request status void onsuccess userpurchasedata data ; privilege level public privilege http //developer samsung com/privilege/billing parameters data it includes getuserpurchaselist api result but you can't use it as it is you have to parse it as json format data code example void onsuccess data { respurchaseslist = json parse data apiresult ; if respurchaseslist cpstatus == "100000" { // implement success logic } else { // implement cancel or fail logic } } 2 9 billinggetservicecountryavailabilitycallback defines the get service country availability callback [callback = functiononly, nointerfaceobject] interface billinggetservicecountryavailabilitycallback { void onsuccess servicecountryavailabilitydata data ; }; methods onsuccess callback method returning availability of country list status void onsuccess servicecountryavailabilitydata data ; privilege level public privilege http //developer samsung com/privilege/billing parameters data it includes getservicecountryavailability api result but you can't use it as it is you have to parse it as json format data code example void onsuccess data { resservicecountryavailability = json parse data apiresult ; if resservicecountryavailability cpstatus == "100000" { // implement success logic } else { // implement cancel or fail logic } } 2 10 billingcancelsubscriptioncallback defines the subscription cancel success callback [callback = functiononly, nointerfaceobject] interface billingcancelsubscriptioncallback { void onsuccess cancelsubscriptiondata data ; }; methods onsuccess callback method returning the subscription cancel request status void onsuccess cancelsubscriptiondata data ; privilege level public privilege http //developer samsung com/privilege/billing parameters data it includes cancelsubscription api result but you can't use it as it is you have to parse it as json format data code example void onsuccess data { rescancelsubscription = json parse data apiresult ; if rescancelsubscription cpstatus == "100000" { // implement success logic } else { // implement cancel or fail logic } } 2 11 billingisserviceavailablecallback defines the service availability check success callback [callback = functiononly, nointerfaceobject] interface billingisserviceavailablecallback { void onsuccess serviceavailabledata data ; }; deprecated 5 5 methods onsuccess callback method returning the service availability check status void onsuccess serviceavailabledata data ; privilege level public privilege http //developer samsung com/privilege/billing parameters data it includes isserviceavailable api result but you can't use it as it is you have to parse it as json format data code example void onsuccess data { resjson = json parse data apiresult if resjson serviceyn == "y" { // implement success logic } else { // implement cancel or fail logic } } 3 full webidl module billing { enum tvservertype { "dev", "prd" }; enum historytype { "all", "subscription", "non-subscription" }; dictionary productslistdata { domstring apiresult; }; dictionary productslistapiresult { domstring cpstatus; domstring? cpresult; long totalcount; domstring checkvalue; itemdetails[]? itemdetails; }; dictionary itemdetails { long seq; domstring itemid; domstring itemtitle; long itemtype; long? period; long price; domstring currencyid; productsubscriptioninfo? subscriptioninfo; }; dictionary productsubscriptioninfo { domstring paymentcycleperiod; long paymentcyclefrq; long paymentcycle; }; dictionary applyinvoicedata { domstring apiresult; }; dictionary applyinvoiceapiresult { domstring cpstatus; domstring? cpresult; domstring appliedtime; }; dictionary verifyinvoicedata { domstring apiresult; }; dictionary verifyinvoiceapiresult { domstring cpstatus; domstring? cpresult; domstring appid; domstring invoiceid; }; dictionary userpurchasedata { domstring apiresult; }; dictionary getuserpurchaselistapiresult { domstring cpstatus; domstring? cpresult; long totalcount; domstring checkvalue; invoicedetails[]? invoicedetails; }; dictionary invoicedetails { long seq; domstring invoiceid; domstring itemid; domstring itemtitle; long itemtype; domstring ordertime; long? period; long price; domstring ordercurrencyid; boolean cancelstatus; boolean appliedstatus; domstring? appliedtime; domstring? limitendtime; domstring? remaintime; purchasesubscriptioninfo? subscriptioninfo; }; dictionary purchasesubscriptioninfo { domstring subscriptionid; domstring subsstarttime; domstring subsendtime; domstring subsstatus; }; dictionary servicecountryavailabilitydata { domstring apiresult; }; dictionary getservicecountryavailabilityapiresult { domstring cpstatus; domstring? cpresult; countries[]? countryavailability; }; dictionary countries { domstring countrycode; boolean isbillingsupported; }; dictionary cancelsubscriptiondata { domstring apiresult; }; dictionary cancelsubscriptionapiresult { domstring cpstatus; domstring? cpresult; domstring invoiceid; domstring? subscanceltime; domstring? subsstatus; }; dictionary showregisterpromotionalcodedata { domstring opendeeplinkresult; domstring opendeeplinkdetail; }; dictionary promotionalcodedetail { domstring appliedcouponcount; domstring[] appliedcouponlist; domstring registedbenefitcount; domstring[] registedbenefitlist; }; dictionary showregistercreditcarddata { domstring opendeeplinkresult; domstring? opendeeplinkdetail; }; dictionary showpurchasehistorydata { domstring opendeeplinkresult; domstring opendeeplinkdetail; }; dictionary purchasehistorydetail { domstring invoicerefundcount; domstring[] invoicerefundlist; domstring subscriptioncancelcount; domstring[] subscriptioncancellist; }; dictionary serviceavailabledata { domstring apiresult; }; dictionary serviceavailableapiresult { domstring status; domstring result; domstring serviceyn; }; [nointerfaceobject] interface billingmanagerobject { readonly attribute billingmanager billing; }; webapi implements billingmanagerobject; [nointerfaceobject] interface billingmanager { void buyitem domstring appid, tvservertype servertype, domstring paymentdetails, billingbuydatasuccesscallback onsuccess, optional errorcallback? onerror ; void getproductslist domstring appid, domstring countrycode, domstring pagesize, domstring pagenumber, domstring checkvalue, tvservertype servertype, billingproductslistcallback onsuccess, optional errorcallback? onerror ; void applyinvoice domstring appid, domstring customid, domstring invoiceid, domstring countrycode, tvservertype servertype, billingapplyinvoicecallback onsuccess, optional errorcallback? onerror ; void verifyinvoice domstring appid, domstring customid, domstring invoiceid, domstring countrycode, tvservertype servertype, billingverifyinvoicecallback onsuccess, optional errorcallback? onerror ; void getservicecountryavailability domstring appid, domstring[] countrycodes, domstring checkvalue, tvservertype servertype, billinggetservicecountryavailabilitycallback onsuccess, optional errorcallback? onerror ; void getuserpurchaselist domstring appid, domstring customid, domstring countrycode, domstring pagenumber, domstring checkvalue, tvservertype servertype, billinggetuserpurchaselistcallback onsuccess, optional errorcallback? onerror ; void cancelsubscription domstring appid, domstring invoiceid, domstring customid, domstring countrycode, tvservertype servertype, billingcancelsubscriptioncallback onsuccess, optional errorcallback? onerror ; void isserviceavailable tvservertype servertype, billingisserviceavailablecallback onsuccess, optional errorcallback? onerror ; domstring getversion ; }; [callback = functiononly, nointerfaceobject] interface billingbuydatasuccesscallback { void onsuccess billingbuydata data ; }; [nointerfaceobject] interface billingbuydata { attribute domstring payresult; attribute domstring paydetail; }; [callback = functiononly, nointerfaceobject] interface billingproductslistcallback { void onsuccess productslistdata data ; }; [callback = functiononly, nointerfaceobject] interface billingapplyinvoicecallback { void onsuccess applyinvoicedata data ; }; [callback = functiononly, nointerfaceobject] interface billingverifyinvoicecallback { void onsuccess verifyinvoicedata data ; }; [callback = functiononly, nointerfaceobject] interface billinggetuserpurchaselistcallback { void onsuccess userpurchasedata data ; }; [callback = functiononly, nointerfaceobject] interface billinggetservicecountryavailabilitycallback { void onsuccess servicecountryavailabilitydata data ; }; [callback = functiononly, nointerfaceobject] interface billingcancelsubscriptioncallback { void onsuccess cancelsubscriptiondata data ; }; [callback = functiononly, nointerfaceobject] interface billingisserviceavailablecallback { void onsuccess serviceavailabledata data ; }; };
Learn Developers Podcast
docgift card or something like that why? they've gone into install and sort of funded a wallet, right but the fact of the matter is, what essentially ends up happening is you have you have an experience in your game that the user feels is worth the value of paying for and again, you know, like, like, like talking about engagement in games, right? why would a user be willing to, to sort of exchange money for something in a game? and that's typically related to the user's expectation of also playing this game two weeks from now? right? yes, they're investing yeah, you're investing in your future experience in this game? right? you know, so so it's another place where this this long-term engagement becomes very important, right? but a lot of times what people are buying are like, simple things, like more lives, or an item, or whatever it is that sort of, and in some of our games that are multiplayer, we even have people playing for things that are purely sort of cosmetic, buying a different hat, because then other people can see the hat that hat, but the hat, the hat has no function, right? sure tony morelan 20 57 so it's just being able to create their own identity, you know, within that game, chris benjaminsen 21 02 it's no different than people buying clothes in the real world, you know? tony morelan 21 05 sure, sure so how do you look at your player demographics for getting the best returns on iap? chris benjaminsen 21 10 i? well, first of all, that's a per game thing right? you know, we have, we have games that appeal to 50 plus women and we have games that appeal to like, like, a young male audience right so that's, that's very individualized per game fundamentally, though, there are some there are some core mechanics that always worked really well, if you can proposition a user to, to exchange money for time yeah so something where they can progress faster if they if they put money in is typically a very strong mechanic, regardless of who the consumer is and then, like we do the thing that successful game developers, do, we spend a lot of time looking at data and looking at, you know, what are the flows that leads to a conversion? so somebody's actually putting money into the system? how do we how do we balance those metrics such that we sort of get the most statistical value of, and we use, we use tools such as ad split testing, okay, where you run, run two versions of the game at the same time, and then you measure which one performs better? and then you make that diversion that everybody plays? tony morelan 22 16 yeah, yeah, no, that's great i've heard that that is a pretty important aspect, not just in the gaming industry, but just with, you know, ads and marketing to do a b testing chris benjaminsen 22 26 yeah, we even do something it's called multi variant testing, right and we should not go into the details, but it becomes very complex very quickly tony morelan 22 33 sure, sure so what other mobile game monetization models do you consider like, you know, premium paid apps or paid user acquisitions, you had mentioned that chris benjaminsen 22 43 we did experiment a little bit with premium paid apps, but it's a very, it's a very tough market and, and it's not, it's not something where we found a lot of a lot of success, like we generally see more successful, and we can just sort of allow anyone to play the games, and not without having that limitation, right and we do both interstitial based advertisement, which is unprompted and then rewarded video type advertisement, where the user gets a reward for watching an advertisement but when a user sort of opts to watch an ad, right, you know, so you could imagine that, so this tony morelan 23 14 is during gameplay, there would be a moment where then a video would play, and they would watch that chris benjaminsen 23 18 yeah so a simple example could be you know, that you have just died yeah and you can revive by watching an advertisement and not paying a coin okay right so giving the user the choice between, say, watching an advertisement and spending a bit of time versus spending a bit of their money, right, you know, so and it's a very high value format because the user has elected to watch an advertisement so you know, the users there, yes, you know, they're engaged and they're just sitting there waiting, right? so advertisements are typically willing to pay a high price for that type of advertising tony morelan 23 54 and you'd mentioned interstitial ads so explain what that is for someone who's new to game development? chris benjaminsen 24 00 yeah so it's a bit like to have to get on television so something is happening on your screen, and then suddenly does an advertisement and something else is happening, right? you know, so it's an ad that is that is shown to the user, like interstitial technically means an advertisement that runs before something starts, right but it's used interchangeably in the games industry to mean like an ad before something starts on ad in the middle of something on that after something happened okay, we try to be cautious of using those type of advertisements sort of out of order like we don't want to interrupt a user while they're playing yeah so we will typically only put those in so like, for whatever reason, your game session has ended, and you have just elected to press play again and that's where we would put in those type of advertisements you do have games out there, which are you can imagine you're playing a solitaire game and then put an ad pops up in the middle of it right and you have to sit down wait till you can continue your game and we try to stay away from that tony morelan 24 55 i see i see what about subscriptions have you guys read any subscription models on your games? so, yeah, we've chris benjaminsen 25 00 run a, we run a few experiments here and it's a relatively new area of monetization for us but we have run experiments where our games have been sort of presented as a games club so rather than having advertisement or having, you know, purchases in the game, you can just play them completely for free if you had a subscription through a third party, right and some of our debug games to the kind of stuff we're building now definitely lends itself well towards being able to support subscriptions subscriptions to free to play games these days, mostly expresses themselves as season passes so you like buy a season pass subscription, and then you get like, extra rewards while you play for a period of time and then that time period is up and then you know, you can buy the next season pass as well, or continue your subscription or whatever it is, right you know, that's, that's the model of like, a, like a fortnight or those type of games tony morelan 25 52 got it so we've talked about in app purchase, aap, you know, there's another category to monetization called ia, which is in app advertising and i think, under that falls, the, you know, the rewarded videos, these interstitial ads have also heard of something called offer walls can you explain what is an offer wall? chris benjaminsen 26 11 yeah, we actually don't think we have any games library or footballs anywhere but it's, it's basically, you know, you can get a reward in your game for doing another action right? so again, it's user opt in the use of one something and find alpha wallets typically, like extra coins, or whatever in the game and to get a get sort of a list of different options for things they could be doing right now to have some level of value and that can go all the way from, you know, signing up to a website, all the way up to you know, committing yourself to four years of sirius xm radio in the us, oh, really, you know, or whatever right? you know, and as there's different types of reward levels of that, right so but they can be significant, right so like that it's, it's sort of a way for other companies to interact with that consumer and get them to do something that has value to them and date and pay you for that service so it's a bit sort of a direct affiliate program or something like okay, okay yeah okay tony morelan 27 11 interesting so, you know, a lot of what we talked about now have been in game, you know, advertising for monetization so what about paid user acquisition? so actually going out there and advertising for your game? so you guys are active in that area? chris benjaminsen 27 23 not particularly, it's something we are exploring, and it is something that i believe it's going to be very important for the future of frp yeah but historically, it's not something that we done to a huge extent however, it is an area where we actually partner with the samsung galaxy appstore team, where we were looking at what is the best path for somebody who is publishing on the samsung galaxy app store to find sort of pockets of uses that can be that can be purchased right? tony morelan 27 51 okay okay so of all these different ways that we've talked about when it comes to monetization, what would you say is the most effective way in why? chris benjaminsen 28 00 and so there's many answers to that what has been the most successful for frvr suffice advertisement, that has mostly down to the kind of games that we have been building historically and the kind of games we've been building historically has mostly been the result of the capabilities for the platforms, our games has been available on, which, by and large, have not supported in app purchases however, if you were to look at where is the most potential value, it's most definitely in the in-app purchase space, right? like the potential value that you can derive from a single user is larger in app purchases than any other way you can monetize that user, even with subscriptions, right? make some simple math, you know, rewarded video is considered valuable, right but if you have a player, sort of watching 1000 ads a month, that might sort of in the united states be worth $20, or thereabouts, where $20 is not an uncommon average transactions for a central user to spending in app purchases, right and people typically buy more than once sort of the opportunity to create a great business around in app purchases is much higher, and opportunity to create a great business purely from advertisement tony morelan 29 08 got it? what would you say would be some advice that you can give for a developer looking to integrate iap? chris benjaminsen 29 15 like, like, it goes back to what we talked about earlier right? you know, build deep experiences, right? sure for like engagements, yeah, long engagements, and then then allow people to buy something that they, you know, feel like they're going to get value from a long period of time right and i think an important thing there is you must be trustworthy as a developer yeah right you know, like, like, like, the player must trust you to not to screw them over so if you have all kinds of other stuff into games, where they feel cheated, they're not going to give you their money or if you cheat them, they're only going to do it once right? yeah you know, so you actually have to provide something that brings real value to the user otherwise, they're, they're not going to engage with that thing right like they're not, they're not stupid they are very clever tony morelan 29 57 yeah so let's talk about a how you guys go about acquiring games for frvr? what do you look for? chris benjaminsen 30 03 like we look for, for great teams and i think it's important here that we are publisher, right? so we work with developers who take a fair amount of that total risk of building a game sometimes you find the games, right but predominantly, we work with great teams that is passionate about the game that they're working on and that's, that's mostly what we look for okay and then we help though, those developers to go and, and build fantastic games, right but due to the nature of our platform, at least how its structured right? now, you must basically build the game from scratch on top of stuff so so we're not a publisher that can sort of accept a game that somebody's already built, and say, yeah, we'll publish that it's more sort of a cool collaborative co development process, where we work together with developers to create fantastic things that work on top of our platform tony morelan 30 51 you know, i heard somewhere that between 50 to 1000 games are added to the app store's every day so i know it's a huge competition when it comes to games what's your strategy for discoverability? chris benjaminsen 31 03 i like as we talked about, go to the user where they are, rather than trying to drag them to the app store where it's very competitive, right and, like we use, we use all the tricks including branding, like we now have significant volume of people just searching for our games every day, both in app stores and on google, right and i truly did that basic strategy of saying let's bring our games to where the users are, has been very, very successful for us, and allowed us to sort of get in front of all of these consumers without diving deep into cost positive user acquisition and things like that and dental labs though, say they're hyper competitive, it gets very, very hard to get your game there, right and people talk about all of these things like influencer, marketing, and whatever and they don't call it user acquisition, but that's just what it is right? you know, it's just a different way of doing it right you know, it's all of these hacks to try to get in front of the user tony morelan 31 54 so are you using tools like creating promotional trailer videos and posting them on youtube? chris benjaminsen 32 00 we do we do that for some of our debug games, like a game like wells frvr yeah there's like there's a content team that creates content for social media that being you know; youtube and facebook and i think we even have posts on tik tok okay, tony morelan 32 14 so you guys have a ton of experience now, when it when it comes to publishing games? i'm sure you faced a few challenges can you share some stories and how you overcame those challenges? chris benjaminsen 32 24 a lot of our challenges is around scale right? you know, so we have 70 games on 39 platforms right wow and that didn't that in itself is a big number, right? to sort of, sort of manage this, like, that's more than 2000 combinations, almost 3000 combinations, right? we also have all of those games in 20 languages so when you when you sort of factor in those combinations, that's 50,000 combinations, right? and if you want localize screenshots, yeah, that's no way you could do that with humans, right and a lot of ways we try to solve with technology, right? that's what the what the frvr platform does, okay, encapsulate just the complexity of trying to do all of these things into sort of a unified platform and that goes for what is a good experience on the samsung galaxy appstore, like the samsung galaxy appstore has specific capabilities and specific api's and specific sort of things that work particularly well on a platform and if every developer had to consider that for all the platforms we were on, they would be spending none of their time making great games so we encapsulate that complexity into our platform and that's sort of the recipe that makes frvr work that's sort of removing humans from the equation, basically, tony morelan 33 42 that's interesting i mean, i can totally see how you guys are able to scale your reach with having so many games, but you've got quite a team behind so it's not all automated, you still do need to have those employees to support that chris benjaminsen 33 56 yeah, but like, 95% of those people work on the platform, right? to build the to build the infrastructure, right and frvr is also a company that's been growing quite a lot, i think, okay, two years ago, we were we were fewer than 20 people right? so a lot of the people who actually worked at frvr now people who joined us in the last year tony morelan 34 15 so what are some of the trends that you've seen in the in the gaming industry chris benjaminsen 34 19 or hotels that there's a lot of them right you know, there's a like i think the status trend i see is when you have say and among us or a fall guys or a flappy birds come out and be successful, like, like older people who try to get success by just following that recipe right? not realizing that the reasons those game were successful originally were sort of a bit of luck and timing and typically some external factors, like among us grew with discord and discord grew it among us yeah, right and that was sort of sort of the game to play on that platform, right and all the other games in that in that category by and large failed because it was just like it and not again but that right and, and a thing i think a lot of people have forgotten is that the game industry is cyclical, right? so you get a new channel it comes out it's very cheap and easy to get users on it initially and then that's the value of that platform goes up, it just becomes more and more expensive, right and people have sort of forgotten that's how the games industry used to work because mobile came along yeah and stuck around for a very long time to do to sort of these stores that were tied to specific devices right which, which is something you didn't really have on a on a pc, where there was more open competition on who could sort of have an app store tony morelan 35 40 yeah, yeah, for sure so tell me what is in the future for frvr chris benjaminsen 35 45 a lot more high-quality games? like that's basically our focus right now we are very fortunate, we just closed out a round funding wonderful yeah, thank you and like, the entire theme of that funding is we need, we need games of a completely different quality, right? so we are we are looking for fantastic studios who can come in and build games with sort of that depth that can support in app purchases that's the thing that we really want to focus on we want to want to have games that can have people play for years, not just once, right? tony morelan 36 18 yeah so as far vr is seeing this growth, what are you guys doing related to diversity and inclusion? chris benjaminsen 36 26 and we do a lot of things, right, like diversity and inclusion is something that we try to sort of have both across our games and across our company culture, right? so it can be everything from i personally created the hex frvr game so yeah, i got a nice email from somebody said, i love this game, but it can they call us i can see the different things, right so making sure that you're aware of the different kinds of colorblind people can be sure, sure and it also it also means a lot for hiring, like, like, what's the best candidate for the job is not necessarily the person that fits the checklist, the best that you see that you put on your yeah, other requirements yeah, in like diverse teams perform better so diversity is a is a virtue in the hiring process and it can be advantageous to hire the more diverse candidate if you have an opportunity to hire too, and like, but it means a lot like you have to be mindful of it everywhere those like natural biases, right now, a simple example of that is that the more bullet points you put on a on a job post about specific requirements, the less likely it is that females would, will apply for a job interesting, like a male candidate would sort of look at a long bullet point and see two things that good and go, yeah, i could totally do this, right? where if fema will see a long list and sort of say, i can only do two of these things i shouldn't apply for this right so you have to be mindful of those things all the way tony morelan 37 52 interesting yeah, i think giving someone the opportunity to really talk about their personality, and their value is probably the best way to go about finding that that good candidate chris benjaminsen 38 02 yeah and it's a big part of our it's a big part of our sort of, sort of, sort of hiring flow is the values right? you know, we also a, a company in portugal, that doesn't behave like a portuguese company, this particular company, company structure in particular is very hierarchical, right you know, some people might call it a bit old fashioned that's not the company we are, that's not the company we want to be so we want people that resonates with sort of a more flat structure, modern ways of working tony morelan 38 34 wonderful so if someone is interested, either in working for frvr, or their a game studio that want to bring their games to you, what's the best way for them to reach out to frvr? chris benjaminsen 38 45 like, like, send me an email first, right? you know, and, you know, i'll redirect you to the right person, my email is chris@frvr com so it's fairly straightforward, right? like, always happy to chat with people who do fantastic things tony morelan 38 57 yeah, that's great and we'll include links in the show notes too much about what we talked about today and into frvr websites so chris, i got to say, it was great to have you on the podcast i love learning all about frvr and what you guys are doing but let me ask when you're not working for frp or what is it that you'd like to do for fun? chris benjaminsen 39 15 i find most of my spare time is taken up by you know, walking the dog, or, you know, cooking food if it's some like i'm probably not good at cooking food in the winter but you know, like i like to grill outdoors and whatever right you know, and i actually try to keep a fairly strict work life balance wonderful so you know i am one of the people who like go into the office but mostly yes a way to not work while i'm at home tony morelan 39 40 that's great well hey, we're just about to hit the springtime of the year and soon will come summer so i'm sure you're going to enjoy lots of outdoor grilling when the when the season comes chris benjaminsen 39 49 hopefully, you never know where they're somewhere in london right? you know, that might be like two days where it's impossible that's tony morelan 39 56 awesome hey, chris, really appreciate you coming on the podcast today chris benjaminsen 39 59 no, thank do so much for having me closing 40 01 looking to start creating for samsung, download the latest tools to code your next app, or get software for designing apps without coding it all sell your apps to the world on the samsung galaxy store check out developer samsung com today and start your journey with samsung tony morelan 40 17 the samsung developers podcast is hosted by tony morelan and produced by jeanne hsu
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.
These cookies gather information about your browser habits. They remember that you've visited our website and share this information with other organizations such as advertisers.
You have successfully updated your cookie preferences.