Merhaba,
Berberler için yeni bir uygulama geliştirdim. Şu an markette yüklü ve aktif. https://play.google.com/store/apps/details?id=com.uygarteknoloji.berber adresinden incelenebilir. 7 farklı modül var ve her modül 2 farklı satın alma seçeneğine sahip. Inapp ve subs şeklinde satın alınabiliyor. Subs olanda sorun yok. (Aslında orada da enteresan başka bir sorun var. Subs tipini tanımadı ama çalışıyor. Aşağıda hata mesajını verdim) Abonelik şeklinde satın alındığında her şey normal çalışıyor. Ancak Inapp şeklinde satın alındığında, satın alma işlemi tamamlanıyor, ancak uygulamayı kapatıp açtığında hiç satın alınmamış gibi yeniden satın almayı istiyor. Ne yapmam gerekiyor bir türlü çözemedim. Kodlar aşağıda :
Starter Servis Modülü :
Sub Process_Globals
'These global variables will be declared once when the application starts.
'These variables can be accessed from all modules.
Dim manager As BillingManager3
Public PhoneEvent1 As PhoneEvents
Private key As String = "BlaBlaBla"
Dim ProductLifeTimeID1 As String = "barber_appointments_lifetime"
Dim ProductSubscriptionID1 As String = "barber_appointments_subscription"
Dim ProductName1 As String = "Appointments"
Dim ProductID1 As String
Dim ProductType1 As String
Dim ProductLifeTimeID2 As String = "barber_employee_lifetime"
Dim ProductSubscriptionID2 As String = "barber_employee_subscription"
Dim ProductName2 As String = "Employees"
Dim ProductID2 As String
Dim ProductType2 As String
Dim ProductLifeTimeID3 As String = "barber_products_lifetime"
Dim ProductSubscriptionID3 As String = "barber_products_subscription"
Dim ProductName3 As String = "Materials"
Dim ProductID3 As String
Dim ProductType3 As String
Dim ProductLifeTimeID4 As String = "barber_incomeexpense_lifetime"
Dim ProductSubscriptionID4 As String = "barber_incomeexpense_subscription"
Dim ProductName4 As String = "IncomeExpense"
Dim ProductID4 As String
Dim ProductType4 As String
Dim ProductLifeTimeID5 As String = "barber_notes_lifetime"
Dim ProductSubscriptionID5 As String = "barber_notes_subscription"
Dim ProductName5 As String = "Notes"
Dim ProductID5 As String
Dim ProductType5 As String
Dim ProductLifeTimeID6 As String = "barber_reports_lifetime"
Dim ProductSubscriptionID6 As String = "barber_reports_subscription"
Dim ProductName6 As String = "Reports"
Dim ProductID6 As String
Dim ProductType6 As String
Dim ProductLifeTimeID7 As String = "barber_cloud_lifetime"
Dim ProductSubscriptionID7 As String = "barber_cloud_subscription"
Dim ProductName7 As String = "Cloud"
Dim ProductID7 As String
Dim ProductType7 As String
Dim ber_ran_tam_surum As String = "H"
Dim ber_ran_abone As String = "H"
Dim ber_per_tam_surum As String = "H"
Dim ber_per_abone As String = "H"
Dim ber_urun_tam_surum As String = "H"
Dim ber_urun_abone As String = "H"
Dim ber_gg_tam_surum As String = "H"
Dim ber_gg_abone As String = "H"
Dim ber_not_tam_surum As String = "H"
Dim ber_not_abone As String = "H"
Dim ber_rap_tam_surum As String = "H"
Dim ber_rap_abone As String = "H"
Dim ber_bul_tam_surum As String = "H"
Dim ber_bul_abone As String = "H"
End Sub
Sub Service_Create
'This is the program entry point.
'This is a good place to load resources that are not specific to a single activity.
manager.Initialize("manager", key)
manager.DebugLogging = True
PhoneEvent1.Initialize("PhoneEvent")
End Sub
Sub Service_Start (StartingIntent As Intent)
Service.StopAutomaticForeground 'Starter service can start in the foreground state in some edge cases.
End Sub
Sub Service_TaskRemoved
'This event will be raised when the user removes the app from the recent apps list.
End Sub
Sub PhoneEvent_ConnectivityChanged(NetworkType As String, State As String, Intent As Intent)
'NetworkType - WIFI or MOBILE.
'State - One of the following values: CONNECTING, CONNECTED, SUSPENDED, DISCONNECTING, DISCONNECTED, UNKNOWN.
If State <> "CONNECTED" Then
genel.Baglanti="Yok"
Else
genel.Baglanti="Var"
End If
End Sub
Sub manager_BillingSupported (Supported As Boolean, Message As String)
Log(Supported & ", " & Message)
Log("Subscriptions supported: " & manager.SubscriptionsSupported)
If Supported Then
manager.GetOwnedProducts
End If
End Sub
Sub manager_OwnedProducts (Success As Boolean, purchases As Map)
Log(Success)
If Success Then
For Each p As Purchase In purchases.Values
Log(p.Productid & ", Purchased? " & (p.PurchaseState = p.STATE_PURCHASED))
If p.DeveloperPayload=ProductName1 Then
If p.PurchaseState = p.STATE_PURCHASED Then
ProductID1 = p.ProductId
ProductType1 = p.ItemType
Else
ProductID1 = ""
ProductType1 = ""
End If
else if p.DeveloperPayload = ProductName2 Then
If p.PurchaseState = p.STATE_PURCHASED Then
ProductID2 = p.ProductId
ProductType2 = p.ItemType
Else
ProductID2 = ""
ProductType2 = ""
End If
else if p.DeveloperPayload = ProductName3 Then
If p.PurchaseState = p.STATE_PURCHASED Then
ProductID3 = p.ProductId
ProductType3 = p.ItemType
Else
ProductID3 = ""
ProductType3 = ""
End If
else if p.DeveloperPayload = ProductName4 Then
If p.PurchaseState = p.STATE_PURCHASED Then
ProductID4 = p.ProductId
ProductType4 = p.ItemType
Else
ProductID4 = ""
ProductType4 = ""
End If
else if p.DeveloperPayload = ProductName5 Then
If p.PurchaseState = p.STATE_PURCHASED Then
ProductID5 = p.ProductId
ProductType5 = p.ItemType
Else
ProductID5 = ""
ProductType5 = ""
End If
else if p.DeveloperPayload = ProductName6 Then
If p.PurchaseState = p.STATE_PURCHASED Then
ProductID6 = p.ProductId
ProductType6 = p.ItemType
Else
ProductID6 = ""
ProductType6 = ""
End If
else if p.DeveloperPayload = ProductName7 Then
If p.PurchaseState = p.STATE_PURCHASED Then
ProductID7 = p.ProductId
ProductType7 = p.ItemType
Else
ProductID7 = ""
ProductType7 = ""
End If
End If
Next
ber_ran_tam_surum = "H"
ber_ran_abone = "H"
ber_per_tam_surum = "H"
ber_per_abone = "H"
ber_urun_tam_surum = "H"
ber_urun_abone = "H"
ber_gg_tam_surum = "H"
ber_gg_abone = "H"
ber_not_tam_surum = "H"
ber_not_abone = "H"
ber_rap_tam_surum = "H"
ber_rap_abone = "H"
ber_bul_tam_surum = "H"
ber_bul_abone = "H"
If ProductID1<>"" Then
If ProductType1 = "inapp" Then
ber_ran_tam_surum = "E"
else If ProductType1 = "subs" Then
ber_ran_abone = "E"
End If
End If
If ProductID2<>"" Then
If ProductType2 = "inapp" Then
ber_per_tam_surum = "E"
else If ProductType2 = "subs" Then
ber_per_abone = "E"
End If
End If
If ProductID3<>"" Then
If ProductType3 = "inapp" Then
ber_urun_tam_surum = "E"
else If ProductType3 = "subs" Then
ber_urun_abone = "E"
End If
End If
If ProductID4<>"" Then
If ProductType4 = "inapp" Then
ber_gg_tam_surum = "E"
else If ProductType4 = "subs" Then
ber_gg_abone = "E"
End If
End If
If ProductID5<>"" Then
If ProductType5 = "inapp" Then
ber_not_tam_surum = "E"
else If ProductType5 = "subs" Then
ber_not_abone = "E"
End If
End If
If ProductID6<>"" Then
If ProductType6 = "inapp" Then
ber_rap_tam_surum = "E"
else If ProductType6 = "subs" Then
ber_rap_abone = "E"
End If
End If
If ProductID7<>"" Then
If ProductType7 = "inapp" Then
ber_bul_tam_surum = "E"
else If ProductType7 = "subs" Then
ber_bul_abone = "E"
End If
End If
End If
End Sub
Satın Al Modülü :
Sub btnLifetime_Click
If kabul.Value=False Then
Msgbox2Async(CRLF & genel.ResourceStrings.Get("LicenseAgreementMessage") & CRLF, genel.ResourceStrings.Get("MainActivityTitle"), "", "", "", Null, True)
Else
Select form
Case 1: Starter.manager.RequestPayment(Starter.ProductLifeTimeID1, "inapp", Starter.ProductName1)
Case 2: Starter.manager.RequestPayment(Starter.ProductLifeTimeID2, "inapp", Starter.ProductName2)
Case 3: Starter.manager.RequestPayment(Starter.ProductLifeTimeID3, "inapp", Starter.ProductName3)
Case 4: Starter.manager.RequestPayment(Starter.ProductLifeTimeID4, "inapp", Starter.ProductName4)
Case 5: Starter.manager.RequestPayment(Starter.ProductLifeTimeID5, "inapp", Starter.ProductName5)
Case 6: Starter.manager.RequestPayment(Starter.ProductLifeTimeID6, "inapp", Starter.ProductName6)
Case 7: Starter.manager.RequestPayment(Starter.ProductLifeTimeID7, "inapp", Starter.ProductName7)
End Select
End If
End Sub
Sub btnSubscription_Click
If kabul.Value=False Then
Msgbox2Async(CRLF & genel.ResourceStrings.Get("LicenseAgreementMessage") & CRLF, genel.ResourceStrings.Get("MainActivityTitle"), "", "", "", Null, True)
Else
Select form
Case 1: Starter.manager.RequestPayment(Starter.ProductSubscriptionID1, "subs", Starter.ProductName1)
Case 2: Starter.manager.RequestPayment(Starter.ProductSubscriptionID2, "subs", Starter.ProductName2)
Case 3: Starter.manager.RequestPayment(Starter.ProductSubscriptionID3, "subs", Starter.ProductName3)
Case 4: Starter.manager.RequestPayment(Starter.ProductSubscriptionID4, "subs", Starter.ProductName4)
Case 5: Starter.manager.RequestPayment(Starter.ProductSubscriptionID5, "subs", Starter.ProductName5)
Case 6: Starter.manager.RequestPayment(Starter.ProductSubscriptionID6, "subs", Starter.ProductName6)
Case 7: Starter.manager.RequestPayment(Starter.ProductSubscriptionID7, "subs", Starter.ProductName7)
End Select
End If
End Sub
Sub manager_PurchaseCompleted (Success As Boolean, Product As Purchase)
If Success Then
Dim n As Notification
n.Initialize
n.Vibrate = True
n.Icon = "icon"
Starter.manager.ConsumeProduct(Product)
If Product.DeveloperPayload = Starter.ProductName1 Then
Starter.ProductID1 = Product.ProductId
Starter.ProductType1 = Product.ItemType
n.SetInfo(genel.ResourceStrings.Get("Appointments"), genel.ResourceStrings.Get("PurchaseOk"), Main)
n.Notify(1)
StartActivity(randevular)
else If Product.DeveloperPayload = Starter.ProductName2 Then
Starter.ProductID2 = Product.ProductId
Starter.ProductType2 = Product.ItemType
n.SetInfo(genel.ResourceStrings.Get("Employees"), genel.ResourceStrings.Get("PurchaseOk"), Main)
n.Notify(1)
StartActivity(personeller)
else If Product.DeveloperPayload = Starter.ProductName3 Then
Starter.ProductID3 = Product.ProductId
Starter.ProductType3 = Product.ItemType
n.SetInfo(genel.ResourceStrings.Get("Products"), genel.ResourceStrings.Get("PurchaseOk"), Main)
n.Notify(1)
StartActivity(urunler)
else If Product.DeveloperPayload = Starter.ProductName4 Then
Starter.ProductID4 = Product.ProductId
Starter.ProductType4 = Product.ItemType
n.SetInfo(genel.ResourceStrings.Get("IncomeExpense"), genel.ResourceStrings.Get("PurchaseOk"), Main)
n.Notify(1)
StartActivity(gelirgiderler)
else If Product.DeveloperPayload = Starter.ProductName5 Then
Starter.ProductID5 = Product.ProductId
Starter.ProductType5 = Product.ItemType
n.SetInfo(genel.ResourceStrings.Get("Notes"), genel.ResourceStrings.Get("PurchaseOk"), Main)
n.Notify(1)
StartActivity(notlar)
else If Product.DeveloperPayload = Starter.ProductName6 Then
Starter.ProductID6 = Product.ProductId
Starter.ProductType6 = Product.ItemType
n.SetInfo(genel.ResourceStrings.Get("Reports"), genel.ResourceStrings.Get("PurchaseOk"), Main)
n.Notify(1)
StartActivity(raporlar)
else If Product.DeveloperPayload = Starter.ProductName7 Then
Starter.ProductID7 = Product.ProductId
Starter.ProductType7 = Product.ItemType
n.SetInfo(genel.ResourceStrings.Get("Cloud"), genel.ResourceStrings.Get("PurchaseOk"), Main)
n.Notify(1)
StartActivity(bulut)
End If
Activity.Finish
Else
Msgbox2Async(CRLF & genel.ResourceStrings.Get("PurchaseDidntComplete") & CRLF , genel.ResourceStrings.Get("MainActivityTitle"), "", "", "", Null, True)
End If
End Sub
Manifest Editör :
'This code will be applied to the manifest file during compilation.
'You do not need to modify it in most cases.
'See this link for for more information: http://www.b4x.com/forum/showthread.php?p=78136
AddManifestText(
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="28"/>
<supports-screens android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true"/>)
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
SetActivityAttribute("main", android:label, "@string/MainActivityTitle")
'End of default text.
'InAppBilling declarations - Start
AddReceiverText(Starter, <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>)
'InAppBilling declarations - End
CreateResourceFromFile(Macro, GooglePlayBilling.GooglePlayBilling)
SetApplicationAttribute(android:theme, "@style/MyAppTheme")
CreateResource(values, theme.xml,
<resources>
<style name="MyAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">#0098FF</item>
<item name="colorPrimaryDark">#007CF5</item>
<item name="colorAccent">#AAAA00</item>
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:windowTranslucentNavigation">false</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
</resources>
)
Yalnız manifest editörde yer alan "AddReceiverText" kodlarını henüz ekledim. Playstore'da güncellemedim. (Denemedim)
Main Modüle :
#Region Project Attributes
#ApplicationLabel: Barber
#VersionCode: 3
#VersionName:
'SupportedOrientations possible values: unspecified, landscape or portrait.
#SupportedOrientations: portrait
#CanInstallToExternalStorage: True
#AdditionalRes: C:\AndroidSDK\extras\google\google_play_services\libproject\google-play-services_lib\res, com.google.android.gms
#End Region
#Region Activity Attributes
#FullScreen: True
#IncludeTitle: False
#End Region
#Extends: android.support.v7.app.AppCompatActivity
Aynı şekilde "AdditionalRes" kodunu yeni ekledim o da henüz play store da güncel değil.
Bir de dikkatimi çeken bir şey oldu. Subscription ile satın aldıktan sonra "Items of type 'subs' can't be consumed. (response: -1010:Invalid consumption attempt)" mesajını veriyor. (B4A log'da izlediğimde) ama çalışıyor.
Benim asıl sorunum InApp ile ilgili. InApp de satın alma tamamlanıyor. Ancak programı kapatıp açınca manager_OwnedProducts sub içerisinde satın alınmış gibi gelmiyor.
Loglardan alıntılar :
Günlükçü şuna bağlandı: F7AZFG00P635
--------- beginning of system
--------- beginning of main
** Activity (satinal) Resume **
Starting async operation: launchPurchaseFlow
Constructing buy intent for barber_appointments_lifetime, item type: inapp
requestCode = 1
** Activity (satinal) Pause, UserClosed = false **
sending message to waiting queue (OnActivityResult)
running waiting messages (1)
Arrived: 1, 1
Ending async operation: launchPurchaseFlow
Successful resultcode from purchase activity.
Purchase data: {"orderId":"GPA.3399-9063-9803-25594","packageName":"com.uygarteknoloji.berber","productId":"barber_appointments_lifetime","purchaseTime":1591056748991,"purchaseState":0,"developerPayload":"Appointments","purchaseToken":"npaoehmlnkdphfhocdpakbgh.AO-J1OyhEZf-JsaaCEuG9H-vvh1NtL5VQFvGRMalYS93WtHmjbGVBvmYekmOxUgBsGtHHSRP8iNpbCjb7mcPO35ujedi-1IkWVctp8awgWGdNweC0tvBcZ7bD5uacMrt2aGvB6fDWb7t8APhwf8mgHdKEERZzMDgiQ"}
Data signature: KDGIFHyZfvB9AViMvzEdMlaJ7u2Uu0s6156DAZDM3KuffBPwnwopHSe9xm4zTL0Z55RHvrlPo5mvyNhTb7oRijsrg+8kxW3FxUIexEEsLEKpvjwxf4BfLlmoEgh1VEgB1U48BUKmYFDjvEqKIVrWUXvIu85nDSmJJjZ/lYvEGvuVs0IwfdsE/IK/gMzUBcOFV90b5kwNuBrY+Pk7AtXUjBMmyAC5MVLk2ZvSFfgpoZE0QfRBluRDfrJgzSFR3Pp7rU5PsyOQ8r4Lpun04e4mgsnXft2p0w1B363mvyreci5/owqFMSWjNO8jZoiL2aV9i6/Pcx+qTV3tQsXP6cdxDg==
Extras: Bundle[{INAPP_PURCHASE_DATA={"orderId":"GPA.3399-9063-9803-25594","packageName":"com.uygarteknoloji.berber","productId":"barber_appointments_lifetime","purchaseTime":1591056748991,"purchaseState":0,"developerPayload":"Appointments","purchaseToken":"npaoehmlnkdphfhocdpakbgh.AO-J1OyhEZf-JsaaCEuG9H-vvh1NtL5VQFvGRMalYS93WtHmjbGVBvmYekmOxUgBsGtHHSRP8iNpbCjb7mcPO35ujedi-1IkWVctp8awgWGdNweC0tvBcZ7bD5uacMrt2aGvB6fDWb7t8APhwf8mgHdKEERZzMDgiQ"}, INAPP_DATA_SIGNATURE=KDGIFHyZfvB9AViMvzEdMlaJ7u2Uu0s6156DAZDM3KuffBPwnwopHSe9xm4zTL0Z55RHvrlPo5mvyNhTb7oRijsrg+8kxW3FxUIexEEsLEKpvjwxf4BfLlmoEgh1VEgB1U48BUKmYFDjvEqKIVrWUXvIu85nDSmJJjZ/lYvEGvuVs0IwfdsE/IK/gMzUBcOFV90b5kwNuBrY+Pk7AtXUjBMmyAC5MVLk2ZvSFfgpoZE0QfRBluRDfrJgzSFR3Pp7rU5PsyOQ8r4Lpun04e4mgsnXft2p0w1B363mvyreci5/owqFMSWjNO8jZoiL2aV9i6/Pcx+qTV3tQsXP6cdxDg==, RESPONSE_CODE=0}]
Expected item type: inapp
Purchase signature successfully verified.
Starting async operation: consume
Consuming sku: barber_appointments_lifetime, token: npaoehmlnkdphfhocdpakbgh.AO-J1OyhEZf-JsaaCEuG9H-vvh1NtL5VQFvGRMalYS93WtHmjbGVBvmYekmOxUgBsGtHHSRP8iNpbCjb7mcPO35ujedi-1IkWVctp8awgWGdNweC0tvBcZ7bD5uacMrt2aGvB6fDWb7t8APhwf8mgHdKEERZzMDgiQ
** Activity (satinal) Resume **
** Activity (satinal) Pause, UserClosed = true **
** Activity (randevular) Create, isFirst = true **
** Activity (randevular) Resume **
Successfully consumed sku: barber_appointments_lifetime
Ending async operation: consume
Items of type 'subs' can't be consumed. (response: -1010:Invalid consumption attempt)
Purchase data: {"orderId":"GPA.3315-7319-1611-69547","packageName":"com.uygarteknoloji.berber","productId":"barber_appointments_subscription","purchaseTime":1591029088588,"purchaseState":0,"developerPayload":"Appointments","purchaseToken":"pbjohjpppndfhpnmhhjfmehn.AO-J1Ow860UQgA_E5klA6jIbHFKu7jZqaavDBmeK5QcwqEAzJ8Sd4Hmt3iP8oojAeawZzh_XIYf2ZKCAh1297IBCKkuuqD_4wmsWy0Ec4AAEsL3vwplVjU_zkYzmMJCsNXgqugRMA4MZ9rDNdJL4JnmEDz6NeOTw4w","autoRenewing":true}
Extras: Bundle[{INAPP_PURCHASE_DATA={"orderId":"GPA.3315-7319-1611-69547","packageName":"com.uygarteknoloji.berber","productId":"barber_appointments_subscription","purchaseTime":1591029088588,"purchaseState":0,"developerPayload":"Appointments","purchaseToken":"pbjohjpppndfhpnmhhjfmehn.AO-J1Ow860UQgA_E5klA6jIbHFKu7jZqaavDBmeK5QcwqEAzJ8Sd4Hmt3iP8oojAeawZzh_XIYf2ZKCAh1297IBCKkuuqD_4wmsWy0Ec4AAEsL3vwplVjU_zkYzmMJCsNXgqugRMA4MZ9rDNdJL4JnmEDz6NeOTw4w","autoRenewing":true}, INAPP_DATA_SIGNATURE=XSVMGf1sPXD4/wdUHUR8evUWbMioBPznx/dSPfF370c2L4HBeZit6nr9TjdVuhAQ2LuqPAgBsm1QPqHtETiy6eebM6bI2415VNerg16VAE+TlrB58i7g7ww9mKLq6SrZ3PDfrbyh8RE5VsE4WV0fqNm3iRXIcbOWB1RYrFSJ4C35BMwlwpWHqVyG86zSZ7mc7BnYp7MHOBR1x2LpLei6s2vtgznYP6jYWCFET1sqD/S22hjoAwYcF6PIqaRm+EKtOT9G6yGgIJs4lCcd4eTxNTxVps2Wn+oIsBDOCvIfWZtcVSvCkWEss5vB0YBlizIVohHpOA8tz6pc2ACWox7Qew==, RESPONSE_CODE=0}]
Expected item type: subs
Got sku details: SkuDetails:{"skuDetailsToken":"AEuhp4JwU_0387s5PEXp8YKKgBuCayLA-6ACLdOxUN6YXIRdELOdBtBoHFOtxTfcx3tF","productId":"barber_appointments_subscription","type":"subs","price":"₺9,99","price_amount_micros":9990000,"price_currency_code":"TRY","subscriptionPeriod":"P1M","title":"Randevular (Berber)","description":"Randevular Servisi Aylık Abonelik"}
Purchase data: {"orderId":"GPA.3354-4187-7878-82011","packageName":"com.uygarteknoloji.berber","productId":"barber_appointments_lifetime","purchaseTime":1591031322200,"purchaseState":0,"developerPayload":"Appointments","purchaseToken":"edbhjbipjkjbnkjofedlibgp.AO-J1Oz4pyRQybCOCWf4XY34dGh7CLlVqlojZVRHhCX_1Xa4AjxKx_XDGKvhwtvX8fJ7JXdUpqU3VQABvoS44H-uFBfyKozDo4WzOSlnU5hIbIPsY4gaZiwkggKHN2irgE42YMMqG6rMvj24RyAiasiGEgLYNHt01A"}
Data signature: d7VKggIIGIUTBLzQQxgTF9w0A3pbFuRWvamDh+wRYLCF0GVwYwOsAbwI5ITv//v+AGx8vOU+16l3dQ5IFLCh8Soc0p2hLqAyXBPvRuj8dz3BBLE2EqTRIGVeE0U+q7kuAH3RJcBle77NVeI3BR9YXz8hX5SYTaReMDAWXRE6BMJOOaJy11O3XpYE40iFsPsU0VYN0ywb1NyZGTW8Z8CA+9irXBd2rVH+RJgpksQSZeG30zoBG/ex1vQYgClIZmggnPmKtDc1TS//OKdVAvn4i0T5GO15TjaJozEjE9ZwzKOZ8jyMZexot8YilRgWVAwoHGfqLkRI/QfyDkv0j1f1Rw==
Extras: Bundle[{INAPP_PURCHASE_DATA={"orderId":"GPA.3354-4187-7878-82011","packageName":"com.uygarteknoloji.berber","productId":"barber_appointments_lifetime","purchaseTime":1591031322200,"purchaseState":0,"developerPayload":"Appointments","purchaseToken":"edbhjbipjkjbnkjofedlibgp.AO-J1Oz4pyRQybCOCWf4XY34dGh7CLlVqlojZVRHhCX_1Xa4AjxKx_XDGKvhwtvX8fJ7JXdUpqU3VQABvoS44H-uFBfyKozDo4WzOSlnU5hIbIPsY4gaZiwkggKHN2irgE42YMMqG6rMvj24RyAiasiGEgLYNHt01A"}, INAPP_DATA_SIGNATURE=d7VKggIIGIUTBLzQQxgTF9w0A3pbFuRWvamDh+wRYLCF0GVwYwOsAbwI5ITv//v+AGx8vOU+16l3dQ5IFLCh8Soc0p2hLqAyXBPvRuj8dz3BBLE2EqTRIGVeE0U+q7kuAH3RJcBle77NVeI3BR9YXz8hX5SYTaReMDAWXRE6BMJOOaJy11O3XpYE40iFsPsU0VYN0ywb1NyZGTW8Z8CA+9irXBd2rVH+RJgpksQSZeG30zoBG/ex1vQYgClIZmggnPmKtDc1TS//OKdVAvn4i0T5GO15TjaJozEjE9ZwzKOZ8jyMZexot8YilRgWVAwoHGfqLkRI/QfyDkv0j1f1Rw==, RESPONSE_CODE=0}]
Expected item type: inapp
Consuming sku: barber_appointments_lifetime, token: edbhjbipjkjbnkjofedlibgp.AO-J1Oz4pyRQybCOCWf4XY34dGh7CLlVqlojZVRHhCX_1Xa4AjxKx_XDGKvhwtvX8fJ7JXdUpqU3VQABvoS44H-uFBfyKozDo4WzOSlnU5hIbIPsY4gaZiwkggKHN2irgE42YMMqG6rMvj24RyAiasiGEgLYNHt01A
Successfully consumed sku: barber_appointments_lifetime
Berberler için yeni bir uygulama geliştirdim. Şu an markette yüklü ve aktif. https://play.google.com/store/apps/details?id=com.uygarteknoloji.berber adresinden incelenebilir. 7 farklı modül var ve her modül 2 farklı satın alma seçeneğine sahip. Inapp ve subs şeklinde satın alınabiliyor. Subs olanda sorun yok. (Aslında orada da enteresan başka bir sorun var. Subs tipini tanımadı ama çalışıyor. Aşağıda hata mesajını verdim) Abonelik şeklinde satın alındığında her şey normal çalışıyor. Ancak Inapp şeklinde satın alındığında, satın alma işlemi tamamlanıyor, ancak uygulamayı kapatıp açtığında hiç satın alınmamış gibi yeniden satın almayı istiyor. Ne yapmam gerekiyor bir türlü çözemedim. Kodlar aşağıda :
Starter Servis Modülü :
Sub Process_Globals
'These global variables will be declared once when the application starts.
'These variables can be accessed from all modules.
Dim manager As BillingManager3
Public PhoneEvent1 As PhoneEvents
Private key As String = "BlaBlaBla"
Dim ProductLifeTimeID1 As String = "barber_appointments_lifetime"
Dim ProductSubscriptionID1 As String = "barber_appointments_subscription"
Dim ProductName1 As String = "Appointments"
Dim ProductID1 As String
Dim ProductType1 As String
Dim ProductLifeTimeID2 As String = "barber_employee_lifetime"
Dim ProductSubscriptionID2 As String = "barber_employee_subscription"
Dim ProductName2 As String = "Employees"
Dim ProductID2 As String
Dim ProductType2 As String
Dim ProductLifeTimeID3 As String = "barber_products_lifetime"
Dim ProductSubscriptionID3 As String = "barber_products_subscription"
Dim ProductName3 As String = "Materials"
Dim ProductID3 As String
Dim ProductType3 As String
Dim ProductLifeTimeID4 As String = "barber_incomeexpense_lifetime"
Dim ProductSubscriptionID4 As String = "barber_incomeexpense_subscription"
Dim ProductName4 As String = "IncomeExpense"
Dim ProductID4 As String
Dim ProductType4 As String
Dim ProductLifeTimeID5 As String = "barber_notes_lifetime"
Dim ProductSubscriptionID5 As String = "barber_notes_subscription"
Dim ProductName5 As String = "Notes"
Dim ProductID5 As String
Dim ProductType5 As String
Dim ProductLifeTimeID6 As String = "barber_reports_lifetime"
Dim ProductSubscriptionID6 As String = "barber_reports_subscription"
Dim ProductName6 As String = "Reports"
Dim ProductID6 As String
Dim ProductType6 As String
Dim ProductLifeTimeID7 As String = "barber_cloud_lifetime"
Dim ProductSubscriptionID7 As String = "barber_cloud_subscription"
Dim ProductName7 As String = "Cloud"
Dim ProductID7 As String
Dim ProductType7 As String
Dim ber_ran_tam_surum As String = "H"
Dim ber_ran_abone As String = "H"
Dim ber_per_tam_surum As String = "H"
Dim ber_per_abone As String = "H"
Dim ber_urun_tam_surum As String = "H"
Dim ber_urun_abone As String = "H"
Dim ber_gg_tam_surum As String = "H"
Dim ber_gg_abone As String = "H"
Dim ber_not_tam_surum As String = "H"
Dim ber_not_abone As String = "H"
Dim ber_rap_tam_surum As String = "H"
Dim ber_rap_abone As String = "H"
Dim ber_bul_tam_surum As String = "H"
Dim ber_bul_abone As String = "H"
End Sub
Sub Service_Create
'This is the program entry point.
'This is a good place to load resources that are not specific to a single activity.
manager.Initialize("manager", key)
manager.DebugLogging = True
PhoneEvent1.Initialize("PhoneEvent")
End Sub
Sub Service_Start (StartingIntent As Intent)
Service.StopAutomaticForeground 'Starter service can start in the foreground state in some edge cases.
End Sub
Sub Service_TaskRemoved
'This event will be raised when the user removes the app from the recent apps list.
End Sub
Sub PhoneEvent_ConnectivityChanged(NetworkType As String, State As String, Intent As Intent)
'NetworkType - WIFI or MOBILE.
'State - One of the following values: CONNECTING, CONNECTED, SUSPENDED, DISCONNECTING, DISCONNECTED, UNKNOWN.
If State <> "CONNECTED" Then
genel.Baglanti="Yok"
Else
genel.Baglanti="Var"
End If
End Sub
Sub manager_BillingSupported (Supported As Boolean, Message As String)
Log(Supported & ", " & Message)
Log("Subscriptions supported: " & manager.SubscriptionsSupported)
If Supported Then
manager.GetOwnedProducts
End If
End Sub
Sub manager_OwnedProducts (Success As Boolean, purchases As Map)
Log(Success)
If Success Then
For Each p As Purchase In purchases.Values
Log(p.Productid & ", Purchased? " & (p.PurchaseState = p.STATE_PURCHASED))
If p.DeveloperPayload=ProductName1 Then
If p.PurchaseState = p.STATE_PURCHASED Then
ProductID1 = p.ProductId
ProductType1 = p.ItemType
Else
ProductID1 = ""
ProductType1 = ""
End If
else if p.DeveloperPayload = ProductName2 Then
If p.PurchaseState = p.STATE_PURCHASED Then
ProductID2 = p.ProductId
ProductType2 = p.ItemType
Else
ProductID2 = ""
ProductType2 = ""
End If
else if p.DeveloperPayload = ProductName3 Then
If p.PurchaseState = p.STATE_PURCHASED Then
ProductID3 = p.ProductId
ProductType3 = p.ItemType
Else
ProductID3 = ""
ProductType3 = ""
End If
else if p.DeveloperPayload = ProductName4 Then
If p.PurchaseState = p.STATE_PURCHASED Then
ProductID4 = p.ProductId
ProductType4 = p.ItemType
Else
ProductID4 = ""
ProductType4 = ""
End If
else if p.DeveloperPayload = ProductName5 Then
If p.PurchaseState = p.STATE_PURCHASED Then
ProductID5 = p.ProductId
ProductType5 = p.ItemType
Else
ProductID5 = ""
ProductType5 = ""
End If
else if p.DeveloperPayload = ProductName6 Then
If p.PurchaseState = p.STATE_PURCHASED Then
ProductID6 = p.ProductId
ProductType6 = p.ItemType
Else
ProductID6 = ""
ProductType6 = ""
End If
else if p.DeveloperPayload = ProductName7 Then
If p.PurchaseState = p.STATE_PURCHASED Then
ProductID7 = p.ProductId
ProductType7 = p.ItemType
Else
ProductID7 = ""
ProductType7 = ""
End If
End If
Next
ber_ran_tam_surum = "H"
ber_ran_abone = "H"
ber_per_tam_surum = "H"
ber_per_abone = "H"
ber_urun_tam_surum = "H"
ber_urun_abone = "H"
ber_gg_tam_surum = "H"
ber_gg_abone = "H"
ber_not_tam_surum = "H"
ber_not_abone = "H"
ber_rap_tam_surum = "H"
ber_rap_abone = "H"
ber_bul_tam_surum = "H"
ber_bul_abone = "H"
If ProductID1<>"" Then
If ProductType1 = "inapp" Then
ber_ran_tam_surum = "E"
else If ProductType1 = "subs" Then
ber_ran_abone = "E"
End If
End If
If ProductID2<>"" Then
If ProductType2 = "inapp" Then
ber_per_tam_surum = "E"
else If ProductType2 = "subs" Then
ber_per_abone = "E"
End If
End If
If ProductID3<>"" Then
If ProductType3 = "inapp" Then
ber_urun_tam_surum = "E"
else If ProductType3 = "subs" Then
ber_urun_abone = "E"
End If
End If
If ProductID4<>"" Then
If ProductType4 = "inapp" Then
ber_gg_tam_surum = "E"
else If ProductType4 = "subs" Then
ber_gg_abone = "E"
End If
End If
If ProductID5<>"" Then
If ProductType5 = "inapp" Then
ber_not_tam_surum = "E"
else If ProductType5 = "subs" Then
ber_not_abone = "E"
End If
End If
If ProductID6<>"" Then
If ProductType6 = "inapp" Then
ber_rap_tam_surum = "E"
else If ProductType6 = "subs" Then
ber_rap_abone = "E"
End If
End If
If ProductID7<>"" Then
If ProductType7 = "inapp" Then
ber_bul_tam_surum = "E"
else If ProductType7 = "subs" Then
ber_bul_abone = "E"
End If
End If
End If
End Sub
Satın Al Modülü :
Sub btnLifetime_Click
If kabul.Value=False Then
Msgbox2Async(CRLF & genel.ResourceStrings.Get("LicenseAgreementMessage") & CRLF, genel.ResourceStrings.Get("MainActivityTitle"), "", "", "", Null, True)
Else
Select form
Case 1: Starter.manager.RequestPayment(Starter.ProductLifeTimeID1, "inapp", Starter.ProductName1)
Case 2: Starter.manager.RequestPayment(Starter.ProductLifeTimeID2, "inapp", Starter.ProductName2)
Case 3: Starter.manager.RequestPayment(Starter.ProductLifeTimeID3, "inapp", Starter.ProductName3)
Case 4: Starter.manager.RequestPayment(Starter.ProductLifeTimeID4, "inapp", Starter.ProductName4)
Case 5: Starter.manager.RequestPayment(Starter.ProductLifeTimeID5, "inapp", Starter.ProductName5)
Case 6: Starter.manager.RequestPayment(Starter.ProductLifeTimeID6, "inapp", Starter.ProductName6)
Case 7: Starter.manager.RequestPayment(Starter.ProductLifeTimeID7, "inapp", Starter.ProductName7)
End Select
End If
End Sub
Sub btnSubscription_Click
If kabul.Value=False Then
Msgbox2Async(CRLF & genel.ResourceStrings.Get("LicenseAgreementMessage") & CRLF, genel.ResourceStrings.Get("MainActivityTitle"), "", "", "", Null, True)
Else
Select form
Case 1: Starter.manager.RequestPayment(Starter.ProductSubscriptionID1, "subs", Starter.ProductName1)
Case 2: Starter.manager.RequestPayment(Starter.ProductSubscriptionID2, "subs", Starter.ProductName2)
Case 3: Starter.manager.RequestPayment(Starter.ProductSubscriptionID3, "subs", Starter.ProductName3)
Case 4: Starter.manager.RequestPayment(Starter.ProductSubscriptionID4, "subs", Starter.ProductName4)
Case 5: Starter.manager.RequestPayment(Starter.ProductSubscriptionID5, "subs", Starter.ProductName5)
Case 6: Starter.manager.RequestPayment(Starter.ProductSubscriptionID6, "subs", Starter.ProductName6)
Case 7: Starter.manager.RequestPayment(Starter.ProductSubscriptionID7, "subs", Starter.ProductName7)
End Select
End If
End Sub
Sub manager_PurchaseCompleted (Success As Boolean, Product As Purchase)
If Success Then
Dim n As Notification
n.Initialize
n.Vibrate = True
n.Icon = "icon"
Starter.manager.ConsumeProduct(Product)
If Product.DeveloperPayload = Starter.ProductName1 Then
Starter.ProductID1 = Product.ProductId
Starter.ProductType1 = Product.ItemType
n.SetInfo(genel.ResourceStrings.Get("Appointments"), genel.ResourceStrings.Get("PurchaseOk"), Main)
n.Notify(1)
StartActivity(randevular)
else If Product.DeveloperPayload = Starter.ProductName2 Then
Starter.ProductID2 = Product.ProductId
Starter.ProductType2 = Product.ItemType
n.SetInfo(genel.ResourceStrings.Get("Employees"), genel.ResourceStrings.Get("PurchaseOk"), Main)
n.Notify(1)
StartActivity(personeller)
else If Product.DeveloperPayload = Starter.ProductName3 Then
Starter.ProductID3 = Product.ProductId
Starter.ProductType3 = Product.ItemType
n.SetInfo(genel.ResourceStrings.Get("Products"), genel.ResourceStrings.Get("PurchaseOk"), Main)
n.Notify(1)
StartActivity(urunler)
else If Product.DeveloperPayload = Starter.ProductName4 Then
Starter.ProductID4 = Product.ProductId
Starter.ProductType4 = Product.ItemType
n.SetInfo(genel.ResourceStrings.Get("IncomeExpense"), genel.ResourceStrings.Get("PurchaseOk"), Main)
n.Notify(1)
StartActivity(gelirgiderler)
else If Product.DeveloperPayload = Starter.ProductName5 Then
Starter.ProductID5 = Product.ProductId
Starter.ProductType5 = Product.ItemType
n.SetInfo(genel.ResourceStrings.Get("Notes"), genel.ResourceStrings.Get("PurchaseOk"), Main)
n.Notify(1)
StartActivity(notlar)
else If Product.DeveloperPayload = Starter.ProductName6 Then
Starter.ProductID6 = Product.ProductId
Starter.ProductType6 = Product.ItemType
n.SetInfo(genel.ResourceStrings.Get("Reports"), genel.ResourceStrings.Get("PurchaseOk"), Main)
n.Notify(1)
StartActivity(raporlar)
else If Product.DeveloperPayload = Starter.ProductName7 Then
Starter.ProductID7 = Product.ProductId
Starter.ProductType7 = Product.ItemType
n.SetInfo(genel.ResourceStrings.Get("Cloud"), genel.ResourceStrings.Get("PurchaseOk"), Main)
n.Notify(1)
StartActivity(bulut)
End If
Activity.Finish
Else
Msgbox2Async(CRLF & genel.ResourceStrings.Get("PurchaseDidntComplete") & CRLF , genel.ResourceStrings.Get("MainActivityTitle"), "", "", "", Null, True)
End If
End Sub
Manifest Editör :
'This code will be applied to the manifest file during compilation.
'You do not need to modify it in most cases.
'See this link for for more information: http://www.b4x.com/forum/showthread.php?p=78136
AddManifestText(
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="28"/>
<supports-screens android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true"/>)
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
SetActivityAttribute("main", android:label, "@string/MainActivityTitle")
'End of default text.
'InAppBilling declarations - Start
AddReceiverText(Starter, <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>)
'InAppBilling declarations - End
CreateResourceFromFile(Macro, GooglePlayBilling.GooglePlayBilling)
SetApplicationAttribute(android:theme, "@style/MyAppTheme")
CreateResource(values, theme.xml,
<resources>
<style name="MyAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">#0098FF</item>
<item name="colorPrimaryDark">#007CF5</item>
<item name="colorAccent">#AAAA00</item>
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:windowTranslucentNavigation">false</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
</resources>
)
Yalnız manifest editörde yer alan "AddReceiverText" kodlarını henüz ekledim. Playstore'da güncellemedim. (Denemedim)
Main Modüle :
#Region Project Attributes
#ApplicationLabel: Barber
#VersionCode: 3
#VersionName:
'SupportedOrientations possible values: unspecified, landscape or portrait.
#SupportedOrientations: portrait
#CanInstallToExternalStorage: True
#AdditionalRes: C:\AndroidSDK\extras\google\google_play_services\libproject\google-play-services_lib\res, com.google.android.gms
#End Region
#Region Activity Attributes
#FullScreen: True
#IncludeTitle: False
#End Region
#Extends: android.support.v7.app.AppCompatActivity
Aynı şekilde "AdditionalRes" kodunu yeni ekledim o da henüz play store da güncel değil.
Bir de dikkatimi çeken bir şey oldu. Subscription ile satın aldıktan sonra "Items of type 'subs' can't be consumed. (response: -1010:Invalid consumption attempt)" mesajını veriyor. (B4A log'da izlediğimde) ama çalışıyor.
Benim asıl sorunum InApp ile ilgili. InApp de satın alma tamamlanıyor. Ancak programı kapatıp açınca manager_OwnedProducts sub içerisinde satın alınmış gibi gelmiyor.
Loglardan alıntılar :
Günlükçü şuna bağlandı: F7AZFG00P635
--------- beginning of system
--------- beginning of main
** Activity (satinal) Resume **
Starting async operation: launchPurchaseFlow
Constructing buy intent for barber_appointments_lifetime, item type: inapp
requestCode = 1
** Activity (satinal) Pause, UserClosed = false **
sending message to waiting queue (OnActivityResult)
running waiting messages (1)
Arrived: 1, 1
Ending async operation: launchPurchaseFlow
Successful resultcode from purchase activity.
Purchase data: {"orderId":"GPA.3399-9063-9803-25594","packageName":"com.uygarteknoloji.berber","productId":"barber_appointments_lifetime","purchaseTime":1591056748991,"purchaseState":0,"developerPayload":"Appointments","purchaseToken":"npaoehmlnkdphfhocdpakbgh.AO-J1OyhEZf-JsaaCEuG9H-vvh1NtL5VQFvGRMalYS93WtHmjbGVBvmYekmOxUgBsGtHHSRP8iNpbCjb7mcPO35ujedi-1IkWVctp8awgWGdNweC0tvBcZ7bD5uacMrt2aGvB6fDWb7t8APhwf8mgHdKEERZzMDgiQ"}
Data signature: KDGIFHyZfvB9AViMvzEdMlaJ7u2Uu0s6156DAZDM3KuffBPwnwopHSe9xm4zTL0Z55RHvrlPo5mvyNhTb7oRijsrg+8kxW3FxUIexEEsLEKpvjwxf4BfLlmoEgh1VEgB1U48BUKmYFDjvEqKIVrWUXvIu85nDSmJJjZ/lYvEGvuVs0IwfdsE/IK/gMzUBcOFV90b5kwNuBrY+Pk7AtXUjBMmyAC5MVLk2ZvSFfgpoZE0QfRBluRDfrJgzSFR3Pp7rU5PsyOQ8r4Lpun04e4mgsnXft2p0w1B363mvyreci5/owqFMSWjNO8jZoiL2aV9i6/Pcx+qTV3tQsXP6cdxDg==
Extras: Bundle[{INAPP_PURCHASE_DATA={"orderId":"GPA.3399-9063-9803-25594","packageName":"com.uygarteknoloji.berber","productId":"barber_appointments_lifetime","purchaseTime":1591056748991,"purchaseState":0,"developerPayload":"Appointments","purchaseToken":"npaoehmlnkdphfhocdpakbgh.AO-J1OyhEZf-JsaaCEuG9H-vvh1NtL5VQFvGRMalYS93WtHmjbGVBvmYekmOxUgBsGtHHSRP8iNpbCjb7mcPO35ujedi-1IkWVctp8awgWGdNweC0tvBcZ7bD5uacMrt2aGvB6fDWb7t8APhwf8mgHdKEERZzMDgiQ"}, INAPP_DATA_SIGNATURE=KDGIFHyZfvB9AViMvzEdMlaJ7u2Uu0s6156DAZDM3KuffBPwnwopHSe9xm4zTL0Z55RHvrlPo5mvyNhTb7oRijsrg+8kxW3FxUIexEEsLEKpvjwxf4BfLlmoEgh1VEgB1U48BUKmYFDjvEqKIVrWUXvIu85nDSmJJjZ/lYvEGvuVs0IwfdsE/IK/gMzUBcOFV90b5kwNuBrY+Pk7AtXUjBMmyAC5MVLk2ZvSFfgpoZE0QfRBluRDfrJgzSFR3Pp7rU5PsyOQ8r4Lpun04e4mgsnXft2p0w1B363mvyreci5/owqFMSWjNO8jZoiL2aV9i6/Pcx+qTV3tQsXP6cdxDg==, RESPONSE_CODE=0}]
Expected item type: inapp
Purchase signature successfully verified.
Starting async operation: consume
Consuming sku: barber_appointments_lifetime, token: npaoehmlnkdphfhocdpakbgh.AO-J1OyhEZf-JsaaCEuG9H-vvh1NtL5VQFvGRMalYS93WtHmjbGVBvmYekmOxUgBsGtHHSRP8iNpbCjb7mcPO35ujedi-1IkWVctp8awgWGdNweC0tvBcZ7bD5uacMrt2aGvB6fDWb7t8APhwf8mgHdKEERZzMDgiQ
** Activity (satinal) Resume **
** Activity (satinal) Pause, UserClosed = true **
** Activity (randevular) Create, isFirst = true **
** Activity (randevular) Resume **
Successfully consumed sku: barber_appointments_lifetime
Ending async operation: consume
Items of type 'subs' can't be consumed. (response: -1010:Invalid consumption attempt)
Purchase data: {"orderId":"GPA.3315-7319-1611-69547","packageName":"com.uygarteknoloji.berber","productId":"barber_appointments_subscription","purchaseTime":1591029088588,"purchaseState":0,"developerPayload":"Appointments","purchaseToken":"pbjohjpppndfhpnmhhjfmehn.AO-J1Ow860UQgA_E5klA6jIbHFKu7jZqaavDBmeK5QcwqEAzJ8Sd4Hmt3iP8oojAeawZzh_XIYf2ZKCAh1297IBCKkuuqD_4wmsWy0Ec4AAEsL3vwplVjU_zkYzmMJCsNXgqugRMA4MZ9rDNdJL4JnmEDz6NeOTw4w","autoRenewing":true}
Extras: Bundle[{INAPP_PURCHASE_DATA={"orderId":"GPA.3315-7319-1611-69547","packageName":"com.uygarteknoloji.berber","productId":"barber_appointments_subscription","purchaseTime":1591029088588,"purchaseState":0,"developerPayload":"Appointments","purchaseToken":"pbjohjpppndfhpnmhhjfmehn.AO-J1Ow860UQgA_E5klA6jIbHFKu7jZqaavDBmeK5QcwqEAzJ8Sd4Hmt3iP8oojAeawZzh_XIYf2ZKCAh1297IBCKkuuqD_4wmsWy0Ec4AAEsL3vwplVjU_zkYzmMJCsNXgqugRMA4MZ9rDNdJL4JnmEDz6NeOTw4w","autoRenewing":true}, INAPP_DATA_SIGNATURE=XSVMGf1sPXD4/wdUHUR8evUWbMioBPznx/dSPfF370c2L4HBeZit6nr9TjdVuhAQ2LuqPAgBsm1QPqHtETiy6eebM6bI2415VNerg16VAE+TlrB58i7g7ww9mKLq6SrZ3PDfrbyh8RE5VsE4WV0fqNm3iRXIcbOWB1RYrFSJ4C35BMwlwpWHqVyG86zSZ7mc7BnYp7MHOBR1x2LpLei6s2vtgznYP6jYWCFET1sqD/S22hjoAwYcF6PIqaRm+EKtOT9G6yGgIJs4lCcd4eTxNTxVps2Wn+oIsBDOCvIfWZtcVSvCkWEss5vB0YBlizIVohHpOA8tz6pc2ACWox7Qew==, RESPONSE_CODE=0}]
Expected item type: subs
Got sku details: SkuDetails:{"skuDetailsToken":"AEuhp4JwU_0387s5PEXp8YKKgBuCayLA-6ACLdOxUN6YXIRdELOdBtBoHFOtxTfcx3tF","productId":"barber_appointments_subscription","type":"subs","price":"₺9,99","price_amount_micros":9990000,"price_currency_code":"TRY","subscriptionPeriod":"P1M","title":"Randevular (Berber)","description":"Randevular Servisi Aylık Abonelik"}
Purchase data: {"orderId":"GPA.3354-4187-7878-82011","packageName":"com.uygarteknoloji.berber","productId":"barber_appointments_lifetime","purchaseTime":1591031322200,"purchaseState":0,"developerPayload":"Appointments","purchaseToken":"edbhjbipjkjbnkjofedlibgp.AO-J1Oz4pyRQybCOCWf4XY34dGh7CLlVqlojZVRHhCX_1Xa4AjxKx_XDGKvhwtvX8fJ7JXdUpqU3VQABvoS44H-uFBfyKozDo4WzOSlnU5hIbIPsY4gaZiwkggKHN2irgE42YMMqG6rMvj24RyAiasiGEgLYNHt01A"}
Data signature: d7VKggIIGIUTBLzQQxgTF9w0A3pbFuRWvamDh+wRYLCF0GVwYwOsAbwI5ITv//v+AGx8vOU+16l3dQ5IFLCh8Soc0p2hLqAyXBPvRuj8dz3BBLE2EqTRIGVeE0U+q7kuAH3RJcBle77NVeI3BR9YXz8hX5SYTaReMDAWXRE6BMJOOaJy11O3XpYE40iFsPsU0VYN0ywb1NyZGTW8Z8CA+9irXBd2rVH+RJgpksQSZeG30zoBG/ex1vQYgClIZmggnPmKtDc1TS//OKdVAvn4i0T5GO15TjaJozEjE9ZwzKOZ8jyMZexot8YilRgWVAwoHGfqLkRI/QfyDkv0j1f1Rw==
Extras: Bundle[{INAPP_PURCHASE_DATA={"orderId":"GPA.3354-4187-7878-82011","packageName":"com.uygarteknoloji.berber","productId":"barber_appointments_lifetime","purchaseTime":1591031322200,"purchaseState":0,"developerPayload":"Appointments","purchaseToken":"edbhjbipjkjbnkjofedlibgp.AO-J1Oz4pyRQybCOCWf4XY34dGh7CLlVqlojZVRHhCX_1Xa4AjxKx_XDGKvhwtvX8fJ7JXdUpqU3VQABvoS44H-uFBfyKozDo4WzOSlnU5hIbIPsY4gaZiwkggKHN2irgE42YMMqG6rMvj24RyAiasiGEgLYNHt01A"}, INAPP_DATA_SIGNATURE=d7VKggIIGIUTBLzQQxgTF9w0A3pbFuRWvamDh+wRYLCF0GVwYwOsAbwI5ITv//v+AGx8vOU+16l3dQ5IFLCh8Soc0p2hLqAyXBPvRuj8dz3BBLE2EqTRIGVeE0U+q7kuAH3RJcBle77NVeI3BR9YXz8hX5SYTaReMDAWXRE6BMJOOaJy11O3XpYE40iFsPsU0VYN0ywb1NyZGTW8Z8CA+9irXBd2rVH+RJgpksQSZeG30zoBG/ex1vQYgClIZmggnPmKtDc1TS//OKdVAvn4i0T5GO15TjaJozEjE9ZwzKOZ8jyMZexot8YilRgWVAwoHGfqLkRI/QfyDkv0j1f1Rw==, RESPONSE_CODE=0}]
Expected item type: inapp
Consuming sku: barber_appointments_lifetime, token: edbhjbipjkjbnkjofedlibgp.AO-J1Oz4pyRQybCOCWf4XY34dGh7CLlVqlojZVRHhCX_1Xa4AjxKx_XDGKvhwtvX8fJ7JXdUpqU3VQABvoS44H-uFBfyKozDo4WzOSlnU5hIbIPsY4gaZiwkggKHN2irgE42YMMqG6rMvj24RyAiasiGEgLYNHt01A
Successfully consumed sku: barber_appointments_lifetime