• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Reign
V2EX  ›  程序员

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

  •  
  •   Reign · May 18, 2017 · 10069 views
    This topic created in 3462 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

    这样的话除非别人把你的服务器黑掉,否则是无法给你虚假付款的。
    wh58440
    wh58440
    May 19, 2017
    54
    @Reign
    1.确定好你做的到底是什么,是支付系统,还是普通平台对接支付公司的接口渠道。
    2.paypal 的后端这种,才能称之为支付系统,其主要的功能是商户配置,风险控制,交易对账等,而不是用来提供给普通人进行支付用的,是 B2C 中的 B 端。
    3.如果确定了是要做支付系统那就不是几句话能说清了,组个 team 建项吧
    wh58440
    wh58440
    May 19, 2017
    55
    第 2 点少说了一句,是 B2C 中 B 端的底层
    KhadainJHIN
    KhadainJHIN
    May 19, 2017
    56
    开发出来丢给白帽子众测吧,大家双赢......
    kmahyyg
    kmahyyg
    May 20, 2017 via Android
    57
    @tf141 不行就换其他的,我的 sspanel 用的这玩意。还可以,你去找 sspanel 的支付的相关的东西,基本上几家支持支付宝的国内外网关都有。
    mineqiqi
    mineqiqi
    Jun 20, 2017
    58
    你做的肯定不是支付系统,只是平台对接支付机构。。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1290 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 83ms · UTC 17:19 · PVG 01:19 · LAX 09:19 · JFK 12:19
    ♥ Do have faith in what you're doing.