您的位置首页 >企业 >

调用交易服务更新订单价格失效(调用交易服务更新订单价格失败)

导读 大家好,小品为大家解答以上问题。调用交易服务更新订单价格失效,调用交易服务更新订单价格失败这个很多人还不知道,现在让我们一起来看看

大家好,小品为大家解答以上问题。调用交易服务更新订单价格失效,调用交易服务更新订单价格失败这个很多人还不知道,现在让我们一起来看看吧!

解答:

1、 支付宝上有一种保险叫国民保险和终身养老金。

2、 看它宣传的各种保障和好处,但人们往往沉浸在表面。你可以看看我在下图用红线圈出的地方:增保额协议、支付授权、保险通知、产品说明书、保险条款、平台服务协议。

3、 少数人已经仔细阅读、理解和明白。只在表面上投保是一种禁忌。

4、 参加全民终身养老金有15天的犹豫期。在犹豫期间,我们可以全额退保,退多少钱就退多少钱。犹豫期过后,能退多少钱需要按照相关规定执行。根据保险,它是可退还保险单的现金价值。

5、 保险单的现金价值是多少?保单的现金价值与我们的投资理财完全不同。无论我们投资理财还是存款,我们支付的钱的本金都是属于我们的。然而,我们支付的保费不是存款和财务管理。保险费由保险公司控制。如果我们买了意外险,在规定的期限内不会发生意外,所有的保费都不会退还。商业养老分红保险也是如此,但保费不会完全扣除,而是从保险公司的某些必要支出中扣除,如账户管理费、风险保险费、销售渠道费或代理佣金等。产品介绍中有这样一个演示:

6、 30岁一次性缴纳保费1万元,60岁每年缴纳保险金额1010元。

7、 一次性支付保费后,退保即保单的现金价值仅为8160元。而且,所有保单的现金价值都是按照3%左右的保证利率,每年增加8160元。不过,令人欣慰的是,知道还有一定的浮动股息,从0%到3%不等,无法保证。如果回报率只有3%,对我们投资理财真的没有太大的吸引力。要达到4%~5%的回报率还是很简单的。

8、 如果很多人从这种不确定性出发,那么他们参加保险的意愿就会大大降低。毕竟30岁的时候,我们存了1万块钱,60岁以后,我们一年只领1010块钱。30年后的购买力如何?人们对此深表怀疑。所以保险的特点是长期稳定,各种利益基本可以在保险合同中约定,未来长期不变,让保险公司通过各种 手段实现自己的长期目标,稳定赚钱,有利润。

9、 与商业养老保险相比,社会养老保险有其自身的特点。社会保险由国家法律强制执行,由国家管理、征收、支付甚至补贴。为了避免养老金流于形式,国家应确保退休人员的待遇与经济和社会发展相一致。所以很多国家都采用现收现付的养老保险模式,最大的好处就是可以保证购买力的稳定。然后,国家通过各种手段形成养老保险平准基金的余额,用于调节保险基金收支的波动。2018年,全国基本养老保险基金收入51168亿元,支出44645亿元,养老保险基金累计结余超过5万亿元。过去可能参加过保险的老人只交了一点养老保险,视同缴费期间的很多保险费都是国家交的,但是现在每个月的养老金都是三四千元,非常划算。不要以为国家出钱就没人出钱。2017年,政府补助基本养老保险基金8004亿元。2019年,中央财政安排养老保险基金补贴5600多亿元,未考虑各类人员和场所支出。因此,中国的养老保险是一项非常亏损的业务,但它也是为了社会的福利。

10、 说商业养老保险不划算吗?其实商业养老保险最大的特点不是投资,而是稳定。如果我们的收入很不稳定,比如我们现在可能一年赚几百万,但是将来可能会失业,所以买商业养老保险是很有必要的。收入高的时候参加养老保险,是平衡未来收入现金流非常有利的保障。李嘉诚为每一个孙子孙女购买了1亿港元的养老分红保险,可以保证这些孩子过上舒适的生活,每个月至少有几十万港元的分红收入。至于这几十万元几十年的购买力,没必要考虑太多。

11、 综上所述,商业养老保险有其特定的功能。如果把它当成存款或者投资理财,其实是有偏见的理解。好了,回到今天的话题,让我们分享一些处理今天支付系统异常的方法。

