2013-06-11 10 views
24

Sto implementando acquisti in-app per un'applicazione con supporto per diversi paesi.Come ottenere informazioni separate su prezzo e valuta per un acquisto in-app?

La fatturazione in-app Versione 3 API claims that: è necessario

Nessuna conversione di valuta o formattazione: i prezzi sono riportati nella valuta dell'utente e formattati in base alla loro localizzazione.

Questo è actually true, dal skuGetDetails() si occupa di tutta la formattazione necessaria. La risposta include un campo denominato price, che contiene lo

Prezzo formattato dell'articolo, incluso il suo segno di valuta. Il prezzo non include le tasse.

Tuttavia, ho bisogno del codice ISO 4217 (recuperabili se conosco il locale negozio) e il prezzo non formattato reale (in modo ottimale in un galleggiante o variabile decimale) in modo che io possa fare ulteriore elaborazione e analisi me stesso.

L'analisi della restituzione di skuGetDetails() non è un'idea affidabile, poiché molti paesi condividono gli stessi simboli di valuta.

Currencies

Come posso ottenere il codice valuta ISO 4217 ed il prezzo non formattata di un acquisto in-app con l'in-app Billing versione 3 API?

+0

aiutarmi a capire perché ne avete bisogno? .. // btw. puoi dichiarare nella console degli sviluppatori per ogni paese un prezzo diverso come lo so .. –

+0

@AlexanderSidikov: ho bisogno di questo per eseguire analisi sui dati di acquisto in-app. Come afferma la risposta accettata, questo non è attualmente possibile, in modo che risponda alla mia domanda. Non so perché sia ​​stata creata una taglia per questa domanda ... –

+0

@AlexanderSidikov: Il nostro sistema di analisi IAP è completamente separato dall'effettivo sistema IAP. Utilizziamo lo stesso sistema di analisi in tutta l'organizzazione per diversi prodotti su più piattaforme. È molto più facile raccogliere informazioni se vengono inviate direttamente dal dispositivo client ai server di analisi piuttosto che implementare una soluzione personalizzata per ciascun prodotto per ciascuna piattaforma. È possibile, ma non pratico. Ad esempio, in iOS è possibile ottenere le impostazioni locali del negozio in 'SKProduct.priceLocale', che è possibile utilizzare per ottenere il codice valuta con' objectForKey: NSLocaleCurrencyCode'. –

risposta

13

Le informazioni complete si trovano here, ma essenzialmente nel mese di agosto 2014, è stato risolto con:

I getSkuDetails () metodo

Questo metodo restituisce s dettagli del prodotto per un elenco di ID prodotto. Nel pacchetto di risposta inviato da Google Play, i risultati della query vengono archiviati in un ArrayList stringa mappato alla chiave DETAILS_LIST. Ogni stringa nell'elenco dettagli contiene i dettagli del prodotto per un singolo prodotto in formato JSON. I campi nella stringa JSON con i dettagli del prodotto sono riassunti di seguito

price_currency_code ISO 4217 codice valuta per prezzo. Ad esempio, se il prezzo è specificato in sterline britanniche, price_currency_code è "GBP".

price_amount_micros Prezzo in micro-unità, dove 1.000.000 micro-unità equivalgono a un'unità della valuta. Ad esempio, se il prezzo è "€ 7,99", price_amount_micros è "7990000".

+0

Sì, lo sapevo già, e lo menzionavo in alcuni commenti. Tuttavia, sto cambiando la risposta accettata a questa, poiché è quella che riflette più accuratamente lo stato attuale della situazione. –

0

È possibile controllare questo Gli sviluppatori Android di Paesi possono ora offrire applicazioni in vendita in più valute tramite Google Wallet Merchant Center. Per vendere le tue app in valute aggiuntive, dovrai impostare il prezzo dell'app in ciascun paese/valuta. Un elenco di paesi/valute supportate è disponibile nel nostro Centro assistenza.

