web-dev-qa-db-fra.com

Comment obtenir des informations distinctes sur les prix et les devises pour un achat intégré?

J'implémente les achats intégrés pour une application prenant en charge plusieurs pays.

L'API Version 3 de facturation intégrée à l'application affirme que :

Aucune conversion ou formatage de devise n'est nécessaire: les prix sont indiqués dans la devise de l'utilisateur et formaté en fonction de ses paramètres régionaux.

C'est en réalité vrai , puisque skuGetDetails() prend en charge tous les formats nécessaires. La réponse comprend un champ appelé price, qui contient le

Prix ​​formaté de l'article, y compris son symbole monétaire. Le prix n'inclut pas les taxes.

Cependant, j'ai besoin du code de devise ISO 4217 (récupérable si je connais les paramètres régionaux du magasin) et du prix réel non formaté (de manière optimale dans une variable décimale ou à virgule flottante) pour pouvoir effectuer le traitement et l'analyse ultérieurement.

Analyser le retour de skuGetDetails() n'est pas une idée fiable, car de nombreux pays partagent les mêmes symboles monétaires.

Currencies

Comment puis-je obtenir le code de devise ISO 4217 et le prix non formaté d'un achat intégré à l'application avec l'API de facturation intégrée à la version 3?

26
Panda Pajama

Des informations complètes peuvent être trouvées ici , mais essentiellement en août 2014, ceci a été résolu avec:

La méthode getSkuDetails ()

Cette méthode renvoie les détails du produit pour une liste d'ID de produit. Dans le paquet de réponses envoyé par Google Play, les résultats de la requête sont stockés dans une chaîne ArrayList mappée sur la clé DETAILS_LIST. produit unique au format JSON. Les champs de la chaîne JSON contenant les détails du produit sont récapitulés ci-après}

price_currency_code Code de devise ISO 4217 pour le prix. Par exemple, si le prix est spécifié en livres sterling, price_currency_code est "GBP".

price_amount_micros Prix en micro-unités, où 1 000 000 de micro-unités correspondent à une unité de devise. Par exemple, si le prix est "7,99 €", price_amount_micros est "7990000".

15
Steven Craft

Vous ne pouvez pas, ceci n'est actuellement pas supporté. Il y a une demande de fonctionnalité pour cela, mais cela peut ou peut ne pas être implémenté. 

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

12
Nikolay Elenkov

Vous pouvez. Vous devez modifier SkuDetails.Java comme ci-dessous. 

Pas:

  1. Consultez leur exemple d'application pour la facturation intégrée.
  2. Modifiez le fichier SkuDetails.Java comme suit:
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

Voici ma solution de contournement :)

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();
3
Gil SH

Vous pouvez vérifier cela Les développeurs Android de certains pays peuvent désormais proposer des applications en vente dans plusieurs devises via Google Wallet Merchant Center. Pour vendre vos applications dans des devises supplémentaires, vous devez définir le prix de l'application dans chaque pays/devise. Une liste des pays/devises pris en charge est disponible dans notre centre d'aide.

Si vous rendez une application disponible dans la devise locale, les clients de Google Play ne la verront qu'en vente dans cette devise. Les clients seront facturés dans leur devise locale, mais le paiement sera émis dans la devise définie dans votre compte Google Wallet Merchant Center.

0
user2630741

Une autre solution de contournement codé en dur consiste à tarifer les éléments pour les pays ayant le même symbole, différemment d'un centime environ. Lorsque vous récupérez le prix de l'article sur Google Play lors de l'achat et que vous savez que le symbole de devise récupéré est celui qui est utilisé dans de nombreux pays, par exemple. $. Vous avez ensuite un journal de prix différents sur votre serveur principal et vous corrélez le prix d'achat avec un pays spécifique.

0
Codelicious

Voici un code complet: 

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

De la documentation:

price_currency_code Code de devise ISO 4217 pour le prix. Par exemple, si price est spécifié en livres sterling britanniques, price_currency_code est "GBP".

price_amount_micros Prix en micro-unités, où 1 000 000 de micro-unités égale une unité de la monnaie. Par exemple, si le prix est "7,99 €", prix_amount_micros est "7990000". Cette valeur représente le localisé, prix arrondi pour une devise particulière.

Il ne vous reste plus qu'à diviser price_amount_micros par un 1000000 et le concaténer avec la devise. 

0
Makalele