27

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

In-App Billing Version 3 API声称

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

实际上是正确的,因为skuGetDetails()它会处理所有必要的格式。响应包含一个名为 的字段price,其中包含

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

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

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

货币

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

4

8 回答 8

21

完整的信息可以在这里找到,但基本上在 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 微单位等于 1 个货币单位。例如,如果价格为“€7.99”,则 price_amount_micros 为“7990000”。

于 2015-04-08T08:50:15.590 回答
13

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

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

于 2013-06-11T08:53:09.787 回答
8

你可以。您需要修改 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-10-10T10:48:28.360 回答
5

这是我的解决方法:)

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();
于 2013-09-08T18:22:24.700 回答
2

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

String currencyCode = skuObj.getString("price_currency_code");
currencySymbol = Currency.getInstance(currencyCode).getSymbol();
于 2016-04-12T08:28:11.410 回答
1

这是一个完整的代码:

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 微单位等于 1 个货币单位。例如,如果价格为“€7.99”,则 price_amount_micros 为“7990000”。此值表示特定货币的本地化、四舍五入价格。

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

于 2018-12-11T12:47:30.727 回答
0

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

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

于 2013-08-01T11:13:30.153 回答
0

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

于 2014-02-24T09:50:07.283 回答