iOS 做内购的话如何确保与服务器安全通信?

2014-12-20 11:22:48 +08:00
 lshero
iOS做内购,想的结束后把充值结果发客户端送回服务器,最早想的是客户端生成一个签名串,服务端比对一下就完事了。
但是想一想客户端是否可能会被反编译到看出签名串的生成方法从而伪造充值请求
基于这种状况有什么比较好的解决办法呢?
3554 次点击
所在节点    iDev
12 条回复
yylyyl
2014-12-20 11:30:25 +08:00
应该在服务器端检查 receipt 的合法性。
lshero
2014-12-20 11:43:52 +08:00
@yylyyl 但是整个购物流程都实在客户端完成的啊
wzxjohn
2014-12-20 12:13:55 +08:00
@lshero 如果是单机游戏,那歇歇吧。。。基本无解。。。就算你发回服务器检查别人还是可以抓取你的请求伪造。服务端验证收据只能防初级用户。只有带账号系统的网游才能真正的避免内购欺骗。。。
其实我觉得最好的方法是把单机游戏的重要资源包放到服务器上,并使用账号系统。用户内购之后赋予这个账号下载这个包的权限。当访问内购内容的时候再下载这个包。。。
lshero
2014-12-20 12:27:59 +08:00
@wzxjohn 客户端不是游戏,内购也只是内购金币,有账号系统,然后金币可以进行一些虚拟消费。

虽然API用了SSL,但是由于担心抓包所以想的是服务器和客户端约定一个key把交易的信息元素按照一定的顺序排列后md5一下生成签名,服务器校验一下签名就知道是不是合法请求了,单纯的抓包并不知道签名生成规则所以无法生成服务器认可的签名串,但是现在的担心就是如果客户端被反编译了,会不会找到签名的生成方法从而伪造签名。

所以我想的最有效的解决办法就是交易完后服务器对服务器进行通讯,所以想问一下苹果是否提供验证收据有效性的API或者是可以给苹果一个URL内购完之后回掉呢?
xmvagrant
2014-12-20 12:54:58 +08:00
@lshero 苹果提供服务器验证 receipt的方法啊,见https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Introduction.html#//apple_ref/doc/uid/TP40010573-CH105-SW1 Validating Receipts With the App Store 一节。话说,要做内购的话不是应该先查官方文档么?
lshero
2014-12-20 16:04:37 +08:00
@xmvagrant 十分感谢,年底帮人忙接到一个烂摊子,看之前的接口啥验证都没写所以想让他们知道一下,同时也避免出了问题责任归我
wzxjohn
2014-12-20 17:38:23 +08:00
@lshero 看到的晚了一点,有人已经给出了很好的解决方法~苹果官方当然有检查有效性的Api,服务器做验证即可~不过要注意的是苹果并没有内购然后退款的检测措施,所以这个情况还是避免不了。不过这种情况毕竟是少数,不用过于纠结。只要验证了收据保证不被欺骗即可。
xmvagrant
2014-12-20 19:39:19 +08:00
@wzxjohn 购买后退款没有检测措施这个问题让我很蛋疼。。。
lshero
2014-12-20 21:05:51 +08:00
@xmvagrant 那这一部分你现在怎么处理的?当坏账还是?
xmvagrant
2014-12-22 13:55:55 +08:00
@lshero 项目做到一半黄了,所以“这一部分”还没产生-_-
lshero
2014-12-22 14:16:20 +08:00
@xmvagrant 我感觉我接手的烂摊子应该也好不到哪里去,还是把风险告诉她们吧,免得这种帮忙费力又不讨好
yellowV2ex
2014-12-23 19:30:03 +08:00
receipt交给服务器验证就好啦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/155277

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX