Как проверить транзакции Android в приложении для биллинга на моем сервере?

Я сделал приложение для Android, где предметы можно приобрести, используя биллинг в приложении . Когда товар приобретается, транзакция может быть легко синхронизирована между Android Market и телефоном – для использования в приложении. Но мне нужно, чтобы мой сервер знал о покупке. Решение о предоставлении конкретных приложений должно быть сделано на моем сервере, а не в клиентском приложении.

Например

  • Сделать массив из формы флажка
  • Перегрузка PHP-функций
  • Нужно ли перезапускать Apache после изменения файла php.ini?
  • Время выполнения запроса в MySQL w / PHP
  • Как долго может быть TLD?
  • Как сделать систему крючков PHP?
    1. Пользователь покупает элемент X из Android Market.
    2. Данные транзакции Y отправляются клиенту.
    3. Клиент отправляет Y на мой сервер.
    4. Клиент запрашивает сервер для доставки контента для X.
    5. Сервер предоставляет контент, если Y действителен . Как это можно сделать?

    В: Как проверить, что данные транзакции, поступающие от клиента Android (предположительно, из серверов Google), не являются поддельными? Т.е. хакер не генерировал данные.

    Google Сервер -> клиент Android -> Мой сервер -> клиент Android

    Возможно, это скорее вопрос PHP, чем что-либо еще. То, что должен сделать мой скрипт сервера (PHP), чтобы убедиться, что полученные данные реальны?

    3 Solutions collect form web for “Как проверить транзакции Android в приложении для биллинга на моем сервере?”

    Используйте openssl_verify ($ data, $ signature, $ key)

    Переменные $ data и $ signature должны быть отправлены от клиента 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 } } 

    Данные транзакции подписываются с помощью частного ключа, специфичного для вашего приложения. Существует также nonce для предотвращения повторов (т. Е. Отправка одинаковых, действительных, данных несколько раз). Если вы убедитесь, что nonce уникален и подпись действительна на вашем сервере, вы можете быть достаточно уверены, что это не подделка. Ознакомьтесь с информацией о IAB этой презентации IO Google для обсуждения.

    PHP is the Best Programming Language in the world.