人生中第一次准备开发网站的支付系统,有什么安全事项需要注意的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Reign
V2EX    程序员

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

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

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

    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 不是最好的选择么
    U7Q5tLAex2FI0o0g
        2
    U7Q5tLAex2FI0o0g  
       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 来返给用户余额?
    U7Q5tLAex2FI0o0g
        5
    U7Q5tLAex2FI0o0g  
       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
    我很好奇是个什么样的流量靠山。。。不便细说也可以大概举个栗子?
    U7Q5tLAex2FI0o0g
        22
    U7Q5tLAex2FI0o0g  
       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 锁是什么意思?
    GG668v26Fd55CP5W
        42
    GG668v26Fd55CP5W  
       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     Solana     2491 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 04:40 PVG 12:40 LAX 20:40 JFK 23:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86