Flutter通过应用内购买安全移除广告及离线校验方案咨询
应用内购去广告功能实现与安全校验方案
核心问题解答
- 本地存储
bool purchased = true类控制变量不是唯一实现方式,仅属于入门级低成本方案,确实存在本地存储被篡改的安全风险,不建议生产环境直接使用。 - Google Play Billing Library原生支持离线查询购买状态:Google Play服务会在本地缓存经过官方校验的用户有效购买记录,你直接调用SDK的
queryPurchasesAsync()接口即可获取当前登录账号的内购记录,设备离线时也可以返回缓存的有效数据,完全不需要自己维护本地购买标识。 - 如需自行存储购买状态同时兼顾离线校验能力,可以使用以下方案:
- 内购完成后不要存储布尔值,而是存储Google Play返回的购买凭证原始数据(Purchase对象的
originalJson字段)和对应的签名signature字段 - 每次需要校验购买状态时,直接用你应用在Google Play后台绑定的公钥对本地存储的凭证和签名做验签,验签通过即可判定购买有效,全程不需要联网
- 由于签名是Google Play私钥生成的,用户就算篡改了本地存储的凭证内容,也无法生成对应的合法签名,验签环节会直接失败,完全规避了本地存储被篡改的风险。
- 内购完成后不要存储布尔值,而是存储Google Play返回的购买凭证原始数据(Purchase对象的
补充注意:如果用户清除应用数据、更换设备,只要重新登录购买时使用的Google账号,调用Billing Library的查询接口即可同步回有效购买记录,无需用户重复付费。
内容的提问来源于stack exchange,提问作者Fahid sarker
相关产品推荐
相关产品推荐

