質問

していましたAndroidアプリで購入することを アプリ内-料金.項目をご購入の取引できるので、紙とAndroidマーケット、電話で使用するアプリです。かながらプレーする必要がありま私のサーバーを認識することがポイントで購入できます。この決定をアプリ固有のデータとなるべき自分のサーバーではなく、顧客のアプリです。

E.g.

  1. ユーザーの購入品目Xから拡大するスマートフォン市場にお
  2. 取引データをYに送信されます。
  3. お客様に送る私のサーバーです。
  4. ご依頼のサーバへのコンテンツX
  5. サーバのコンテンツを提供 の場合は、有効.どのようにこの成?

Q: いることを確認の取引データからのAndroidクライアントと思われるからGoogleのサーバ)が偽造?I.。ハんを生成します。

Googleサーバー->Androidクライアント->このサーバ->Androidア

これはPHPの問題は他の何よりも優先されます。何をすべき私のサーバスクリプトサポートに対するコミットメントいにあることを確認するために取得したデータは真実なのか?

役に立ちましたか?

解決

利用openssl_verify($デ$、$key)

変数$データや$署名すべきから送信されたandroidアphpサーバーを使用*https.この取引は含まれます。それを自前のサーバーとなりますのでご了承ください、取引に関するサービスです。(ドキュメンテーションを参照のこ http://developer.android.com/guide/market/billing/billing_integrate.html)

変数$keyはすでにgoogleアカウントのユーザの公開鍵からご出版機関の口座からのライセンスおよびアプリ内課金パネルです。コピーの公開鍵を使用するphpのコードは、好ましくは利用設定ファイルのインストールすごサーバーではなく実際にphpのコードです。

場合にはopenssl_verify話が成功するべき店舗の順番の番号をごサーバーを確実になることもできません再生.であったこと等により、単一のデータを受領し、署名のペアが含まれる場合があるために多くの注文数が普通です。

他のヒント

使用しました AndroidBillingLibrary.

それをEclipseでプロジェクトとしてインストールし、プロジェクトにライブラリとしてインポートします。

BillingController.IconFigurationを実装しました

import net.robotmedia.billing.BillingController;

public class PhoneBillingConfiguration implements BillingController.IConfiguration{
    @Override
    public byte[] getObfuscationSalt() {
        return new byte[] {1,-2,3,4,-5,6,-7,theseshouldallberandombyteshere,8,-9,0};
    }

    @Override
    public String getPublicKey() {
        return "superlongstringhereIforgothowwemadethis";
    }
}

その後、アプリケーションのために拡張しました Application:

public class LocalizedApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

//      BillingController.setDebug(true);
        BillingController.setConfiguration(new PhoneBillingConfiguration());
    }
}

AndroidManifestにはこれが含まれています(および他のすべてのもの)

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:name=".LocalizedApplication"   <!-- use your specific Application  -->
    android:largeHeap="true"
    android:hardwareAccelerated="true"
    >

    <!-- For billing -->
    <service android:name="net.robotmedia.billing.BillingService" />
        <receiver android:name="net.robotmedia.billing.BillingReceiver">
        <intent-filter>
            <action android:name="com.android.vending.billing.IN_APP_NOTIFY" />
            <action android:name="com.android.vending.billing.RESPONSE_CODE" />
            <action android:name="com.android.vending.billing.PURCHASE_STATE_CHANGED" />
        </intent-filter>
    </receiver>

実装しました ISignatureValidator

public class PhoneSignatureValidator implements ISignatureValidator {
    private final String TAG = this.getClass().getSimpleName();
    private PhoneServerLink mServerLink;


    private BillingController.IConfiguration configuration;

    public PhoneSignatureValidator(Context context, BillingController.IConfiguration configuration, String our_product_sku) {
        this.configuration = configuration;
        mServerLink = new PhoneServerLink(context);
        mServerLink.setSku(our_product_sku);
    }


    @Override
    public boolean validate(String signedData, String signature) {
        final String publicKey;
        if (configuration == null || TextUtils.isEmpty(publicKey = configuration.getPublicKey())) {
            Log.w(BillingController.LOG_TAG, "Please set the public key or turn on debug mode");
            return false;
        }
        if (signedData == null) {
            Log.e(BillingController.LOG_TAG, "Data is null");
            return false;
        }
        // mServerLink will talk to your server
        boolean bool = mServerLink.validateSignature(signedData, signature);
        return bool;
    }

}

実際にサーバーに話しかけるクラスを呼び出すのは、上の最後の数行です。

私たちのPhoneserverlinkは次のようなものから始まります:

public class PhoneServerLink implements GetJSONListener {

    public PhoneServerLink(Context context) {
        mContext = context;
    }

    public boolean validateSignature(String signedData, String signature) {
        return getPurchaseResultFromServer(signedData, signature, false);
    }

    private boolean getPurchaseResultFromServer(String signedData, String signature,  boolean async) {  
            // send request to server using whatever protocols you like 
    }

}

トランザクションデータは、アプリに固有の秘密キーで署名されます。また、リプレイを防ぐための非CEもあります(つまり、同じ、有効な、データを複数回送信します)。ノンセが一意であり、サーバーで署名が有効であることを確認すると、偽物ではないことを合理的に確信できます。 IABの部分を確認してください このGoogle IOプレゼンテーション 議論のために。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top