Se si rende disponibile un'app in valuta locale, i clienti di Google Play vedranno l'app in vendita solo in quella valuta. I clienti verranno addebitati nella loro valuta locale, ma il pagamento verrà emesso nella valuta impostata nel tuo account Merchant Center di Google Wallet.

+0

Prova e fornisci il link da dove leggi anche questo ... – NREZ

+3

Ok, e in che modo questo mi aiuta a ottenere il codice di valuta ISO 4217 dell'elemento venduto? –

2

Qui è la mia soluzione :)

private static Locale findLocale(String price) { 
    for (Locale locale : Locale.getAvailableLocales()){ 
     try { 
      Currency currency = Currency.getInstance(locale); 
      if (price.endsWith(currency.getSymbol())) 
       return locale; 
     }catch (Exception e){ 

     } 

    } 
    return null; 
} 

Usage:

Locale locale = findLocale(price); 
String currency = Currency.getInstance(locale).getCurrencyCode(); 
double priceClean = NumberFormat.getCurrencyInstance(locale).parse(price).doubleValue(); 
+1

Più uno: soluzione alternativa interessante. Ma ci sono valute che usano lo stesso simbolo che potrebbero portare a errori? – sjkm

0

Un'altra soluzione è quella di hardcoded voci di prezzo per i paesi con lo stesso simbolo, in modo diverso da un centesimo o giù di lì. Quando recuperi il prezzo dell'articolo da Google Play al momento dell'acquisto e sai che il simbolo di valuta recuperato è uno che viene utilizzato in molti paesi, ad esempio. $. Quindi hai un registro di prezzi diversi sul tuo server di back-end e corri- sponde il prezzo di acquisto a un paese specifico.

8

È possibile. Devi modificare SkuDetails.java come di seguito.

Passi:

  1. controllare la loro applicazione di esempio per la fatturazione in-app.
  2. Modificare il file SkuDetails.java come segue:
import org.json.JSONException; import org.json.JSONObject; 

/** 
* Represents an in-app product's listing details. 
*/ 
public class SkuDetails { 
    String mItemType; 
    String mSku; 
    String mType; 
    int mPriceAmountMicros; 
    String mPriceCurrencyCode; 
    String mPrice; 
    String mTitle; 
    String mDescription; 
    String mJson; 

    public SkuDetails(String jsonSkuDetails) throws JSONException { 
     this(IabHelper.ITEM_TYPE_INAPP, jsonSkuDetails); 
    } 

    public SkuDetails(String itemType, String jsonSkuDetails) throws JSONException { 
     mItemType = itemType; 
     mJson = jsonSkuDetails; 
     JSONObject o = new JSONObject(mJson); 
     mSku = o.optString("productId"); 
     mType = o.optString("type"); 
     mPrice = o.optString("price"); 
     mPriceAmountMicros = o.optInt("price_amount_micros"); 
     mPriceCurrencyCode = o.optString("price_currency_code"); 
     mTitle = o.optString("title"); 
     mDescription = o.optString("description"); 
    } 

    public String getSku() { return mSku; } 
    public String getType() { return mType; } 
    public String getPrice() { return mPrice; } 
    public String getTitle() { return mTitle; } 
    public String getDescription() { return mDescription; } 
    public int getPriceAmountMicros() { return mPriceAmountMicros; } 
    public String getPriceCurrencyCode() { return mPriceCurrencyCode; } 

    @Override 
    public String toString() { 
     return "SkuDetails:" + mJson; 
    } 
} 
+2

Più che cambiare il codice, penso che spiegare il ragionamento alla base sia più importante.Intorno ad agosto 2014, una modifica dell'API di fatturazione ha introdotto un nuovo campo nel valore restituito 'getSkuDetails()': price_currency_code'. Questo cambiamento ha finalmente reso possibile ottenere il codice valuta di una particolare transazione. –

-1

Molto semplice. SKU restituisce il codice valuta (campo "price_currency_code"). Con quel codice puoi recuperare il simbolo usando la classe Valuta. Vedere il codice allegato:

String currencyCode = skuObj.getString("price_currency_code"); 
currencySymbol = Currency.getInstance(currencyCode).getSymbol();