关于微信支付的疑问

2017-10-28 15:08:27 +08:00
 evolify

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

如果是放在用户点击确认支付这一步,那么用户在微信端发起付款后,可以取消支付,或者余额不足等等。然后当他再次点击确认支付的时候,后台会重复提交统一下单。这样会报错,因为订单号重复。
如果实在用户下单的时候,就请求了统一支付。这个时候还没到用户付款这一步,那这样做 prepay_id 这些信息就需要保存下来,放到数据库?或者 redis ?之后支付的时候直接取出来发给微信端,然后微信端付款。

不知以上哪种流程合理一点?请大家指点指点。
4692 次点击
所在节点    Java
6 条回复
RihcardLu
2017-10-28 16:02:23 +08:00
第一种,同一个方式如果如果不发生价格变化,不会报重复,不同方式才会,公众号支付加固定后缀。
arischow
2017-10-28 19:05:35 +08:00
prepay_id 不需要保存起来,这个 id 有效期是两小时,期间有新的 prepay_id 生成,它也不会失效。所以如果用户取消支付了的话再去调用一次统一下单就可以了。
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
2017-10-29 03:39:26 +08:00
一楼回答没错,我们是这么做的,用户购买有个确认界面,要求输入地址、电话、备注等。用户输入完成后点击确认,服务器生成这个订单,并根据这个订单 id 及金额向微信统一下单服务器发送请求,得到 prepay_id,返回给前台。
前端收到这个统一下单 id 后,调用支付接口,微信就会弹出来支付输入密码。支付完成后可以用成功的回调 js 代码。
统一下单 api 被调用的时候一定要给一个通知地址,不能根据前端 js 来获取的支付结果,不安全。
evolify
2017-10-29 07:22:59 +08:00
@RihcardLu 嗯嗯,谢谢。我现在是这么做的。
evolify
2017-10-29 07:23:18 +08:00
@pubby 谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/401497

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX