记Google应用内商品(消耗品)支付小坑

因为应用要上架Google Play,所以需要接入Google支付和Paypal支付,本篇先记录一下Google支付接入流程。首先来一波定心丸,Google支付的接入还是很简单的;然后就是官方文档啦实现应用内购买结算。

个人理解,购买流程大致如下:
(1)查询当前设备是否支持应用内购买
(2)在支持的情况下,通过商品id查询拥有,未消耗的商品。
(3)如果没有,可以直接调起购买支付;如果有需要先消耗,否则购买失败
(4)购买成功,记得把商品消耗
可能会觉得奇怪,怎么有两次消耗的逻辑。正常来说购买成功之后,消耗即可,但是无法保证在这个过程中不出现问题,比如应用退出等,所以在每次购买之前我们需要再查询一次啊。
在正式写代码之前有两件事需要做:
(1)aidl文件的拷贝
(2)AndroidManifest文件的配置
aidl文件的话,按照官网上到sdk中去下,去找我是没找到,后面直接从官方给出的demo中拷贝。至于AndroidManifest的话,只要加上一句即可:

<uses-permission android:name="com.android.vending.BILLING" />

其它的其实参考官方demo即可,主要流程就是上面说到的那样。

不过有几点需要需要一下:
(1)处于安全考虑,在应用上架时,我们一般都会做混淆,注意在混淆文件中添加如下规则:

-keep class com.android.vending.billing.**

(2)在官方demo中为了让开发者对整个流程有一个完整的认识,它把校验支付的逻辑和代码也放在了里面,我们需要把它移除。主要就是IabHelper中的base64签名参数,把它删了,并且用到该参数的地方也删除。这个到时候让后台验证即可。
(3)在校验支付的时候,我们一般会把Google返回的支付信息字符串传递给后台,格式如下:

{
   "orderId":"GPA.1234-5678-9012-34567",
   "packageName":"com.example.app",
   "productId":"exampleSku",
   "purchaseTime":1345678900000,
   "purchaseState":0,
   "developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
   "purchaseToken":"opaque-token-up-to-1000-characters"
 }

在这里其实没有什么,但是我硬是踩了一个坑。因为除了以上字段,后台还需要签名字符串和自己服务器生成的订单号,让我合并成一个对象,然后再转换成字符串传递给后台校验。结果就悲催了,因为一个新的对象重新转换为字符串是字段乱序了,上面中的purchaseTime和purchaseState顺序调换了,后台怎么校验都不过,两人大眼瞪小眼,搞了一天。。。后面发现这个问题,自己去拼字符串传给后台。
(4)调起支付时传递的商品id为我们在Google Play Console中创建的应用内商品的id

你可能感兴趣的:(日常开发笔记)