一种防止发票重开的方法、装置及设备与流程

未命名 07-12 阅读:81 评论:0


1.本发明涉及互联网技术领域,具体涉及一种防止发票重开的方法、装置及设备。


背景技术:

2.随着电子互联网技术的发展,通过互联网开发票也越来越普及。目前大部分的发票互联网行业都提供了连续开票、批量开票等功能。在开票时,由于在后端很难识别重复的开票请求是否符合用户的意图,因此大部分开票软件会通过在前端页面将跳转或按钮置灰,来防止用户多次提交或点击,以达到防止重复开票的目的。
3.但这类方式仍有不足:一方面,对于代账公司,多个会计使用各自电脑,如果这些人同时对一张发票点击发票重开,仍有可能开出两张相同的发票的情况;另一方面,在后端开具发票的过程中,如果出现后端接口超时、网络卡顿等情况,也可能导致开票请求重复发出多次而出现重复开票的情况。


技术实现要素:

4.有鉴于此,本发明的目的在于提供一种防止发票重开的方法、装置及设备,以改善上述问题。
5.本发明公开了一种防止发票重开的方法,其包括:
6.通过开票请求拦截器拦截用户发出的开票请求;
7.从所述开票请求中提取发票信息,根据所述发票信息生成唯一key,并以所述key为标识尝试对所述发票信息加全局锁;
8.判断是否加锁成功;
9.当加锁成功后,向锁监视器注册所述全局锁;
10.在业务层对发票信息进行重复性校验;
11.在通过重复性校验后,根据所述发票信息执行开票业务;
12.判断是否开票成功;
13.若是,则在用户的用户端上展示开票结果;
14.若否,则提示开票失败,并删除全局锁。
15.优选地,通过开票请求拦截器拦截用户发出的开票请求具体为:
16.通过使用spring mvc的interceptor识别请求的url,判断是否为开票请求,并拦截开票请求。
17.优选地,从所述开票请求中提取发票信息,根据所述发票信息生成唯一key,并以所述key为标识尝试对所述发票信息加全局锁以及判断是否加锁成功,具体为:
18.提取所述开票请求中的发票信息,并序列化成json数据;
19.通过hash算法对发票信息加密后得到唯一key;
20.判断是否存在与以所述key作为标识的全局锁;
21.若不存在,则以所述key作为标识,使用redis的setnx加全局锁,并同时设置该全
局锁的失效时间;
22.若存在,则说明所述key已经被其他开票请求加锁使用,提示加锁失败。
23.优选地,当判断发票信息包括多张发票的发票信息时,则从所述开票请求中提取发票信息,根据所述发票信息生成唯一key,并以所述key为标识尝试对所述发票信息加全局锁,具体为:
24.对各个所述发票信息,分别序列化成json数据;
25.以其所属的发票为分组,对每个发票的json数据根据hash算法进行分组加密,生成对应的分组密文;
26.判断当前存在的全局锁的标识中,是否存在其标识包含所述分组密文中的任一个密文;
27.若不存在,则以所述分组密文形成key,并以所述key作为标识,使用redis的setnx加全局锁,并同时设置该全局锁的失效时间;
28.若存在,则提示加锁失败。
29.优选地,所述锁监视器为静态类,其包含注册表,并提供注册锁和注销锁的方法;其中,所述注册表为一个concurrenthashmap;
30.注册锁为往注册表里新增键值对的过程;键是加锁用的key,值包含锁的到期时间和持续时间;
31.注销锁为删除注册表中的锁信息。
32.优选地,所述重复性校验包括做幂校验,用于防止相同的申请单和已经开具成功的发票被再次开票。
33.优选地,在开票成功后,保留全局锁,以保证在全局锁的有效期内,不会发生重复开票。
34.优选地,在执行开票业务时,通过锁监视器定期运行续期定时器线程,遍历注册表,判断全局锁的到期时间是否小于预设值,如果是,则为全局锁续期,续期时长为所述全局锁的初始持续时长,直到锁被注销。
35.本发明实施例还提供了一种防止发票重开的装置,其包括:
36.拦截单元,用于通过开票请求拦截器拦截用户发出的开票请求;
37.加密单元,用于从所述开票请求中提取发票信息,根据所述发票信息生成唯一key,并以所述key为标识尝试对所述发票信息加全局锁;
38.第一判断单元,用于判断是否加锁成功;
39.注册单元,用于当加锁成功后,向锁监视器注册所述全局锁;
40.检验单元,用于在业务层对发票信息进行重复性校验;
41.开票单元,用于在通过重复性校验后,根据所述发票信息执行开票业务;
42.第二判断单元,用于判断是否开票成功;若是,则在用户的用户端上展示开票结果;若否,则提示开票失败,并删除全局锁。
43.本发明实施例还提供了一种防止发票重开的装置,其包括存储器以及处理器,所述存储器内存储有计算机程序,所述计算机程序能够被所述处理器执行,以实现如上述的防止发票重开的方法。
44.综上所述,本实施例具体如下优点:
45.(1)、通过开票请求拦截器来拦截开票请求,根据请求中的发票信息,生成全局唯一的key,再使用此key作为标识加锁,加锁失败则代表重复开票,相比于前端拦截的方式,可以彻底避免出现重复开票的问题。
46.(2)、为防止开票业务方法执行时间过长,导致锁到期失效,需要向锁监视器注册当前执行线程和锁的信息。锁监视器会在锁失效前,循环判断业务线程是否占有锁,如果是,则为锁续期,直到开票业务方法执行完毕后,注销当前线程和锁。锁监视器自动为锁续期,避免出现因为代码缺陷,导致不解锁或者死锁的问题。
附图说明
47.图1是本发明第一实施例提供的防止发票重开的方法的一种流程示意图。
48.图2是本发明第一实施例提供的防止发票重开的方法的另一种流程示意图。
49.图3是本发明第二实施例提供的防止发票重开的装置的结构示意图。
具体实施方式
50.为使本发明实施方式的目的、技术方案和优点更加清楚,下面将结合本发明实施方式中的附图,对本发明实施方式中的技术方案进行清楚、完整地描述,显然,所描述的实施方式是本发明一部分实施方式,而不是全部的实施方式。基于本发明中的实施方式,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施方式,都属于本发明保护的范围。因此,以下对在附图中提供的本发明的实施方式的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施方式。基于本发明中的实施方式,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施方式,都属于本发明保护的范围。
51.以下结合附图对本发明的具体实施例做详细说明。
52.请参阅图1及图2,本发明第一实施例公开了一种防止发票重开的方法,其可由防止发票重开的设备(以下简称设备)来执行,特别的,由所述设备内的一个或者多个处理器来执行,以实现如下步骤:
53.s101,通过开票请求拦截器拦截用户发出的开票请求。
54.在本实施例中,所述设备可为服务器,其可以获取各个用户通过用户终端发起的开票请求,并执行开票业务。
55.具体地,在本实施例中,当用户想要执行开票时,其可以输入发票信息,并根据发票信息生成开票请求后发送给所述设备。所述设备则通过使用spring mvc的interceptor识别请求的url,判断是否为开票请求,并在判断是开票请求后,拦截该开票请求。
56.s102,从所述开票请求中提取发票信息,根据所述发票信息生成唯一key,并以所述key为标识尝试对所述发票信息加全局锁。
57.s103,判断是否加锁成功。
58.在本实施例中,所述发票信息例如可以包括发票的抬头、发票编号、发票事项、发票金额等,本发明不做具体限定。通常来说,每个发票信息都是唯一的。
59.在本实施例中,所述设备在提取发票信息后,其可以根据所述发票信息生成唯一key,并以所述key为标识尝试对所述发票信息加全局锁。具体地,
60.首先,所述设备提取所述开票请求中的发票信息,并序列化成json数据。
61.然后,通过hash算法对发票信息加密后得到唯一key。
62.其中,可以采用类似sha128、sha256等碰撞概率极低的hash算法,基本可以认为该key与发票信息是一一对应。基于此,如果两次开票请求经过计算得出的key相等,则可以判断其发票信息相同,属于重复开票。
63.接着,判断是否存在与以所述key作为标识的全局锁;
64.若不存在,则以所述key作为标识,使用redis的setnx加全局锁,并同时设置该全局锁的失效时间;
65.若存在,则说明所述key已经被其他开票请求加锁使用,提示加锁失败。
66.s104,当加锁成功后,向锁监视器注册所述全局锁。
67.具体的,在本实施例中,锁监视器是一个静态类,包含注册表,并提供注册锁和注销锁的方法。注册表,就是个concurrenthashmap。注册锁实际上就是往注册表里新增键值对的过程。键是加锁用的唯一key,值包含锁的到期时间和持续时间。则注销锁就是删除注册表中的锁信息的过程。
68.s105,在业务层对发票信息进行重复性校验。
69.在本实施例中,在加锁成功后,还需要在业务层面做幂等重复性校验,比如相同的申请单不能重复开票,已经开具成功的发票不能再次开票等。不同的开票应用,具体的幂等校验逻辑也不相同,本发明在此不做具体限定。
70.s106,在通过重复性校验后,根据所述发票信息执行开票业务。
71.s107,判断是否开票成功;
72.s108,若是,则在用户的用户端上展示开票结果;
73.s109,若否,则提示开票失败,并删除全局锁。
74.在本实施例中,开票业务方法执行完毕后,需要注销锁,防止在步后续一直给锁续期。
75.在本实施例中,如果开票失败,需要删除全局锁,用户再次点击开票重试,由于没有了全局锁,因此不会被判断为重复开票。如果开票成功,不删除全局锁,即在该全局锁的有效期内,不可以重复开票。
76.此外,为防止开票业务方法执行时间过长,导致锁到期失效,锁监视器,需要为即将失效的锁做续期。具体的,后台运行续期定时器线程,每隔预定的时间(如1秒)遍历注册表,判断锁的到期时间是否小于设定值(如1秒),如果是,则为锁续期,续期时长为锁的初始持续时长,直到锁被注销。
77.综上所述,本实施例具体如下优点:
78.(1)、通过开票请求拦截器来拦截开票请求,根据请求中的发票信息,生成全局唯一的key,再使用此key作为标识加锁,加锁失败则代表重复开票,相比于前端拦截的方式,可以彻底避免出现重复开票的问题。
79.(2)、为防止开票业务方法执行时间过长,导致锁到期失效,需要向锁监视器注册当前执行线程和锁的信息。锁监视器会在锁失效前,循环判断业务线程是否占有锁,如果是,则为锁续期,直到开票业务方法执行完毕后,注销当前线程和锁。锁监视器自动为锁续期,避免出现因为代码缺陷,导致不解锁或者死锁的问题。
80.优选地,当判断发票信息包括多张发票的发票信息时,则从所述开票请求中提取发票信息,根据所述发票信息生成唯一key,并以所述key为标识尝试对所述发票信息加全局锁,具体为:
81.对各个所述发票信息,分别序列化成json数据;
82.以其所属的发票为分组,对每个发票的json数据根据hash算法进行分组加密,生成对应的分组密文;
83.判断当前存在的全局锁的标识中,是否存在其标识包含所述分组密文中的任一个密文;
84.若不存在,则以所述分组密文形成key,并以所述key作为标识,使用redis的setnx加全局锁,并同时设置该全局锁的失效时间;
85.若存在,则提示加锁失败。
86.在一些情况下,用户可能想要把多笔订单合并一起开发票。例如,用户想到把多次的打车记录开在一张发票上,则此时的发票信息应该是包括每次的打车信息。又或者说,用户在某个店铺里先后购买了多次物品,在后面想要将这多笔交易一起开在一张发票上,则此时发票信息也应该包括每次的交易信息。
87.举例来说,用户想要将交易记录1、交易记录2、交易记录3合并开发到一张发票上,则此时开票请求中的发票信息应该包括交易记录1的信息、交易记录2的信息、交易记录3的信息。那么最终的key也是由交易记录1的信息、交易记录2的信息、交易记录3的信息生成的。
88.然而,在这种情况下,如果后面用户又再用交易记录2来发起开票请求的话,由于其仅保护交易记录2的信息,因此生成的key与合并开票的key是不同的,这造成交易记录2是可以重新开票的。
89.为避免这种情况,在本实施例中,在合并开票时,会对各个所述发票信息分别序列化成json数据,然后以其所属的发票为分组,对每个发票的json数据根据hash算法进行分组加密,生成对应的分组密文;再进行重复判断时,会判断判断当前存在的全局锁的标识中,是否存在其标识包含所述分组密文中的任一个密文。如果存在,则说明当前的key是已有的标识的子集,此种情况下,也会被认定为是重复开票,如此,避免了上述提及的合并开票可能产生的重复开票的问题。
90.请参阅图3,本发明第二实施例还提供了一种防止发票重开的装置,其包括:
91.拦截单元210,用于通过开票请求拦截器拦截用户发出的开票请求;
92.加密单元220,用于从所述开票请求中提取发票信息,根据所述发票信息生成唯一key,并以所述key为标识尝试对所述发票信息加全局锁;
93.第一判断单元230,用于判断是否加锁成功;
94.注册单元240,用于当加锁成功后,向锁监视器注册所述全局锁;
95.检验单元250,用于在业务层对发票信息进行重复性校验;
96.开票单元260,用于在通过重复性校验后,根据所述发票信息执行开票业务;
97.第二判断单元270,用于判断是否开票成功;若是,则在用户的用户端上展示开票结果;若否,则提示开票失败,并删除全局锁。
98.本发明第三实施例还提供了一种防止发票重开的装置,其包括存储器以及处理
器,所述存储器内存储有计算机程序,所述计算机程序能够被所述处理器执行,以实现如上述的防止发票重开的方法。
99.本发明第四实施例还提供了一种计算机可读存储介质,其存储有计算机程序,所述计算机程序能够被所述计算机可读存储介质所在设备的处理器执行,以实现如上述的防止发票重开的方法。
100.在本发明所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置和方法实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
101.另外,在本发明各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
102.所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,电子设备,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
103.以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