12、 事实上,这些处理方法并不局限于支付系统,也可以应用到其他系统中,我们可以借鉴并应用到自己的系统中,提高自己系统的健壮性。

13、 异常是系统运行中不可避免的问题。如果一切正常,我们的系统设计会相当简单。

14、 不幸的是,没有人能做到这一点,所以为了应对异常可能带来的问题,我们不得不增加很多额外的设计来应对这些异常。

15、 可以说,在系统设计中,异常处理需要我们专注于思考,会占据我们大部分的精力。

16、 我们先来看看支付系统中最常见的异常现象:“掉单”。

17、 订单下降异常。

18、 最常见的支付平台架构之一如下:

19、 我们以携程为例。在携程上发起订单支付将通过三个系统:

20、 携程创建订单并向第三方支付公司发起支付请求。

21、 第三方支付公司创建订单,向工行发起支付请求。

22、 工行完成扣款操作,返回第三方支付公司。

23、 第三方支付完成订单更新,返回携程。

24、 携程更改订单状态。

25、 上述过程很简单,如下图所示:

26、 在这个过程中,可能会发生用户的工银卡已经被扣款,但携程订单仍未支付的情况。我们通常称这种情况为“票据取消”。

27、 以上大部分掉单的场景都是因为“、”环。

28、还有一种极少数的情况,收到 「③、⑤」环节返回信息,但是在「④、⑥」环节内部系统更新订单状态失败,从而导致丢失支付成功的信息,这类掉单由于是内部问题,我们通常将其称之为「内部掉单」。

29、外部掉单

30、外部掉单是因为没有收到对端返回信息,这种情况极有可能是网络问题,也有可能对端处理逻辑太慢,导致我方请求超时,直接断开了网络请求。

31、增加超时时间

32、对于这种情况,第一个最简单的解决办法,「适当的增加超时时间」。

33、不过这里需要注意了,在我们增加网络超时时间之后,我们可能还需要调整整个链路的超时时间,不然有可能导致整个链路内部差事从而引起内部掉单。

34、第二个办法,接收渠道异步回执通知信息。

35、一般来说,现在支付渠道接口我们都可以上送一个异步回调地址,当渠道端处理成功,将会把成功信息通知到这个回调地址上。

36、这种情况下,我们只需要接收通知信息,然后解析,再更新内部订单状态。

37、

38、支付系统异常处理-支付异步通知

39、这种情况下,我们需要注意几点:

40、掉单查询

41、有的渠道可能没有提供异步通知的功能,只提供了订单查询的接口,这种情况下,我们只能使用第三种解决办法,定时掉单查询。

42、我们可以将这类超时未知的订单的单独保存到掉单表,然后定时向渠道端查询订单的状态。

43、若查询成功或者明确失败(比如订单不存在等),可以更新订单状态,并且删除掉单表记录。

44、若查询依旧未知,这时我们需要等待下次查询的结果。

45、

46、支付系统异常处理-定时查询

47、这里我们需要注意了,有些情况下,有可能无法查询返回订单的状态,所以我们需要设置订单查询的最大次数,防止无限查询浪费性能。

48、对账

49、最后,极少数的情况下,订单查询与异步通知都无法获取的支付结果,这就还剩下最后一种兜底的解决办法,对账。

50、如果第二天渠道端给的对账文件有这一笔支付结果,那么我们可以根据这个记录更新直接更新我们内部支付记录。

51、之前小黑哥写过一篇对账文章,感兴趣的可以再看一下:聊聊对账系统的设计方案

52、那如果第二天也没有这笔记录的结果,这种情况下,我们可以认为这笔是失败的。如果用户被扣款,渠道端内部将会发起退款,将支付金额返回给用户。所以这种情况可以无需处理。

53、内部掉单异常

54、支付公司内部订单关系

55、接下来我们讲下内部掉单异常,首先我们来看下为什么会发生内部掉单的异常,这其实跟我们系统架构有关。

56、

57、如上图随所示,第三方支付公司内部表通常为支付订单与渠道订单这样一种 1 比 N 的关系。

58、支付订单保存着外部商户系统的订单号,代表第三方支付公司内部订单与外部商户的订单的关系。

