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

关于微信支付的疑问

  •  
  •   evolify · 2017-10-28 15:08:27 +08:00 · 4678 次点击
    这是一个创建于 2585 天前的主题,其中的信息可能已经有所发展或是发生改变。

    微信文档里面的流程是:用户下单后,后台会调用统一支付 api,获取到 prepay_id 等参数,然后签名,返回相关数据给微信端,然后微信端发起支付。 现在我做的是,用户下单后。点击确认支付,然后付款。我不确定统一下单这一步放在哪儿。

    如果是放在用户点击确认支付这一步,那么用户在微信端发起付款后,可以取消支付,或者余额不足等等。然后当他再次点击确认支付的时候,后台会重复提交统一下单。这样会报错,因为订单号重复。
    如果实在用户下单的时候,就请求了统一支付。这个时候还没到用户付款这一步,那这样做 prepay_id 这些信息就需要保存下来,放到数据库?或者 redis ?之后支付的时候直接取出来发给微信端,然后微信端付款。
    
    不知以上哪种流程合理一点?请大家指点指点。
    
    6 条回复    2017-10-29 07:23:18 +08:00
    RihcardLu
        1
    RihcardLu  
       2017-10-28 16:02:23 +08:00 via iPhone
    第一种,同一个方式如果如果不发生价格变化,不会报重复,不同方式才会,公众号支付加固定后缀。
    arischow
        2
    arischow  
       2017-10-28 19:05:35 +08:00 via iPhone   ❤️ 1
    prepay_id 不需要保存起来,这个 id 有效期是两小时,期间有新的 prepay_id 生成,它也不会失效。所以如果用户取消支付了的话再去调用一次统一下单就可以了。
    pubby
        3
    pubby  
       2017-10-28 20:18:10 +08:00
    设计上有点问题,订单是订单,支付是支付

    order:
    O6789 "商品" ¥ 12.00 等待支付

    trade:
    T1234 O6789 "微信支付" ¥ 12.00 <prepay_id> 正在支付
    用户取消后再次支付就再生成一条,( prepay_id 超时之前可以继续用上面一条):
    T1235 O6789 "微信支付" ¥ 12.00 <prepay_id2> 支付完成 -> 操作 O6789 的状态 -> 已支付

    trade 可以扩展为支持不同的支付渠道,微信支付,支付宝,银联....
    dangyuluo
        4
    dangyuluo  
       2017-10-29 03:39:26 +08:00
    一楼回答没错,我们是这么做的,用户购买有个确认界面,要求输入地址、电话、备注等。用户输入完成后点击确认,服务器生成这个订单,并根据这个订单 id 及金额向微信统一下单服务器发送请求,得到 prepay_id,返回给前台。
    前端收到这个统一下单 id 后,调用支付接口,微信就会弹出来支付输入密码。支付完成后可以用成功的回调 js 代码。
    统一下单 api 被调用的时候一定要给一个通知地址,不能根据前端 js 来获取的支付结果,不安全。
    evolify
        5
    evolify  
    OP
       2017-10-29 07:22:59 +08:00 via iPhone
    @RihcardLu 嗯嗯,谢谢。我现在是这么做的。
    evolify
        6
    evolify  
    OP
       2017-10-29 07:23:18 +08:00 via iPhone
    @pubby 谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3416 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:48 · PVG 19:48 · LAX 03:48 · JFK 06:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.