it-swarm.com.de

Wie erhalte ich separate Preis- und Währungsinformationen für einen In-App-Kauf?

Ich führe In-App-Käufe für eine App mit Unterstützung für mehrere Länder durch.

Die In-App-Abrechnungs-API Version 3 behauptet, dass :

Es ist keine Währungsumrechnung oder Formatierung erforderlich: Die Preise werden in der Währung des Benutzers angegeben und entsprechend der Ländereinstellung formatiert.

Dies ist eigentlich wahr , da skuGetDetails() sich um alle notwendigen Formatierungen kümmert. Die Antwort enthält ein Feld namens price, das die enthält

Formatierter Preis des Artikels, einschließlich des Währungszeichens. Der Preis beinhaltet keine Steuern.

Ich benötige jedoch den ISO 4217-Währungscode (abrufbar, wenn ich das Gebietsschema des Geschäfts kenne) und den tatsächlichen, nicht formatierten Preis (optimal in einer Gleitkomma- oder Dezimalvariablen), damit ich mich selbst weiterbearbeiten und analysieren kann.

Das Parsen der Rückkehr von skuGetDetails() ist keine verlässliche Idee, da viele Länder dieselben Währungssymbole verwenden.

Currencies

Wie kann ich den ISO 4217-Währungscode und den nicht formatierten Preis eines In-App-Kaufs mit der In-App Billing Version 3-API erhalten?

26
Panda Pajama

Vollständige Informationen finden Sie hier , aber im Wesentlichen im August 2014 wurde dies mit folgendem behoben:

Die getSkuDetails () -Methode

Diese Methode gibt Produktdetails für eine Liste von Produkt-IDs zurück. In dem von Google Play gesendeten Antwort-Bundle werden die Abfrageergebnisse in einer String-ArrayList gespeichert, die dem Schlüssel DETAILS_LIST zugeordnet ist. Jeder String in der Detailliste enthält Produktdetails für a Einzelprodukt im JSON-Format. Die Felder in der JSON-Zeichenfolge mit den Produktdetails sind unten zusammengefasst.

price_currency_code ISO 4217-Währungscode für den Preis. Wenn der Preis beispielsweise in britischen Pfund angegeben ist, lautet price_currency_code "GBP".

price_amount_micros Preis in Mikroeinheiten, wobei 1.000.000 Mikroeinheiten einer Einheit der Währung entsprechen. Wenn der Preis beispielsweise "7,99 €" beträgt, ist price_amount_micros "7990000".

15
Steven Craft

Das geht nicht, das wird momentan nicht unterstützt. Es gibt eine Funktionsanforderung dafür, aber es kann implementiert werden oder nicht. 

https://code.google.com/p/marketbilling/issues/detail?id=93

12
Nikolay Elenkov

Sie können. Sie müssen SkuDetails.Java wie unten beschrieben ändern. 

Schritte:

  1. Überprüfen Sie ihre Beispiel-App auf In-App-Abrechnung.
  2. Ändern Sie die Datei SkuDetails.Java wie folgt:
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;
    } 
}
8
marbdq

Hier ist mein Workaround :)

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;
}

Verwendungszweck:

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

Sie können dies überprüfen Android-Entwickler in ausgewählten Ländern können Apps jetzt in mehreren Währungen über das Google Wallet Merchant Center zum Verkauf anbieten. Um Ihre Apps in weiteren Währungen zu verkaufen, müssen Sie den Preis der App in jedem Land/jeder Währung festlegen. Eine Liste der unterstützten Länder/Währungen finden Sie in unserer Hilfe.

Wenn Sie eine App in lokaler Währung verfügbar machen, wird Google Play-Kunden die App nur in dieser Währung zum Verkauf angeboten. Kunden werden in ihrer lokalen Währung belastet, die Zahlung erfolgt jedoch in der Währung, die in Ihrem Google Wallet Merchant Center-Konto festgelegt ist.

0
user2630741

Sehr einfach. SKU gibt den Währungscode zurück (Feld "price_currency_code"). Mit diesem Code können Sie das Symbol mithilfe der Währungsklasse abrufen. Siehe den beigefügten Code:

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

Eine andere hardwaremäßige Problemumgehung besteht darin, Artikel für Länder mit dem gleichen Symbol anders als einen Cent zu bewerten. Wenn Sie beim Kauf den Preis des Artikels von Google Play abrufen und wissen, dass das abgerufene Währungssymbol in vielen Ländern verwendet wird, z. $. Sie haben dann ein Protokoll mit unterschiedlichen Preisen auf Ihrem Backend-Server und korrelieren den Kaufpreis mit einem bestimmten Land.

0
Codelicious

Hier ist ein vollständiger Code: 

ArrayList<String> skuList = new ArrayList<>();
skuList.add("foo");
skuList.add("bar");

final String[] prices = new String[skuList.size()];

Bundle querySkus = new Bundle();
querySkus.putStringArrayList("ITEM_ID_LIST", skuList);

Bundle skuDetails = _appActivity.mService.getSkuDetails(3, _appActivity.getPackageName(), "inapp", querySkus);

int response = skuDetails.getInt("RESPONSE_CODE");
if(response == 0) {
    ArrayList<String> responseList = skuDetails.getStringArrayList("DETAILS_LIST");

    int i = 0;
    for (String thisResponse : responseList) {
        JSONObject object = new JSONObject(thisResponse);
        String sku = object.getString("productId");
        final String priceCurrency = object.getString("price_currency_code");
        String priceAmountMicros = object.getString("price_amount_micros");
        float priceAmount = Float.parseFloat(priceAmountMicros) / 1000000.0f;
        String price = priceAmount + " " + priceCurrency;

        if(skuList.contains(sku)){
            prices[i] = price;
            i++;
        }
    }
}

Aus der Dokumentation:

price_currency_code ISO 4217-Währungscode für den Preis. Wenn zum Beispiel Preis in britischen Pfund Sterling angegeben ist, lautet price_currency_code "GBP".

price_amount_micros Preis in Mikroeinheiten, wobei 1.000.000 Mikroeinheiten einer Währungseinheit entsprechen. Wenn der Preis beispielsweise "€ 7,99" beträgt, ist Price_amount_micros "7990000". Dieser Wert repräsentiert den lokalisierten, Gerundeten Preis für eine bestimmte Währung.

Jetzt müssen Sie price_amount_micros nur durch eine 1000000 dividieren und mit Währung verketten. 

0
Makalele