这是充值系列的最后一篇,将讨论充值安全的问题。正如这个系列的其他文章提到的,充值系统的流程如下:

注意: 4,5执行顺序不确定,步骤4是支付平台自动向服务器请求,步骤5是玩家点击“返回商家网站”时支付平台请求服务器,如果玩家不点击,这可能不会触发,所以这是一个不可靠的请求。

支付的安全问题主要发生在步骤3和4中。下面是详细说明:

在步骤3中,客户端需要把订单信息提交给支付平台,比如玩家购买100个金币,他需要支付人民币10元。订单信息如下:

{"product_name" : 100金币,"total_fee" 100, "currency": RMB
}

当玩家点击提交订单的时候,会把这个订单信息提交到支付平台,如果有人劫持这个请求,并且把订单信息的总费用修改为0.1元,那么支付平台只会扣除玩家0.1元,同时,这笔订单会顺利完成。也就是玩家只花了0.1元购买了原来100元的商品。

在步骤4中,支付平台会把订单处理结果和订单信息返回给服务器,例如返回的结果如下:

{"status" : "fail"  // 表示支付失败"product_name" : 100金币,"total_fee" 100, "currency": RMB
}

这里,如果某个玩家把这个URL劫持,并且修改其中的某些信息,例如把支付失败改为支付成功,或者自己拼接一个URL向游戏服务器发起请求,那后果可想而知。我们需要保证订单除了结果没有被修改,同时还要保证这个请求来自于支付宝。

针对串改订单信息的问题,支付宝的做法是使用RSA算法加密订单信息,对于步骤4中发生的问题,支付宝要求服务器验证请求是否来自于支付宝,同时验证返回的订单信息,如订单信息是否被串改,支付状态是否为成功等。

RSA加密的思路: 把订单信息和商户私钥加密。同时把这个签名传给支付宝。只要不泄露商户私钥,订单信息基本上不可能会被串改。当然,服务器也会验证订单信息没有被修改。

服务器端验证订单信息是否被修改:

第一步:服务器端会接收到从支付宝返回过来的订单信息和之前签名的结果,这个时候,服务器在把订单信息签名,同时和之前的签名结果对比,如果一致,说明订单信息没有被修改。

第二步:获取支付宝返回的数据之一notify_id,按照支付宝要求的格式拼接成URL,提交给支付宝,如果返回为true,则说明这请求确实来自于支付宝。如果所示:

做支付系统的一些思考:

1:在做游戏后台的时候,需要经常向游戏服务器请求数据,这里就有一个安全问题,游戏服务器如何信任这个请求呢,这里就可以参考支付宝的签名机制:把需要向游戏服务器请求的数据和一个”密文“生成一个签名,把这个签名也提交给游戏服务器,当游戏服务器接受到请求后,再把请求的数据和”密文“加密,同时把结果和接受到的签名比对,这样就可以判断这个URL的合法性了。

2:支付平台接入都大同小异,关键是要理解支付的流程,更深入支付流程的规范性和安全性,这对以后的编程也很有帮助。

3:在接入360,91这样的平台的时候,需要理解oauth2.0,也涉及到URL请求合法性的问题,但是Oauth2.0和本篇文章的做法不同。下一篇文章,将讨论一下oauth2.0的应用。

充值系列—充值系统数据库设计(一)

充值系列——充值系统的架构(二)

充值系列——充值系统业务逻辑层实现(三)

充值系列——充值系统安全问题(四)相关推荐

  1. 充值系列——充值系统业务逻辑层实现(三)

    上一篇文章主要说明充值的执行逻辑和控制层的设计,这篇文章主要讨论充值业务层的具体实现. 正如上一篇文章所说到的,生成订单需要如下几个步骤: (1)实例化操作人 (操作人) (2)实例化产品模型 (获取 ...

  2. 转:充值系列—充值系统数据库设计(一)

    转载于:http://blog.csdn.net/looksunli/article/details/16872467 在我们的游戏充值模块中,接入了支付宝,苹果,Paypal, googleplay ...

  3. 充值系列——充值系统的架构(二)

    上一篇文章主要介绍了充值系统的基本概要说明和数据库设计. 这篇文章主要讨论充值的基本流程和系统架构.简单来说,充值的基本流程就是:玩家选择一个支付平台,选择这个平台下面出售的某个商品,付款成功后玩家会 ...

  4. 充值系列—充值系统数据库设计(一)

    在我们的游戏充值模块中,接入了支付宝,苹果,Paypal, googleplay , mycard, mol, 360,机锋,91等各种充值渠道.这篇文章(包括接下来的几篇文章)将对充值系统的需求,数 ...

  5. [系统安全] 四十一.APT系列(6)Python解析PE文件并获取时间戳判断来源区域

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  6. [系统安全] 四十六.Powershell恶意代码检测系列 (1)Powershell基础入门及管道和变量的用法

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  7. [系统安全] 四十五.APT系列(10)Metasploit后渗透技术信息收集、权限提权和功能模块详解

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  8. [系统安全] 四十四.APT系列(9)Metasploit技术之基础用法万字详解及防御机理

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  9. c语言ios包的国密算法包,一种IC卡电子现金自助充值方法及其系统与流程

    本发明涉及IC卡充值技术领域,具体涉及一种IC卡电子现金自助充值方法及其系统. 背景技术: 传统的IC卡离线支付(电子现金.电子钱包等)由于资金存放于卡片内部,因此充值必须依赖读卡设备和柜台. 但多数 ...

最新文章

  1. Facebook 发布深度学习工具包 PyTorch Hub,让论文复现变得更容易
  2. 【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
  3. hibernateTemplate的load方法
  4. android 横向滑动事件,android左右手势滑动事件处理
  5. 压缩感知(II) A Compressed Sense of Compressive Sensing (II)
  6. IPC 和 RPC (呵呵,我感觉我应该要钻研到这个深度啦)
  7. pr抖动插件_2020最全的8000多款PR插件合集,一键安装
  8. S5PV210裸机之时钟
  9. 引入antd组件样式_create-react-app 实现 antd 的按需加载
  10. Go Get设置代理
  11. python函数内部返回的值_在Python中将内部函数的返回值传递给外部函数?
  12. Base64编码解码(一)——介绍
  13. 水系图一般在哪里找得到_如何对于排水系统的服务范围进行统计分析
  14. 关于开发工程师的绩效考核
  15. 22个Python绘图包,极简总结
  16. 创新之法,法无常法——小鹏汽车访学笔记
  17. 元素和子集,属于与包含
  18. lcs算法c语言代码,LCS算法
  19. 给大家分享一款由PHP+MYSQL搭建的外卖小程序源码
  20. 运营商建设免费WiFi是个冷笑话 钱都投给4G了

热门文章

  1. 如何分盘又怎么样合盘(23年最新!!! 堪称保姆级教学!!!)
  2. cmdkey的方式修改windows凭据
  3. Validate 表单验证用法说明
  4. 机器视觉(三):摄像机标定技术
  5. Storm-实时计算系统
  6. 零基础教程:戴尔服务器raid10配置教程
  7. java 0xff00_ 0xFF 与  0xFF00 的作用
  8. 后备保护器安装在浪涌保护器前的作用和意义
  9. C语言错误--[Error] stray '`' in program--解决方法。
  10. 10 本最佳 Linux、UNIX 编程书籍