複数の国をサポートするアプリのアプリ内購入を実装しています。
アプリ内課金バージョン3 API それを主張する :
通貨の変換やフォーマットは必要ありません。価格はユーザーの通貨で報告され、ロケールに応じてフォーマットされます。
これは 実際にはtrue です。これは、skuGetDetails()
が必要なすべてのフォーマットを処理するためです。応答には、price
というフィールドが含まれています。
通貨記号を含む、アイテムのフォーマットされた価格。価格には税が含まれていません。
ただし、ISO 4217通貨コード(店舗のロケールがわかっている場合に取得可能)と実際のフォーマットされていない価格(最適にはfloatまたはdecimal変数)が必要なので、自分でさらに処理と分析を行うことができます。
多くの国が同じ通貨記号を共有しているため、skuGetDetails()
の戻り値を解析することは信頼できる考えではありません。
アプリ内課金バージョン3 APIを使用して、アプリ内購入のISO 4217通貨コードとフォーマットされていない価格を取得するにはどうすればよいですか?
完全な情報は 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マイクロ単位は、通貨の1単位に相当します。たとえば、価格が「7.99ユーロ」の場合、price_amount_microsは「7990000」になります。
できません。これは現在サポートされていません。機能のリクエストがありますが、実装される場合とされない場合があります。
あなたはできる。以下のように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; } }
これが私の回避策です:)
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();
これを確認できますAndroid一部の国のデベロッパーは、GoogleウォレットMerchant Centerを介して複数の通貨でアプリを販売できるようになりました。追加の通貨でアプリを販売するには、価格を設定する必要がありますアプリは各国/通貨でサポートされています。サポートされている国/通貨のリストはヘルプセンターでご覧いただけます。
アプリを現地通貨で利用できるようにすると、Google Playの顧客には、その通貨で販売されているアプリのみが表示されます。顧客には現地通貨で請求されますが、支払いはGoogleウォレットMerchant Centerアカウントで設定された通貨で発行されます。
とても簡単です。 SKUは通貨コード(「price_currency_code」フィールド)を返します。そのコードを使用すると、Currencyクラスを使用してシンボルを取得できます。添付のコードを参照してください。
String currencyCode = skuObj.getString("price_currency_code");
currencySymbol = Currency.getInstance(currencyCode).getSymbol();
別のハードコードされた回避策は、同じ記号が付いている国のアイテムに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で割り、通貨と連結するだけです。