技术特征:
1.一种防止发票重开的方法,其特征在于,包括:通过开票请求拦截器拦截用户发出的开票请求;从所述开票请求中提取发票信息,根据所述发票信息生成唯一key,并以所述key为标识尝试对所述发票信息加全局锁;判断是否加锁成功;当加锁成功后,向锁监视器注册所述全局锁;在业务层对发票信息进行重复性校验;在通过重复性校验后,根据所述发票信息执行开票业务;判断是否开票成功;若是,则在用户的用户端上展示开票结果;若否,则提示开票失败,并删除全局锁。2.根据权利要求1所述的防止发票重开的方法,其特征在于,通过开票请求拦截器拦截用户发出的开票请求具体为:通过使用spring mvc的interceptor识别请求的url,判断是否为开票请求,并拦截开票请求。3.根据权利要求1所述的防止发票重开的方法,其特征在于,从所述开票请求中提取发票信息,根据所述发票信息生成唯一key,并以所述key为标识尝试对所述发票信息加全局锁以及判断是否加锁成功,具体为:提取所述开票请求中的发票信息,并序列化成json数据;通过hash算法对发票信息加密后得到唯一key;判断是否存在与以所述key作为标识的全局锁;若不存在,则以所述key作为标识,使用redis的setnx加全局锁,并同时设置该全局锁的失效时间;若存在,则说明所述key已经被其他开票请求加锁使用,提示加锁失败。4.根据权利要求1所述的防止发票重开的方法,其特征在于,当判断发票信息包括多张发票的发票信息时,则从所述开票请求中提取发票信息,根据所述发票信息生成唯一key,并以所述key为标识尝试对所述发票信息加全局锁,具体为:对各个所述发票信息,分别序列化成json数据;以其所属的发票为分组,对每个发票的json数据根据hash算法进行分组加密,生成对应的分组密文;判断当前存在的全局锁的标识中,是否存在其标识包含所述分组密文中的任一个密文;若不存在,则以所述分组密文形成key,并以所述key作为标识,使用redis的setnx加全局锁,并同时设置该全局锁的失效时间;若存在,则提示加锁失败。5.根据权利要求1所述的防止发票重开的方法,其特征在于,所述锁监视器为静态类,其包含注册表,并提供注册锁和注销锁的方法;其中,所述注册表为一个concurrenthashmap;注册锁为往注册表里新增键值对的过程;键是加锁用的key,值包含锁的到期时间和持
续时间;注销锁为删除注册表中的锁信息。6.根据权利要求1所述的防止发票重开的方法,其特征在于,所述重复性校验包括做幂校验,用于防止相同的申请单和已经开具成功的发票被再次开票。7.根据权利要求1所述的防止发票重开的方法,其特征在于,在开票成功后,保留全局锁,以保证在全局锁的有效期内,不会发生重复开票。8.根据权利要求1所述的防止发票重开的方法,其特征在于,在执行开票业务时,通过锁监视器定期运行续期定时器线程,遍历注册表,判断全局锁的到期时间是否小于预设值,如果是,则为全局锁续期,续期时长为所述全局锁的初始持续时长,直到锁被注销。9.一种防止发票重开的装置,其特征在于,包括:拦截单元,用于通过开票请求拦截器拦截用户发出的开票请求;加密单元,用于从所述开票请求中提取发票信息,根据所述发票信息生成唯一key,并以所述key为标识尝试对所述发票信息加全局锁;第一判断单元,用于判断是否加锁成功;注册单元,用于当加锁成功后,向锁监视器注册所述全局锁;检验单元,用于在业务层对发票信息进行重复性校验;开票单元,用于在通过重复性校验后,根据所述发票信息执行开票业务;第二判断单元,用于判断是否开票成功;若是,则在用户的用户端上展示开票结果;若否,则提示开票失败,并删除全局锁。10.一种防止发票重开的装置,其特征在于,包括存储器以及处理器,所述存储器内存储有计算机程序,所述计算机程序能够被所述处理器执行,以实现如权利要求1至8任意一项所述的防止发票重开的方法。

技术总结
本发明提供了一种防止发票重开的方法、装置及设备,方法包括:通过开票请求拦截器拦截用户发出的开票请求;从所述开票请求中提取发票信息,根据所述发票信息生成唯一key,并以所述key为标识尝试对所述发票信息加全局锁;判断是否加锁成功;当加锁成功后,向锁监视器注册所述全局锁;在业务层对发票信息进行重复性校验;在通过重复性校验后,根据所述发票信息执行开票业务;判断是否开票成功;若是,则在用户的用户端上展示开票结果;若否,则提示开票失败,并删除全局锁。本发明通过开票请求拦截器来拦截开票请求,根据请求中的发票信息,生成全局唯一的key,再使用此key作为标识加锁,相比于前端拦截的方式,可以彻底避免出现重复开票的问题。开票的问题。开票的问题。


技术研发人员:林旭光 王福平
受保护的技术使用者:北京融易算科技有限公司
技术研发日:2023.03.29
技术公布日:2023/7/7
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