关于iap苹果内购掉单情况处理

iap的流程基本上大家都熟悉了,不过仍然对流程环节中2个可能出现的问题进行讨论。

以服务端验证为例。

情况1:

客户端提交receipt给服务端验证时候,服务端到苹果验证超时或其他情况导致不能给玩家发货。

解决方案:

将receipt同订单号对应存入数据库,然后定时轮询处理未验证的订单

情况2:

用户在支付回调有延时或者没有成功回调的时候,或者客户端拿到receipt的时候,提交服务端的过程中出现网络异常。

解决方案:

对于没有finished的交易,苹果的不会从队列中删除,在下次启动的时候,会仍然在队列中,这个时候可以拿到receipt再进行提交,

不过这个时候会有另外一个问题,这个receipt里面是没有任何和订单关联的信息,即使提交给服务端,服务端也不知道如何处理。怎么解决呢?

在ios7 苹果增加了一个属性applicationusername,所以我们可以SKMutablepayment里指定订单的数据(比如订单号),当我们再拿到trans的时候我们可以再取出,就可以达到对应的目的。

不过对于ios6的我暂时没看到有好的解决方法,估计基本上只能按照掉单处理了。但是苹果的掉单处理貌似也没有什么好方法。基本就是靠用户购买截图进行模糊判断了。

 

IAB startSetup NullPointerException

接入Google IAP后,在未装有google play服务的设备上运行的时候会闪退

看了下log日志

W/System.err(18121): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tuomi.cjdt.thaiob/com.tuo3.CreativeGame.Gunner}: java.lang.NullPointerException
W/System.err(18121): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308)
W/System.err(18121): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2362)
W/System.err(18121): at android.app.ActivityThread.access$700(ActivityThread.java:168)
W/System.err(18121): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329)
W/System.err(18121): at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err(18121): at android.os.Looper.loop(Looper.java:177)
W/System.err(18121): at android.app.ActivityThread.main(ActivityThread.java:5493)
W/System.err(18121): at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(18121): at java.lang.reflect.Method.invoke(Method.java:525)
W/System.err(18121): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1225)
W/System.err(18121): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1041)
W/System.err(18121): at dalvik.system.NativeStart.main(Native Method)
W/System.err(18121): Caused by: java.lang.NullPointerException
W/System.err(18121): at com.example.android.trivialdrivesample.util.IabHelper.startSetup(IabHelper.java:267)
W/System.err(18121): at com.partner.sdk.GameHelper.<init>(GameHelper.java:162)
W/System.err(18121): at com.tuo3.CreativeGame.Gunner.onCreate(Gunner.java:212)
W/System.err(18121): at android.app.Activity.performCreate(Activity.java:5372)
W/System.err(18121): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
W/System.err(18121): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)

定位到代码上

 

后来在http://stackoverflow.com/questions/20626870/iab-startsetup-nullpointerexception上找到同样的问题

解决方法如下:

 

苹果IAP内购流程及验证

05C05FF2-C0FB-46C4-9517-D95ED21D595F

 

整个支付流程如下:
1.客户端向Appstore请求购买产品(假设产品信息已经取得),Appstore验证产品成功后,从用户的Apple账户余额中扣费。
2.Appstore向客户端返回一段receipt-data,里面记录了本次交易的证书和签名信息。
3.客户端向我们可以信任的游戏服务器提供receipt-data
4.游戏服务器对receipt-data进行一次base64编码
5.把编码后的receipt-data发往itunes.appstore进行验证
6.itunes.appstore返回验证结果给游戏服务器
7.游戏服务器对商品购买状态以及商品类型,向客户端发放相应的道具与推送数据更新通知

服务端验证参考代码:

https://github.com/minihub/iOS-iAP-php

https://github.com/chrismaddern/iOS-Receipt-Validator-PHP