
När en Android-uppdatering nästan bröt vår betalningslösning
När en biblioteksuppdatering nästan låste ute våra betalande användare
Det började som en av de där uppgifterna man knappt tänker två gånger på.
Vi arbetade med vår Android-app och allt var lugnt på det där sättet man vill att en app ska vara. Betalande användare hade tillgång till sina köp, transaktionerna fungerade och kraschrapporterna var tomma. Inget i inkorgen.
Sedan tog vi oss an en rutinuppgift från vår backlog: att uppgradera Google Play Billing Library till den senaste versionen.
En versionsuppdatering. En sådan sak man klämmer in mellan större uppgifter.
Vi gjorde ändringen, byggde om och började testa.
Något kändes fel
På ytan såg allt bra ut. Appen startade, menyerna fungerade och köpflödet gick igenom som vanligt.
Sedan testade vi att återställa ett köp på ett av våra testkonton, en användare som hade köpt vår livstidsversion av Pro flera månader tidigare.
Appen kände inte igen köpet.
Vi testade ett annat konto. Samma resultat. Ännu ett, samma sak igen.
Människor som hade betalat, vars kvitton vi fortfarande kunde se i Play Console och vars köp hade fungerat perfekt dagen innan, var plötsligt osynliga för appen.
Det fick oss att reagera.
Vi grävde djupare
Vi tillbringade de närmaste timmarna med det man gör i en sådan situation: läste versionsnoteringar, sökte i felrapporter, letade i gamla Stack Overflow-trådar och körde betalningsflödet med loggningen på max.
Till slut klarnade bilden.
Nyare versioner av betalningsbiblioteket hanterade förbrukade engångsköp på ett annat sätt. När ett köp väl hade förbrukats visades det inte längre när appen frågade efter köphistorik på enheten.
För appar som främst säljer förnybara prenumerationer kanske den förändringen inte märks på samma sätt. Men för appar med livstidsköp gjorde den stor skillnad. Informationen på enheten var en del av det som vår app använde för att avgöra vem som skulle få tillgång till Pro.
Köpen fanns fortfarande kvar. Google hade kvar dem. Användarna ägde dem fortfarande.
De kom bara inte längre tillbaka till enheten på ett sätt som vår app kunde använda.
Vi tänkte om
Vi hade kunnat försöka hitta en tillfällig lösning för att hålla liv i den gamla, enhetsbaserade metoden.
I stället tog vi ett steg tillbaka och ställde en annan fråga:
Om någon köper vår app idag, var borde den informationen faktiskt sparas?
Vi bestämde oss för att den borde sparas hos oss.
Vi lade till Google Sign-In, byggde en liten backend med Supabase och flyttade köpstatusen från enheten till vår egen databas, kopplad till användarens konto.
Nu registreras ett köp på serversidan så snart det går igenom, och appen kontrollerar användarens behörighet genom vårt eget system i stället för att förlita sig på vad SDK:n råkar returnera i en viss version.
Så slutade det
Befintliga kunder loggade in en gång och fick tillbaka sin Pro-status direkt. Nya köp registreras på vår backend och finns kvar där.
Om en användare byter telefon, installerar om appen eller skaffar en ny surfplatta följer tillgången med.
Och det ursprungliga problemet, det som startade allt, slutade helt enkelt att spela någon roll. Vad betalningsbiblioteket gör eller inte gör i en viss version är inte längre något appen behöver förlita sig på.
En liten versionsuppdatering tog oss längre än vi hade planerat. Men i slutändan blev appen stabilare än den var innan.
Väl värt omvägen.

senior Android-utvecklare
Låt oss se vad vi kan bygga ihop.
Se hur vi tagit idéer hela vägen












