V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Reign
V2EX  ›  程序员

人生中第一次准备开发网站的支付系统,有什么安全事项需要注意的?

  •  
  •   Reign · 2017-05-18 11:07:47 +08:00 · 8130 次点击
    这是一个创建于 2507 天前的主题,其中的信息可能已经有所发展或是发生改变。

    做外贸站,有流量靠山,所以成交量预计应该还是不错,而且从用户反馈情况来看,应该很有前景,现在准备薅欧美资本主义羊毛,开始出售虚拟服务,准备实施的方案为:用户按月付费订阅我们的服务。目前就准备着手开发网站的支付系统了,但有几点需要疑问:

    1. 国外开发是不是一个 PayPal 打天下就行,如果不行,那这么多支付系统选哪个好?有没有统一集成的接口简单方案?
    2. 涉及到金钱,最关键的就是安全问题,用户注册我的网站,我准备的是将 uid 用 php 的可逆式加密生成 cookie 来检测客户端,但是这样的话,另一个用户拷贝走这个 cookie 不就盗用账户了么?怎么防止这种行为?
    3. 用户 cookie 一般的过期时间设置多少合适
    4. 存储到 MySQL 中的金钱信息是否需要可逆式加密?
    5. 是否一定需要 https ?
    6. 如果最坏的情况,最终这个项目失败,怎样退款给那些付费但还未到期的用户?

    另外还有哪些需要注意的求好心 V 友提示一下避免踩坑,第一次开发支付系统难免有点摸不着头脑,求好心 V 友解答一下,谢谢

    58 条回复    2017-06-20 17:43:28 +08:00
    jellybool
        1
    jellybool  
       2017-05-18 11:13:23 +08:00 via iPhone
    国外的话,stripe 不是最好的选择么
    littleylv
        2
    littleylv  
       2017-05-18 11:16:07 +08:00   ❤️ 2
    1、基本 paypal 就行了,paypal 有官方的 sdk 可以用
    2、正常的网站怎么登陆就怎么登陆,跟金钱不金钱没关系,都要注重安全问题
    3、同上
    4、不需要
    5、涉及到支付的,强烈建议 https
    6、paypal 系统后台可以操作
    qinxi
        3
    qinxi  
       2017-05-18 11:23:11 +08:00   ❤️ 1
    锁锁锁锁.

    对账.
    Reign
        4
    Reign  
    OP
       2017-05-18 11:24:08 +08:00
    @littleylv 谢谢,但最后一点搞不明白,用户的支付结果存储在我的 mysql 中,我怎么通过 PayPal 来返给用户余额?
    littleylv
        5
    littleylv  
       2017-05-18 11:30:23 +08:00   ❤️ 1
    @Reign #4 不,客户的支付结果不仅仅只在你的系统中,paypal 也有,客户可以在他的 paypal 中心看到。
    所以,针对订阅制的服务,客户也可以在他的 paypal 账户中心随时取消订阅,因此你的系统中需要有个 hook 让 paypal 通知你“客户在 paypal 取消订阅了,你把你系统的信息也改成取消吧”。
    当然,你也可以在你的系统中做取消的功能,客户可以在你的系统里取消,系统再调用 paypal 取消订阅的接口去取消。
    johnlui
        6
    johnlui  
       2017-05-18 11:47:24 +08:00
    钱的单位要用分。
    kulove
        7
    kulove  
       2017-05-18 11:53:15 +08:00
    权限控制好别被绕过,比如优惠券是否本人,后台计算订单金额。
    koolob
        8
    koolob  
       2017-05-18 11:56:56 +08:00
    好好研究支付渠道的文档,各种情况的回调都要处理,支付成功、争议、退款等。
    记录用户订单产生变化时的当时用户状态,这样有客诉过来时,有据可查。
    airyland
        9
    airyland  
       2017-05-18 11:58:50 +08:00
    做好权限校验,做好金额校验,金额用分,不要出现前端可改价格这类错误。
    duola
        10
    duola  
       2017-05-18 12:04:57 +08:00
    希望楼主避开这一抗,PayPal 环境必须是线上的,本地就拿不到参数的。
    kmahyyg
        11
    kmahyyg  
       2017-05-18 12:29:16 +08:00 via Android
    paymentwall 国内国际通用
    paw
        12
    paw  
       2017-05-18 12:31:02 +08:00
    注意不要直接用浮点数存 xx.xx 元...
    gamexg
        13
    gamexg  
       2017-05-18 12:35:26 +08:00 via Android
    2.可以绑定 ip,服务器发现客户端 ip 变更后敏感操作要求重新登录。
    zocome
        14
    zocome  
       2017-05-18 13:44:59 +08:00
    @paw #11 不用浮点数存金额 请问是出于什么考虑呢?
    ljy2010a
        15
    ljy2010a  
       2017-05-18 13:55:09 +08:00
    国外小心信用卡使用
    slime7
        16
    slime7  
       2017-05-18 14:00:43 +08:00
    @zocome 用 xx.xx 元,到时候合计会不准
    hshw
        17
    hshw  
       2017-05-18 14:05:27 +08:00
    先拿到 ICP 许可证再说 (不是备案)
    isno
        18
    isno  
       2017-05-18 14:07:17 +08:00   ❤️ 2
    2. 注意 JS 注入,所有外界输出的信息在网站输出的时候做一次 html 转义
    4. 存储到 mysql 不用再加密
    6. 支付后保存 支付订单 ID 等信息, 支付网站有退款接口的

    价格信息在数据结构建议用 int, 单位最小分, (用浮点数会有 IEEE754 浮点数误差问题, 容易出错)
    gdtv
        19
    gdtv  
       2017-05-18 14:13:04 +08:00
    @isno “价格信息在数据结构建议用 int ” 学到了,感谢。
    imnpc
        20
    imnpc  
       2017-05-18 14:34:54 +08:00
    不要考虑 paypal
    用 stripe
    lingo
        21
    lingo  
       2017-05-18 14:48:57 +08:00
    我很好奇是个什么样的流量靠山。。。不便细说也可以大概举个栗子?
    littleylv
        22
    littleylv  
       2017-05-18 14:52:30 +08:00
    @isno #18 “价格信息在数据结构建议用 int, 单位最小分” 这个方法不错,学习了
    sp1sp1
        23
    sp1sp1  
       2017-05-18 14:53:28 +08:00
    我很好奇是个什么样的流量靠山。。。不便细说也可以大概举个栗子?
    pango
        24
    pango  
       2017-05-18 15:00:30 +08:00
    我做过,用的是这个: https://github.com/spookylukey/django-paypal, 已经帮你搞定了一切,文档在这里: https://django-paypal.readthedocs.io/en/stable/
    bozong
        25
    bozong  
       2017-05-18 15:34:33 +08:00
    @paw #12 为什么不能用浮点数
    bozong
        26
    bozong  
       2017-05-18 15:34:54 +08:00
    @johnlui #6 为什么要用分
    bozong
        27
    bozong  
       2017-05-18 15:44:24 +08:00
    我们用的 decimal(18,4)
    Reign
        28
    Reign  
    OP
       2017-05-18 15:51:09 +08:00
    @imnpc stripe 比 PayPal 哪点好了,我的是订阅付费
    subpo
        29
    subpo  
       2017-05-18 15:52:59 +08:00
    不要用 float 不要用 float 不要用 float
    maomaomao001
        30
    maomaomao001  
       2017-05-18 15:55:50 +08:00 via Android
    @slime7 一般用什么表示钱呢? 我的也是浮点数
    bozong
        31
    bozong  
       2017-05-18 15:55:59 +08:00
    @subpo #29 用的 decimal
    slime7
        32
    slime7  
       2017-05-18 16:24:15 +08:00
    @maomaomao001 楼上都提了,用分作单位,显示的时候转换元,微信也是分单位;用 decimal。
    imnpc
        33
    imnpc  
       2017-05-18 16:41:10 +08:00
    @Reign paypal 一人争议 账户就被限制...
    chiukong
        34
    chiukong  
       2017-05-18 16:48:57 +08:00
    1.paypal 可以,但如果是虚拟服务,小心被反蹭羊毛
    2.cookie 丢失都会造成用户信息泄露,但是关键业务,如购买之类的,除了 cookie 还要做二次身份确认,如支付密码,手机短信验证码等
    3.这个问题。。不知道如何回答。反正用户有操作就会对 cookie 续费
    4.用户关键信息需要做对称加密,密码等做不可逆存储
    5.需要
    6.PayPal 支持退款。。。
    chiukong
        35
    chiukong  
       2017-05-18 16:50:29 +08:00
    对楼主的流量靠山比较感兴趣,我也做了几年支付系统了,有其他问题可以加微信聊聊,可以提供一些其他建议。俺也顺便了解下俺感兴趣的话题。哈哈。微信:chiukong_lee
    Reign
        36
    Reign  
    OP
       2017-05-18 16:52:13 +08:00 via iPhone
    @chiukong 何谓反蹭羊毛?
    qceytzn
        37
    qceytzn  
       2017-05-18 17:02:51 +08:00
    @imnpc 也是分情况的,我用下来的感受是现在 paypal 并不是一有争议就立刻限制整个账户

    @Reign stripe 应该是手续费更低一点,功能更强一点,以及对程序员更友好一点,不过大陆用户需要在美国或者其他 stripe 支持的国家设立公司或者有该国税号才可以用,并且需要一个该国的银行账户,银行账户好解决,主要是税号讨厌,有了税号就涉及到报税和交税了
    zhanziyang
        38
    zhanziyang  
       2017-05-18 17:15:57 +08:00
    别的我不确定,但 HTTPS 是肯定要的,必经涉及到金钱,HTTPS 相当于多一层保护层
    issues
        39
    issues  
       2017-05-18 17:52:06 +08:00
    @isno 学到了
    lianxiaoyi
        40
    lianxiaoyi  
       2017-05-18 18:18:53 +08:00   ❤️ 2
    记得在系统里面埋漏洞。。。。。拿前台穿过来的金额去创建支付链接。。然后让它付款。。。然后在 webhook 回调的时候,判断实际支付的钱和实际需要支付的钱是否一致,不一致就冻结帐号。。黑掉这笔钱。。。。
    Reign
        41
    Reign  
    OP
       2017-05-18 18:34:04 +08:00
    @qinxi 锁是什么意思?
    falcon05
        42
    falcon05  
       2017-05-18 18:38:08 +08:00 via iPhone
    linfox
        43
    linfox  
       2017-05-18 18:39:20 +08:00
    不是很懂楼主的需求。
    如果只是单纯做个 外贸的独立网店,为什么不用一些现成的方案 比如 shopify ?
    qinxi
        44
    qinxi  
       2017-05-18 20:00:11 +08:00
    @Reign 多线程啊...用锁避免多个线程同时操作余额,出现不可控的情况
    julyclyde
        45
    julyclyde  
       2017-05-19 07:30:44 +08:00
    安全方面,PCI IDS 标准有明确定义了
    国内的话可以找银联金卡科技公司做认证和合规指导
    zonga
        46
    zonga  
       2017-05-19 08:53:38 +08:00
    @paw 请问用 X.XX 这种 BigDecimal 会有什么后果吗?
    Felldeadbird
        47
    Felldeadbird  
       2017-05-19 09:18:28 +08:00
    我想说楼主想太多了。
    1.paypal 就基本满足 国外大部分地区了。
    2. 账号余额安全的事情,做好日志系统、财务系统。 财务需要每天对账,检查坏账。
    3. https 6 月开始,paypal 强制要求。
    4. 做好客服工作。就是弄一套工单系统。客服将会是你们未来一笔投入。
    5. 安全方面没啥好的建议。
    paw
        48
    paw  
       2017-05-19 09:28:24 +08:00
    @zocome
    @bozong
    @zonga
    浮点数精度问题啊,,, 比如 float a=0.7; a 其实是 0.699999988079071044921875 .....

    至于 BigDecimal,底层 C 程序员表示不知道这是啥...
    dangyuluo
        49
    dangyuluo  
       2017-05-19 10:12:13 +08:00
    如果是 MySQL,decimal 足够了吧。我目前就是用的这个做的支付,没有遇到过什么问题。
    dangyuluo
        50
    dangyuluo  
       2017-05-19 10:13:23 +08:00
    @lianxiaoyi 记得很早很早很早很早之前,有一个网站系统就是用前台得到的金额去支付,结果被各路人马黑得体无完肤,是真的在黑。
    Reign
        51
    Reign  
    OP
       2017-05-19 10:35:37 +08:00
    @dangyuluo 那请问不拿前台得到的金额去支付,应该怎样获取并且处理前端的数据?
    tf141
        52
    tf141  
       2017-05-19 11:12:52 +08:00
    @kmahyyg 你用过这个吗?我打算用,不过在知乎看到说只支持虚拟物品,还要各种证明文件,联系客服也不回
    dangyuluo
        53
    dangyuluo  
       2017-05-19 11:31:10 +08:00
    @Reign
    1,前台只是负责显示,真正的支付订单由后台向支付服务提供商发起请求生成。现在微信的支付的统一下单就是这么做的。
    2,支付完成后,一般的支付服务商都会提供回调来通知服务器该笔订单已支付,这时要检验金额是否符合,来源是否为官方服务器,最好的办法是在你的订单上加盐,然后做 hash 运算( md5 就足够了我认为?)以校验该通知的合法性。一旦任何地方不一致,锁住该笔订单。

    这样的话除非别人把你的服务器黑掉,否则是无法给你虚假付款的。
    wh58440
        54
    wh58440  
       2017-05-19 13:20:14 +08:00
    @Reign
    1.确定好你做的到底是什么,是支付系统,还是普通平台对接支付公司的接口渠道。
    2.paypal 的后端这种,才能称之为支付系统,其主要的功能是商户配置,风险控制,交易对账等,而不是用来提供给普通人进行支付用的,是 B2C 中的 B 端。
    3.如果确定了是要做支付系统那就不是几句话能说清了,组个 team 建项吧
    wh58440
        55
    wh58440  
       2017-05-19 13:21:42 +08:00
    第 2 点少说了一句,是 B2C 中 B 端的底层
    KhadainJHIN
        56
    KhadainJHIN  
       2017-05-19 14:04:56 +08:00
    开发出来丢给白帽子众测吧,大家双赢......
    kmahyyg
        57
    kmahyyg  
       2017-05-20 01:00:28 +08:00 via Android
    @tf141 不行就换其他的,我的 sspanel 用的这玩意。还可以,你去找 sspanel 的支付的相关的东西,基本上几家支持支付宝的国内外网关都有。
    mineqiqi
        58
    mineqiqi  
       2017-06-20 17:43:28 +08:00
    你做的肯定不是支付系统,只是平台对接支付机构。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2869 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 13:07 · PVG 21:07 · LAX 06:07 · JFK 09:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.