如何获取应用内购买的单独价格和货币信息?

时间:2013-06-11 07:57:26

标签: android in-app-purchase in-app-billing

我正在为支持多个国家/地区的应用实施应用内购买。

应用内结算第3版API claims that

  

无需进行货币换算或格式化:报告价格   以用户的货币显示并根据其区域设置进行格式化。

这是actually true,因为skuGetDetails()会处理所有必要的格式。响应包括一个名为price的字段,其中包含

  

商品的格式化价格,包括其货币符号。价格不含税。

但是,我需要ISO 4217货币代码(如果我知道商店区域设置可检索)和实际的非格式化价格(最好是浮点数或小数变量),所以我可以自己做进一步的处理和分析。

解析skuGetDetails()的回报不是一个可靠的想法,因为许多国家/地区共享相同的货币符号。

Currencies

如何使用应用内结算版本3 API获取应用内购买的ISO 4217货币代码和非格式化价格?

8 个答案:

答案 0 :(得分:16)

可以找到完整的信息here,但基本上在2014年8月,这已通过以下方式解决:

getSkuDetails()方法

此方法返回产品ID列表的产品详细信息。在Google Play发送的响应包中,查询结果存储在映射到DETAILS_LIST键的String ArrayList中。详细信息列表中的每个字符串都包含JSON格式的单个产品的产品详细信息。带有产品详细信息的JSON字符串中的字段总结如下

price_currency_code ISO 4217价格的货币代码。例如,如果以英镑英镑指定价格,则price_currency_code为" GBP"。

price_amount_micros 微单位价格,其中1,000,000个微单位等于一个单位的货币。例如,如果价格为"€7.99",price_amount_micros为" 7990000"。

答案 1 :(得分:12)

您不能,目前不支持此功能。有一个功能请求,但它可能会或可能不会实现。

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

答案 2 :(得分:8)

你可以。您需要像下面一样修改SkuDetails.java。

步骤:

  1. 检查他们的示例应用以获取应用内结算。
  2. 修改SkuDetails.java文件,如下所示:
  3. 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;
        } 
    }
    

答案 3 :(得分:3)

这是我的解决方法:)

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

用法:

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

答案 4 :(得分:0)

您可以查看此内容  部分国家/地区的Android开发者现在可以通过Google Wallet Merchant Center以多种货币销售应用。要以其他货币销售您的应用,您需要在每个国家/货币中设置应用的价格。我们的帮助中心提供了受支持的国家/货币列表。

如果您使用当地货币制作应用,Google Play客户只会看到以该货币销售的应用。客户将以当地货币收费,但付款将以您的Google电子钱包商户中心帐户设置的货币发放。

答案 5 :(得分:0)

另一种硬编码的解决方法是为具有相同符号的国家/地区的商品定价,不同的是一美分左右。当您在购买时从Google Play中检索商品的价格时,您知道检索到的货币符号是在许多国家/地区使用的符号。 $。然后,您的后端服务器上会显示不同价格的日志,并将购买价格与特定国家/地区相关联。

答案 6 :(得分:0)

很简单。 SKU返回货币代码(" price_currency_code"字段)。使用该代码,您可以使用Currency类检索符号。 请参阅附带的代码:

Toggle 'Skip Tests' Mode

答案 7 :(得分:0)

这是完整的代码:

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

摘自文档:

  

price_currency_code价格的ISO 4217货币代码。例如,如果   价格以英镑指定,price_currency_code为   “ GBP”。

     

price_amount_micros微单位价格,其中1,000,000微单位   等于一单位货币。例如,如果价格为“€7.99”,   price_amount_micros是“ 7990000”。此值代表本地化的   特定货币的四舍五入价格。

现在,您只需要将price_amount_micros除以1000000,然后将其与货币连接即可。