Unity IAP插件的iOS接入,服务器出现21002问题。

在iOS应用内购买过程中遇到21002错误,分析发现并非content_type设置或base64编码空格问题。问题出在UnityIAP插件导致的双层base64编码。解决方案是确保仅对苹果提供的原始收据进行base64编码,并正确传递给服务器验证。同时,服务器与苹果服务器的连接应避免使用长连接以防止21002错误。

之前的老的框架,之前的项目一直都很正常的运行,这次接入iOS支付的时候,服务器出现了21002错误。这个问题让我头疼了1天。

原因很简单,正常的iOS内购,苹果给的收据,由客户端进行base64编码之后,直接发送给服务器,然后服务器向苹果的对账服务器请求验证。只需要按苹果要求组装好json字符串即可。

而网上关于设置 content_type = "application/json; charset=utf-8",或则将空格换成+号的说法,其实和这个21002半毛钱关系都没有。

据我的测试可得知,content_type设不设置都没关系,而空格换成+号也是属于客户端与服务器之间的传输协议问题。如果是http请求,可能被替换,但是如果是用socket连接,这个一点都不是问题。

问题的唯一可能存在的地方,就是这个base64数据块有问题。可能是base64编码数据被破坏了,还有种可能就是base64编码的内容被破坏了。

后一种情况听起来貌似匪夷所思。但事实上,我这次碰到的就是这种情况。为什么呢?因为Unity IAP插件发送给客户端的是一个Json字符串!而收据作为这个Json的一部分,已经被编码了。客户端再次编码整个字符串,就完全是南辕北辙了。

{"Store":"AppleAppStore","TransactionID":"2000000039643941","Payload":"MIITvQYJKoZIhvcNAQcCoIITrjCCE6oCAQExCzAJBgUrDgMCGgUAMIIDXgYJKoZIhvcNAQcBoIIDTwSCA0sxggNHMAoCAQgCAQEEAhYAMAoCARQCAQEEAgwAMAsCAQECAQEEAwIBADALAgEDAgEBBAMMATAwCwIBCwIBAQQDAgEAMAsCAQ8CAQEEAwIBADALAgEQAgEBBAMCAQAwCwIBGQIBAQQDAgEDMAwCAQoCAQEEBBYCNCswDAIBDgIBAQQEAgIAnjANAgENAgEBBAUCAwJLHDANAgETAgEBBAUMAzEuMDAOAgEJAgEBBAYCBFAyNTYwGAIBBAIBAgQQGPbrdE+kSdWjkiiQITX29TAbAgEAAgEBBBMMEVByb2R1Y3Rpb25TYW5kYm94MBwCAQUCAQEEFKsl44zcXE0xasiszPzJ/c8xkJGBMB4CAQwCAQEEFhYUMjAyMi0wNC0yNFQwNToyNzo1N1owHgIBEgIBAQQWFhQyMDEzLTA4LTAxVDA3OjAwOjAwWjAoAgECAgEBBCAMHmNvbS53b293YXlnYW1lcy5vbmVwZXJjZW50LmlvczAwAgEHAgEBBCi9PlIOqxn1OinWJJ574+GdEl2cHzM6UE6+iRMPDPPC001AYaF9QZVRMD4CAQYCAQEENjlvoEjy8RZrVJjJ1HXGjAre7PTJ8a8E6AneOQYppRF3qbnZ7t0wd1GRVEACKfLCHvD..."}

这儿可以看到,Json字符串的Payload部分就是收据,而且还是经过Base64编码的。因此。只需要把这个部分读出来发送给服务器即可。

另外,说到21002,还有个可能,就是服务器与苹果对账服务器的连接,不能是长连接。每一次请求完就关闭。如果使用那种Keep Alive模式,试图与苹果对账服务器保持长连接的话,你会得到随机的21002错误。

而如果想要验证自己的代码是否有问题,可以直接使用下面的收据(已经base64编码)试试。如果能得到解密字符串,就代表代码是成功的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值