我正在为支持多个国家/地区的应用实施应用内购买。
应用内结算第3版API claims that:
无需进行货币换算或格式化:报告价格 以用户的货币显示并根据其区域设置进行格式化。
这是actually true,因为skuGetDetails()
会处理所有必要的格式。响应包括一个名为price
的字段,其中包含
商品的格式化价格,包括其货币符号。价格不含税。
但是,我需要ISO 4217货币代码(如果我知道商店区域设置可检索)和实际的非格式化价格(最好是浮点数或小数变量),所以我可以自己做进一步的处理和分析。
解析skuGetDetails()
的回报不是一个可靠的想法,因为许多国家/地区共享相同的货币符号。
如何使用应用内结算版本3 API获取应用内购买的ISO 4217货币代码和非格式化价格?
答案 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)
您不能,目前不支持此功能。有一个功能请求,但它可能会或可能不会实现。
答案 2 :(得分:8)
你可以。您需要像下面一样修改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; } }
答案 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,然后将其与货币连接即可。