Я собираюсь внедрить Google в приложение для оплаты в свое приложение для Android, и вот что:
У меня есть 3 уровня подписки, скажем нуб, нормальный и про. В моем приложении есть логин / регистрация, помимо входа в Google. Я уже реализовал все покупки в своем приложении, но теперь мне интересно, как лучше всего прикрепить эти премиальные подписки, оплачиваемые с помощью биллинга Google, с моими пользователями, чтобы я мог проверить каждого пользователя в приложении, даже если они ' повторное использование устройства с той же учетной записью Google, но с другим уровнем подписки.
* Например: у меня «обычная» подписка, оплачиваемая с помощью учетной записи [email protected] с именем пользователя MINE21 в моем nexus 5
Затем моя сестра покупает «профессиональную» подписку, оплачиваемую с помощью учетной записи [email protected] с именем пользователя SHE123 в ее Galaxy S6, но затем она берет мой Nexus 5 и входит в систему с помощью SHE123, но в игровом магазине я регистрируюсь как [email protected].
В этот момент я хочу показать ей все профессиональные функции, но мне нужно подтвердить, является ли SHE123 премиальным, даже если эта учетная запись playstore связана с MINE21 как [email protected]. *
Если я не могу четко объяснить, пожалуйста, дайте мне знать.
Правильно ли я, если я получу идентификатор пользователя от пользователя, покупающего подписку, и сохраню его в своей базе данных с идентификатором учетной записи Google, покупкой токена и премиум-уровнем?
Я хочу знать, как мне проверить платеж Google с каждым пользователем моей базы данных, даже если они используют другую учетную запись Google в магазине игр.
- Моя db - это база данных MySQL, обрабатываемая с помощью PHP -
С уважением, Инроверо
Я собираюсь поместить сюда свой процессный платеж:
private void processPayment(final String SKU){
PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
@Override
public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> list) {
// To be implemented
if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && list != null){
// do Something you want
Log.i(TAG, "Compra exitosa");
// Preparar categoría de premium
premium = "";
if(list.get(0).getSku().equals(SKU_BS)) premium = "BS";
else if(list.get(0).getSku().equals(SKU_BN)) premium = "BN";
else if(list.get(0).getSku().equals(SKU_BP)) premium = "BP";
Toast.makeText(mContext, premium + " adquirido", Toast.LENGTH_LONG).show();
// Sincronizar premium con la DB y suscripción con el usuario
User currentUser = SharedPrefManager.getInstance(mContext).getUser();
int uid = currentUser.getId();
// Datos a sincronizar
AccountIdentifiers accountIdentifiers = list.get(0).getAccountIdentifiers();
String accID = accountIdentifiers.getObfuscatedAccountId();
String token = list.get(0).getPurchaseToken();
// Pasar a la DB el token, accID y uid vinculados con el premium.
// UID // ACCID // TOKEN // PREMIUM //
}else if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED){
// do Something you want
Log.i(TAG, "Compra cancelada");
// Nada? Cancelar all?
}else if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_UNAVAILABLE){
Log.i(TAG, "Item inexistente");
}
}
};
final BillingClient billingClient = BillingClient.newBuilder(mContext)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK){
// The BillingClient is ready. You can query purchases here.
List<String> skuList = new ArrayList<>();
skuList.add(SKU);
SkuDetailsParams params = SkuDetailsParams.newBuilder()
.setSkusList(skuList).setType(BillingClient.SkuType.SUBS)
.build();
billingClient.querySkuDetailsAsync(params, new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(@NonNull BillingResult billingResult, @Nullable List<SkuDetails> list) {
if(list == null){
Log.i(TAG, "lista vacía");
return;
}
for(int i = 0; i < list.size(); i++){
Log.i(TAG, String.valueOf(list.get(i)));
}
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
.setSkuDetails(list.get(0))
.build();
int responseCode = billingClient.launchBillingFlow(requireActivity(), billingFlowParams).getResponseCode();
if(responseCode == BillingClient.BillingResponseCode.OK){
// do Something you want
Log.i(TAG, "responseCode OK");
}else if(responseCode == BillingClient.BillingResponseCode.ERROR){
Log.i(TAG, "responseCode ERROR");
}else if(responseCode == BillingClient.BillingResponseCode.ITEM_UNAVAILABLE){
Log.i(TAG, "responseCode ITEM_UNAVAILABLE");
}
}
});
}
}
@Override
public void onBillingServiceDisconnected() {
// Try to restart the connection on the next request to
// Google Play by calling the startConnection() method.
}
});
}