最近有需求用到应用程式内购买,距离上一次串内购已经好几年,Code都不知道丢哪去了
还好Google官方有提供Sample
Google提供的这包Sample里面有“购买”也有“订阅”的範例
也有区分Kotlin以及Java的版本
另外还有一包Server,不过看起来是用Type Script写的,跟我想用的不同所以这边就得另外找了
建置产品
Google Play Console -> 选择应用程式 -> 商店发布 -> 应用程式内商品 -> 受管理商品 -> 建立要纳入管理的产品
按照栏位资讯填写建立完成后会在受管理商品列表中看到刚才建置的项目
Android前端购买
以往都是把Sample里面主要的Class複製出来再整合成Controller方便使用
实在有点懒惰就再爬爬文,结果发现Android版本早就有人做好啦,android-inapp-billing-v3,看这星星应该是相当稳定的状态了
使用上就不多说,直接参照android-inapp-billing-v3 Git中的说明吧
前端部分完成了,当然不能就此结束,除非你要做的APP完全是在本机执行
因此当然要加上后端验证的部分
我们可以在onProductPurchased中的TransactionDetails参数拿到购买成功后回传的收据
再将此收据中的相关参数送到后端做验证
验证通过后才表示购买成功,并完成整个购买流程
Nodejs后端验证
后端验证我们先看到官方建议如何处理
其实就是一个Get的API就能验证了
但是要注意,文件的下方还有但书,还需要有Auth验证身份
不然直接呼叫上面这个Get是得不到结果的
同样的,这些动作也有人封装好了in-app-purchase,只要把必要的参数申请好并填写进去就能使用
接下来就来逐一找到我们会用到的参数是放在哪里
googlePublicKeyStrLive
Google Play Console -> 选择应用程式 -> 菜单 开发工具 -> 子选项 服务及API
下图中这段很长的Base64字串就是这个APP的public key
googleServiceAccount(clientEmail, privateKey)
这两个参数就比较麻烦了
Google Play Console -> 设定 -> 菜单 开发人员帐户 -> 子选项 API存取权
已连结的专案
这边要连结一个Google Clound的专案,专案连结大概是长这样
https://console.developers.google.com/apis/dashboard?project=XXXXX
如果还没有任何一个的话可以先建置一个
服务帐户(Service Account)
预设应该是没有绑定任何的帐号,点击建立帐号服务后会弹出一个流程
点击弹窗中的Google API连结会导引到上面已连结专案的Credentials页面
马上来建置Service Account
Create Credentials -> 选择Service Account
设置名称,通常我会设置一个比较可以清晰辨识的名称
在这边我们目的是用来验证iab的收据,可能就会用iab来命名
例如 iab-validator等
接下来要设置Service Account的角色
由于我们这边只需要读取,不需要写入,因此我就选了Viewer
这边我就完全没有填写任何资讯
直接Done完成建置
完成后回到Credentials页面会看到Service Account地方多了一个项目
点击进入查看细节
Add key -> Create new key
选择.json -> Create,这边要特别注意
下载下来的.json档请自行留存,弄丢了没有地方可以找回,就只能建置新的
打开.json后可以看到里面大概有这些内容
client_email以及private_key就是我们要的
看到这边大概快吐血了,不过还没结束
回到API存取权页面,服务帐户中找到刚刚建置好的Service Account
点击查看权限,可以看到目前此账户拥有的权限
点击右侧设定编辑权限,勾选查看财务资料(其他的要勾不勾就随意了)
储存之后就搞定这部分了
Receipt
文件中有提到传入验证的receipt需要包含一下内容
{ packageName: 'The packge name of the item purchased', productId: 'The product ID of the item purchased', purchaseToken: 'PurchaseToken of the receipt from Google', subscription: true/false // if the receipt is a subscription, then true}
packageName => 基本上我认为Hard code就可以了
productId => detail.purchaseInfo.purchaseData.productId
purchaseToken => detail.purchaseInfo.purchaseData.purchaseToken
subscription => 就看产品是一次性购买,还是需要按时付款
这边的detail就是android-inapp-billing-v3中的TransactionDetails
除了上述的建置流程外,开发期间我还踩了一个坑,后端验证的时候有看到这个错误讯息
"The project id used to call the google play developer api has not been linked"
我解决的方式是回到上面googleServiceAccount建置的步骤,重新核对了一次整个内容
后来发现由于测试的时候有切换连结不同的专案,导致Service Account并没有对应到正确的专案
我把Service Account删除,重新建置一个新的就能收到正确的回传讯息了