web-dev-qa-db-ja.com

アプリ内購入の個別の価格と通貨情報を取得するにはどうすればよいですか?

複数の国をサポートするアプリのアプリ内購入を実装しています。

アプリ内課金バージョン3 API それを主張する

通貨の変換やフォーマットは必要ありません。価格はユーザーの通貨で報告され、ロケールに応じてフォーマットされます。

これは 実際にはtrue です。これは、skuGetDetails()が必要なすべてのフォーマットを処理するためです。応答には、priceというフィールドが含まれています。

通貨記号を含む、アイテムのフォーマットされた価格。価格には税が含まれていません。

ただし、ISO 4217通貨コード(店舗のロケールがわかっている場合に取得可能)と実際のフォーマットされていない価格(最適にはfloatまたはdecimal変数)が必要なので、自分でさらに処理と分析を行うことができます。

多くの国が同じ通貨記号を共有しているため、skuGetDetails()の戻り値を解析することは信頼できる考えではありません。

Currencies

アプリ内課金バージョン3 APIを使用して、アプリ内購入のISO 4217通貨コードとフォーマットされていない価格を取得するにはどうすればよいですか?

26
Panda Pajama

完全な情報は 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」になります。

17
Steven Craft

できません。これは現在サポートされていません。機能のリクエストがありますが、実装される場合とされない場合があります。

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

12
Nikolay Elenkov

あなたはできる。以下のように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;
    } 
}
8
marbdq

これが私の回避策です:)

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();
3
Gil SH

これを確認できますAndroid一部の国のデベロッパーは、GoogleウォレットMerchant Centerを介して複数の通貨でアプリを販売できるようになりました。追加の通貨でアプリを販売するには、価格を設定する必要がありますアプリは各国/通貨でサポートされています。サポートされている国/通貨のリストはヘルプセンターでご覧いただけます。

アプリを現地通貨で利用できるようにすると、Google Playの顧客には、その通貨で販売されているアプリのみが表示されます。顧客には現地通貨で請求されますが、支払いはGoogleウォレットMerchant Centerアカウントで設定された通貨で発行されます。

0
user2630741

とても簡単です。 SKUは通貨コード(「price_currency_code」フィールド)を返します。そのコードを使用すると、Currencyクラスを使用してシンボルを取得できます。添付のコードを参照してください。

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

別のハードコードされた回避策は、同じ記号が付いている国のアイテムに1セント程度異なる価格を設定することです。購入時にグーグルプレイからアイテムの価格を取得し、取得した通貨記号が多くの国で使用されているものであることがわかっている場合。 $。その後、バックエンドサーバーにさまざまな価格のログがあり、購入価格を特定の国と関連付けます。

0
Codelicious

ここに完全なコードがあります:

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で割り、通貨と連結するだけです。

0
Makalele