【问题标题】:How to get separate price and currency information for an in-app purchase?如何获取应用内购买的单独价格和货币信息?
【发布时间】:2013-06-11 07:57:26
【问题描述】:

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

应用内计费版本 3 API claims that

无需进行货币转换或格式化:报告价格 使用用户的货币并根据他们的区域设置格式。

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

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

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

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

如何使用 In-App Billing Version 3 API 获取应用内购买的 ISO 4217 货币代码和非格式化价格?

【问题讨论】:

  • 帮我理解你为什么需要这个? .. //顺便提一句。据我所知,您可以在开发者控制台中为每个国家/地区声明不同的价格..
  • @AlexanderSidikov:我需要这个来对应用内购买信息进行分析。正如接受的答案所述,目前这是不可能的,所以这回答了我的问题。我不知道为什么要为这个问题设置赏金......
  • @AlexanderSidikov:我们的 IAP 分析系统完全独立于实际的 IAP 系统。我们在整个组织中对多个平台上的多个产品使用相同的分析系统。如果将信息直接从客户端设备发送到分析服务器,那么收集信息要比为每个平台的每个产品实施定制解决方案要容易得多。有可能,但不实用。例如,在 iOS 中,您可以在 SKProduct.priceLocale 中获取商店的区域设置,然后您可以使用 objectForKey:NSLocaleCurrencyCode 获取货币代码。
  • @AlexanderSidikov:事实上,获取商店区域设置以及从商店区域设置生成货币代码的方法(就像在 iOS 中一样)将是最佳选择。您可以将语言环境用于其他花哨的东西,例如数字和日期格式,然后您最终可以像 API 一样使用它来生成格式化的价格。

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


【解决方案1】:

可以在here 找到完整信息,但基本上在 2014 年 8 月解决了这个问题:

getSkuDetails() 方法

此方法返回产品 ID 列表的产品详细信息。在 Google Play 发送的响应 Bundle 中,查询结果存储在映射到 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”。

【讨论】:

  • 是的,我已经知道了,并且在一些 cmets 中提到过。但是,我正在将接受的答案更改为这个答案,因为它是最准确地反映当前情况的答案。
【解决方案2】:

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

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

【讨论】:

  • 好像终于实现了
【解决方案3】:

你可以。您需要修改 SkuDetails.java,如下所示。

步骤:

  1. 查看他们的示例应用以了解应用内计费。
  2. 修改SkuDetails.java文件如下:
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;
    } 
}

【讨论】:

  • 比起改代码,我觉得解释背后的原因更重要。 2014 年 8 月左右,计费 API 发生了变化,在 getSkuDetails() 返回值中引入了一个新字段:price_currency_code。这一变化最终使得获取特定交易的货币代码成为可能。
【解决方案4】:

这是我的解决方法:)

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();

【讨论】:

  • 加一:有趣的解决方法。但是是否存在使用相同符号的货币可能会导致错误?
【解决方案5】:

非常简单。 SKU 返回货币代码(“price_currency_code”字段)。使用该代码,您可以使用 Currency 类检索符号。 见附件代码:

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

【讨论】:

    【解决方案6】:

    这是一个完整的代码:

    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 为 “英镑”。

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

    现在您只需将 price_amount_micros 除以 1000000 并将其与货币连接。

    【讨论】:

      【解决方案7】:

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

      如果您以当地货币提供应用,Google Play 客户将只能看到以该货币出售的应用。系统将按客户的当地货币向客户收取费用,但付款将以您在 Google Wallet Merchant Center 帐户中设置的货币支付。

      【讨论】:

      • 好的,这如何帮助我获得所售商品的 ISO 4217 货币代码?
      【解决方案8】:

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

      【讨论】:

        猜你喜欢
        • 2015-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多