59、而渠道订单代表着第三方支付公司与外部渠道的关系,其实对于外部渠道系统来讲,第三方支付公司就是一个外部商户。

60、为什么需要设计这种关系那?而不是使用下面这种 1 对 1 关系的那?

61、

62、如果我们使用上图 1 对1 的订单关系,如果第一次支付支付失败,外部商户可能会再次使用相同订单号对第三方支付公司发起支付。

63、这时如果第三方支付公司也拿相同的内部订单去请求外部渠道系统,有可能外部渠道系统并不支持同一订单号再次请求。

64、那其实我们也有其他办法,生成一个新的内部单号,更新原有支付订单上内部记录,然后去请求外部渠道系统。但是这样的话就会丢失上次支付失败记录,这就不利于我们做一些事后统计了。

65、那其实第三方支付公司也可以不支持相同的订单号再次发起请求,但是这样的话,就需要外部商户重新生成的新的订单号。

66、这样的话,第三方支付公司是系统是简单了,全部复杂度都交给了外部商户。

67、但是现实的情况,很多外部商户并不是那么容易更换生成新的订单号,所以一般第三方支付公司都需要支持同一外部商户订单号在未成功的情况下,支持重复支付。

68、在这种情况下,就需要我们上面的 1:N 的订单关系图了。

69、内部掉单异常的原因

70、当我们收到外部渠道系统的成功的返回信息,成功更新了渠道订单表的记录。但是由于渠道订单表与支付订单表可能不是同一个数据库,也有可能两者并不在同一个应用中,这就有可能导致更新支付订单表的更新失败。

71、

72、由于支付订单是表保存着外部商户订单与内部订单关系,支付订单未成功,所以外部商户也无法查询得到成功的支付结果。

73、此时渠道订单表已经成功,所以上面外部掉单的方法并不适用内部掉单。

74、内部掉单异常解决办法

75、「第一种解决办法,分布式事务。」

76、内部掉单异常,说白就是因为支付订单表与渠道订单表无法使用数据库事务保证两者同时更新成功或失败。

77、那么这种情况下,我们其实就需要使用分布式事务了。

78、不过我们没有采用这种分布式事务,一是因为之前开发的时候市面上并没有开源成熟分布式事务框架,第二自己自己开发难度又很大。

79、所以对于分布式事务这一块,并没有什么使用经验。如果有使用分布式事务解决这类的问题同学,留言去可以评论一下。

80、「第二种解决办法,异步补偿更新。」

81、当发生内部掉单的情况,即更新支付订单失败等情况,可以将这里支付订单保存到一张内部掉单表。

82、但是这里可能会有一个问题,我们无法保证保存到内部掉单表这一步骤也一定成功。

83、所以说,我们还需要定时查询,查询一段时间内支付订单未成功,而渠道订单表已成功的支付订单记录,然后也将其插入到内部掉单表。

84、另一个系统应用,只需要定时扫描内部掉单表,将支付订单成功,然后再删除内部掉单记录即可。

85、这里需要注意了,当支付订单表数据量很大之后,定时查询可能会慢,为了防止影响主库,所以这类查询可以在备库进行。

86、总结

87、今天主要介绍了支付系统中的掉单异常,这类异常往往会导致用户实际已经被扣钱,但是商户订单还是等待支付的情况。

88、这个异常如果没有很好处理,将会导致客户用户体验很不好,还有可能收到客户的投诉。

89、掉单的异常,通常可以外部系统与内部系统。而大部分的掉单都是因为外部系统导致,我们可以增加超时时间,掉单查询,以及接受异步通知解决 99% 的问题,剩下 1% 的掉单只能通过次日的对账来兜底。

90、内部系统导致掉单异常是典型的分布式环境数据一致性的问题,这类问题我们可以不需要追求强一致性,只要保证最终一致性即可。我们可以使用分布式事务解决这类问题,也可以定时扫描状态不一致的订单,然后在做批量更新。

91、最后,这次只是介绍支付系统中一类掉单异常,下一篇文章中,再给大家介绍一下支付系统的其他异常,敬请期待!

本文就为大家讲解到这里,希望大家看了会喜欢。

标签:

免责声明:本文由用户上传,如有侵权请联系删除!
Baidu
map