高端响应式模板免费下载

响应式网页设计、开放源代码、永久使用、不限域名、不限使用次数

什么是响应式网页设计?

2024年网页支付详细设计(汇总9篇)

网页支付详细设计 第1篇

跳过几个支付公司,这些基础的概念在几家公司都差不太多,区别是底层技术实现。比如RPC框架,数据库,业务流程,部署架构等。

说明:

说明:

主要对接商户,比如下单、支付等接口入口。通常要求有比较高的安全性。部分公司可能会把移动端网关、PC门户网关、商户通知等能力集成在开放网关,也可能会单独拆出部署。

负责把商户的单收下来,并给商户发起结算。承担的收单产品包括有:线上收单,线下收单,担保交易、即时到账等,每个公司的商业策略不同,开出的收单产品会有差异。

有些公司把结算划到出款中心,对接银企直连的渠道。

承担无买卖标的的纯资金转移能力。典型的有:充值、转账、提现、代发。和支付的区分在于支付是有买卖标的,而资金产品没有。也就是在系统中没有买卖记录发生,但在线下可能有。

资金产品一般需要独立的牌照。

渲染可用支付方式。包括查询账户是否有余额,查询营销是否有营销券,查询渠道网关是否有可用的外部渠道,最后组合成可用支付方式,供前端渲染。

收银核心就像一个大内总管,收到请求后,找商户平台核实身份,找合约平台核实权限,找会员平台核实用户身份,找收单看一下这笔单是否可以继续支付,找账务中心获取余额信息,营销看看有没有可用的券,找渠道网关看看没有可用的渠道,找额度中心看看是否超限额了,找风控问一下当前支付是否安全,找会员平台校验支付密码 … …

负责真正的扣款或转账。有些公司叫支付核心。

如果是余额就调账务扣减余额,如果是红包就调营销做核销,如果是外部银行通道就调渠道网关。

负责去外部渠道扣款。通常还会提供渠道路由、渠道咨询等能力,做得细的公司可能会把渠道核心和报文/文件网关单独拆出来。其中渠道核心就提供渠道路由、渠道咨询、渠道开关等服务,报文/文件网关负责报文转换、签名验签等。

管理会员的生命周期,比如注册、注销、登录等。同时还提供核身服务(比如登录密码,支付密码,短信验证码等)、实名认证服务等。

管理商户的入驻签约、KYB、交易管理等。

管理对外提供的产品能力,比如快捷支付,代扣等。一般大的支付系统才会独立成一个子系统。

负责账户开立,记账等。

会计科目管理、分录管理、日切管理等。

监管报表有时候也放在这里,有些公司也会独立出去。

很多集团公司往往有一套独立的专业财务系统,这个时候往往需要会计中心做完日切后,要把记账信息合并到集团公司的财务系统中去,简称并账。

负责明细对账和资金对账。

提供满减、红包等营销工具。

针对账户和交易,提供实时、离线风控,控制交易的风险。反_、反欺诈是基本要求。

通常各公司对风控规则看成是机密,研发也可能看不到运营配置的规则。经常看到有网友问:“有xx公司的人在吗?我有xxx场景下的支付总是提示风控不过,是否知道是什么原因,怎么才能通过?”,完全是浪费口舌,谁会对外公布自己的风控规则,让人去钻空子呢?

订单管理、渠道管理、产品管理等综合运营工具。

主要用于数据汇总和分析。当前各支付公司基本都是分布式部署N多个应用,数据都在散落在各子系统中,需要汇总到数据平台用于经营分析。

负责管理用户的绑卡信息。需要经过PCI认证。

累计用户、商户的额度,通常有日、月、年,单卡等各种分类。

负责外汇报价和兑换。

一些跨境支付公司,在多个国家多个银行有头寸,各头寸之间经常需要做流动性管理,提高资金利用率。

毕竟在国外不需要把备付金强制存到央行还不给利息。当资金量大的时候,这笔收益可不少。

负责差错处理。比如渠道退款失败(银行账号销户,过了银行的退款有效期等),需要通过其它的方式退给用户。

处理用户的拒付和举证。在跨境支付场景下,信用卡用户联系发卡行说卡被盗刷或商品没有收到,或商品有问题等,拒绝支付给商户。

国内基本没有看到拒付场景。

网页支付详细设计 第2篇

所谓产品架构图,简单的理解,就是站在产品角度,提供什么样的服务能力。下面是一个典型的支付系统的产品架构图。实际实现时差异会很大,尤其是上面的产品或应用层,有很多机构为特殊的行业提供一些特殊的能力,比如携程的支付就会有航空方面的B2B业务。但基础的能力基本也就这些。

说明:

网页支付详细设计 第3篇

下面描述的概念大部分做了极致简化,只是用于入门,对于理解概念应该是够用的。真实的实现会复杂非常多。

这些概念如同支付核心系统拼图的一些小碎片,串起这些小碎片,就是一个完整的支付系统大图。

另:后面的描述中,经常混着用“支付系统”、“支付平台”,“支付机构”,“收单机构”,本质是一个东西。在内部来说,就是一个支付系统,但从和外部机构交互来说,就是一个支付平台。对用户来说是支付,对商户来说就是帮商户收单。

说明:

说明:

说明:

说明:

如果换成时序图,如下:

说明:

我们以最典型的电商购物举个例子(只是举例):小明使用PayPal在拼多多电商(海外)通过多多钱包(海外)支付了50美金。

经过简化后的交互图如下:

说明:

1)持牌的第三方支付机构和电商是独立的法律主体,所以多多钱包和多多电商是互相独立的,需要走独立的结算。

2)为突出重点,中间省略了很多中间机构,比如花旗通过清算网络才能转账到汇丰,清算网络先略过。

3)为简化描述,还有几个假设:

说明:

在支付流程中,就是商户委托收单机构(支付平台)把用户的钱收回来,然后再把钱结算给商家。

下面以典型通过外部渠道的卡支付为例说明。

说明:

说明:

说明:

渠道路由核心作用是当有多个渠道同时满足业务诉求时,综合支付成功率、支付成本、用户体验、渠道状态等多种因素挑选出最优的一条渠道

具体如下:

金融机构的记账一定是基于复式记账法。下面以用户通过支付平台使用银行支付500块为例做个简要说明。

假设:支付平台使用CMB做为收单行,在CMB开设有备付金账户。

涉及的支付平台内部账户:

记账步骤:

说明:

2. 借贷简要公式(不太严谨,但是够用):

3. 复式记账的专业书籍很多,这里只摘录几个重要的说明:

在账务系统中,通常包含以下几种账户类型:

说明:

DR:用户余额(负债类账户)100

CR:提现过渡户(负债类账户)100

一般来说,客户账户的记账需要是实时的,比如用户充值、提现,商家提现,用户退款等。

这些账户如果不做实时记账,一来有损用户体验,二来有资损风险。比如用户充值100块,如果延时不到账,用户可能会投诉。如果提现不实时记账,用户有可能重复提现成功。如果退款不实时记账,有可能在退款场景下被透支。

假设记账需要几十毫秒(数据库性能决定的),一个账户最高也就只支持几十个TPS的记账请求,对于一些高并发的账户(也称为热点账户)一定是性能不足的。这个时候一般使用缓冲记账,以提高性能。开通缓冲记账的,通常是内部账户或允许商户透支的流出场景。

缓冲记账通常就是先记录流水,然后起定时任务去捞取流水,汇总后进行记账。前提是一定要做好资损防控。

除了缓冲记账外,还有拆分账户的方式来解决热点账户问题。

会计科目就是把会计要素进行分类,比如资产、负债等。通常都会有多级分类。

会计科目示例:

说明:

有了账户和会计科目,发生一笔交易时,如何让系统自动去记账?这个是记账方案做的事。其中一个解决方案就是给不同的交易场景制定不同的交易码,通过交易码来驱动记账。

下面是一个典型的支付系统的记账方案示例。

会计日,也称为会计结算日或账务结算日,是支付平台在会计周期中进行账务处理和结算的特定日期。比如在分布式环境下,各机器可能存在时间差,一笔交易在零点时有可能跨天处理,如何判断一笔交易归属于哪天,就依据会计日来计算。

所谓日切,简单理解就是切换到下一个会计日。主要做的工作:

日切试算平衡核心逻辑:

对账一般有几种结果:

因为我方和渠道之间有一定的时间差,所以长短款在T+1对账对不上时,往往先进入存疑清单里面,第T+2对账还是对不上,才会进入差异处理。

第一层是信息流明细对账。我方流水和银行清算文件的流水逐一核对。可能会存在长短款情况。

第二层是账单对账。就是把我方流水汇总生成我方账单,然后把银行流水汇总生成银行账单,进行对账。可能会存在银行账单和我方账单不一致的情况,比如共支付100万,渠道分2次打款,一笔98万,一笔2万。

第三层是账实对账。就是我方内部记录的银行头寸和银行真实的余额是否一致。可能存在我方记录的头寸是220万,但是银行实际余额只有200万的情况。

我们通常说的记账,哪怕是一笔简单的支付,也会有多次记账。具体在什么节点记什么账,一般由财务人员决定。

下面是一个典型的使用银行通道进行支付的记账,会涉及网关过渡户,渠道待清算,商户待结算,手续费,银行头寸等多个内部户。

说明:

商户结算和用户支付是两个独立流程。

以典型的商户结算到卡记账为例,通常涉及商户待结算户,网关过渡户,渠道应清算,渠道已清算,银行头寸等内部户。

说明:

网页支付详细设计 第4篇

设计订单的实体类

public interface OrderDao {

void save(Order order);

Order findByNum(String ordernum);

void update(Order order);

//订单号降序排序

List findByCustomerId(String customerId);

List findOrderItem(String ordernum);

}

接口的实现

public class OrderDaoImpl implements OrderDao {

private QueryRunner qr=new QueryRunner(());

//保存订单

@Override

public void save(Order order) {

try {

(_insert into orders (ordernum,price,number,status,customerId) values (?,?,?,?,?)_,

(),(),(),(),

()==null?null:().getId());

List items = ();

for(OrderItem item:items){

(_insert into orderitems (id,number,price,ordernum,bookid) values (?,?,?,?,?)_,

(),(),(),(),()==null?null:().getId());

}

} catch (SQLException e) {

throw new RuntimeException(e);

}

}

public Order findByNum(String ordernum) {

try {

Order order = (_select * from orders where ordernum=?_, new BeanHandler(Order.class), ordernum);

if(order!=null){

Customer customer = (_select * from customers where id=(select customerId from orders where ordernum=?)_, new BeanHandler(Customer.class), ordernum);

(customer);

}

return order;

} catch (SQLException e) {

throw new RuntimeException(e);

}

}

public void update(Order order) {

try {

(_update orders set price=?,number=?,status=? where ordernum=?_, (),(),(),());

} catch (SQLException e) {

throw new RuntimeException(e);

}

}

@Override

public List findByCustomerId(String customerId) {

try {

List orders=(_select * from orders where customerId=?  order by ordernum desc _, new BeanListHandler(Order.class),customerId);

if(orders!=null){

Customer customer=(_select * from customers where id=? _,new BeanHandler(Customer.class),customerId);

for (Order order : orders) {

(customer);

}

}

return orders;

} catch (SQLException e) {

throw new RuntimeException(e);

}

}

@Override

public List findOrderItem(String ordernum) {

try {

List items = (_select * from orderitems where ordernum=?_, new BeanListHandler(OrderItem.class), ordernum);

if(items!=null){

for(OrderItem o:items){

Book book = (_select * from books where id=(select bookId from orderitems where id=?)_, new BeanHandler(Book.class), ());

(book);

}

}

return items;

} catch (SQLException e) {

throw new RuntimeException(e);

}

}

}

网页支付详细设计 第5篇

我们需要来一个订单表,订单详情表,以及订单的自动化序列表

--订单表

create table orders(

ordernum varchar(100) primary key,

price float(8,2),

number int,

status int,   --支付成功状态位会改变

customerId VARCHAR(100),

CONSTRAINT customerId_fk FOREIGN KEY (customerId) REFERENCES customers(id) 

)

)

--订单详情表

create table orderitems(

id varchar(100) primary key,

number int,

price float(8,2),

ordernum varchar(100),

bookid varchar(100),

CONSTRAINT ordernum_fk FOREIGN KEY (ordernum) REFERENCES orders(ordernum),

CONSTRAINT bookid_fk FOREIGN KEY (bookid) REFERENCES books(id)   

)

--订单编号表

create table ordernum(

prefix date,

num int

)

网页支付详细设计 第6篇

看一下十年前各大互联网公司支付系统架构图,就会发现最基础的偏底层的那部分到现在也很有参考价值,但是性能、可用性、基础架构等已经发生了天翻地覆的变化。

比如根据公开资料,2019 年双11 支付宝的支付峰值为 万笔/秒,真实承载能力应该远高于此。创新的业务也发生了极大的变化,比如京东白条的横空出世,在海外旅游可以直接用支付宝或微信扫码付款等。

某团的:

某Q旅游的:

某东金融的:

某蚁金服的:

网页支付详细设计 第7篇

所谓提纲挈领,就是先掌握核心主干,有了这个前提,再去深入了解细节,才不至于“乱花渐欲迷人眼”,解决问题时才能如庖丁解牛,行云流水。伟人邓公提倡的“抓住主要矛盾”,也是这个道理。

本文主要讲了一些支付核心系统相关的基本概念,希望能为大家在学习在线支付系统相关知识时能提供一些有益的参考。

犹记得N年前那天早上,我穿上最帅的衬衣、笔挺的西装裤、贼亮的皮鞋,推开房门,清风徐来,朝阳灿烂,一如我的心情,意气风发。那是我进入正值蓬勃发展的第三方支付行业的第一天。

入职当天老板扔了很多文档给我,看了一周,没看懂。想起老祖宗说的“读书百遍,其义自见”,继续苦读一周,仍然是雾里看花。不幸中的万幸,是挺过了试用期。直到多年后的一天,整理老旧硬盘的资料,才发现一方面是自己愚钝,另一方面也是那些资料写得过于晦涩难懂。于是萌发一个念头:要不我自己也总结总结?这是其中的一篇。

斗转星移,外面的阳光依然灿烂,衬衣、西装裤、皮鞋却已不知何处去了。

题图来自Unsplash,基于CC0协议

网页支付详细设计 第8篇

对于使用易宝支付我们无需导入jar包,我们直接使用其接口即可。下面这张图片是易宝支付的接口说明。

PayServlet的内容。

这里值得说一下的就是 p8_Url ,也就是支付成功后悔返回的商家界面地址。我这里写的是自己工程的地址。

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

(_UTF-8_);

String ordernum=(_ordernum_);

String money=(_money_);

String pd_FrpId=(_pd_FrpId_);

String p0_Cmd = _Buy_;

String p1_MerId = _10001126856_;

String p2_Order = ordernum;

String p3_Amt = money;

String p4_Cur = _CNY_;

String p5_Pid = _books_ //商品名称

String p6_Pcat = _unknown_;

String p7_Pdesc = _descrition_;

String p8_Url = +()+_/servlet/ResponsePayServlet_;

String p9_SAF = _1_;

String pa_MP = _unknown_;

String pr_NeedResponse=_1_;

String hmac = (p0_Cmd, p1_MerId, p2_Order, p3_Amt, p4_Cur, p5_Pid, p6_Pcat, p7_Pdesc, p8_Url, p9_SAF, pa_MP, pd_FrpId, pr_NeedResponse, _69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl_);

(_p0_Cmd_,p0_Cmd );

(_p1_MerId_,p1_MerId );

(_p2_Order_, p2_Order);

(_p3_Amt_, p3_Amt);

(_p4_Cur_,p4_Cur );

(_p5_Pid_,p5_Pid );

(_p6_Pcat_,p6_Pcat );

(_p7_Pdesc_,p7_Pdesc );

(_p8_Url_,p8_Url );

(_pa_MP_,pa_MP );

(_pr_NeedResponse_,pr_NeedResponse );

(_hmac_,hmac );

(_p9_SAF_,p9_SAF );

(_pd_FrpId_, pd_FrpId);

(_/_).forward(request, response);

}

是一个工具类,这里我们直接使用官方的即可。

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

public class PaymentUtil {

private static String encodingCharset = _UTF-8_;

/**

* 生成hmac方法

*

* @param p0_Cmd 业务类型

* @param p1_MerId 商户编号

* @param p2_Order 商户订单号

* @param p3_Amt 支付金额

* @param p4_Cur 交易币种

* @param p5_Pid 商品名称

* @param p6_Pcat 商品种类

* @param p7_Pdesc 商品描述

* @param p8_Url 商户接收支付成功数据的地址

* @param p9_SAF 送货地址

* @param pa_MP 商户扩展信息

* @param pd_FrpId 银行编码

* @param pr_NeedResponse 应答机制

* @param keyValue 商户密钥

* @return

*/

public static String buildHmac(String p0_Cmd,String p1_MerId,

String p2_Order, String p3_Amt, String p4_Cur,String p5_Pid, String p6_Pcat,

String p7_Pdesc,String p8_Url, String p9_SAF,String pa_MP,String pd_FrpId,

String pr_NeedResponse,String keyValue) {

StringBuilder sValue = new StringBuilder();

// 业务类型

(p0_Cmd);

// 商户编号

(p1_MerId);

// 商户订单号

(p2_Order);

// 支付金额

(p3_Amt);

// 交易币种

(p4_Cur);

// 商品名称

(p5_Pid);

// 商品种类

(p6_Pcat);

// 商品描述

(p7_Pdesc);

// 商户接收支付成功数据的地址

(p8_Url);

// 送货地址

(p9_SAF);

// 商户扩展信息

(pa_MP);

// 银行编码

(pd_FrpId);

// 应答机制

(pr_NeedResponse);

return ((), keyValue);

}

/**

* 返回校验hmac方法

*

* @param hmac 支付网关发来的加密验证码

* @param p1_MerId 商户编号

* @param r0_Cmd 业务类型

* @param r1_Code 支付结果

* @param r2_TrxId 易宝支付交易流水号

* @param r3_Amt 支付金额

* @param r4_Cur 交易币种

* @param r5_Pid 商品名称

* @param r6_Order 商户订单号

* @param r7_Uid 易宝支付会员ID

* @param r8_MP 商户扩展信息

* @param r9_BType 交易结果返回类型

* @param keyValue 密钥

* @return

*/

public static boolean verifyCallback(String hmac, String p1_MerId,

String r0_Cmd, String r1_Code, String r2_TrxId, String r3_Amt,

String r4_Cur, String r5_Pid, String r6_Order, String r7_Uid,

String r8_MP, String r9_BType, String keyValue) {

StringBuilder sValue = new StringBuilder();

// 商户编号

(p1_MerId);

// 业务类型

(r0_Cmd);

// 支付结果

(r1_Code);

// 易宝支付交易流水号

(r2_TrxId);

// 支付金额

(r3_Amt);

// 交易币种

(r4_Cur);

// 商品名称

(r5_Pid);

// 商户订单号

(r6_Order);

// 易宝支付会员ID

(r7_Uid);

// 商户扩展信息

(r8_MP);

// 交易结果返回类型

(r9_BType);

String sNewString = ((), keyValue);

return (hmac);

}

/**

* @param aValue

* @param aKey

* @return

*/

public static String hmacSign(String aValue, String aKey) {

byte k_ipad[] = new byte[64];

byte k_opad[] = new byte[64];

byte keyb[];

byte value[];

try {

keyb = (encodingCharset);

value = (encodingCharset);

} catch (UnsupportedEncodingException e) {

keyb = ();

value = ();

}

(k_ipad, , 64, (byte) 54);

(k_opad, , 64, (byte) 92);

for (int i = 0; i < ; i++) {

k_ipad[i] = (byte) (keyb[i] ^ 0x36);

k_opad[i] = (byte) (keyb[i] ^ 0x5c);

}

MessageDigest md = null;

try {

md = (_MD5_);

} catch (NoSuchAlgorithmException e) {

return null;

}

(k_ipad);

(value);

byte dg[] = ();

();

(k_opad);

(dg, 0, 16);

dg = ();

return toHex(dg);

}

public static String toHex(byte input[]) {

if (input == null)

return null;

StringBuffer output = new StringBuffer( * 2);

for (int i = 0; i < ; i++) {

int current = input[i] & 0xff;

if (current < 16)

(_0_);

((current, 16));

}

return ();

}

/**

*

* @param args

* @param key

* @return

*/

public static String getHmac(String[] args, String key) {

if (args == null || == 0) {

return (null);

}

StringBuffer str = new StringBuffer();

for (int i = 0; i < ; i++) {

(args[i]);

}

return (hmacSign((), key));

}

/**

* @param aValue

* @return

*/

public static String digest(String aValue) {

aValue = ();

byte value[];

try {

value = (encodingCharset);

} catch (UnsupportedEncodingException e) {

value = ();

}

MessageDigest md = null;

try {

md = (_SHA_);

} catch (NoSuchAlgorithmException e) {

();

return null;

}

return toHex((value));

}

}

对于支付成功之后,我们需要修改我们的订单状态,改为已付款,所以我们需要一个响应的servlet

public class ResponsePayServlet extends HttpServlet {

private BusinessService s=new BusinessServiceImpl();

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

(_text/html;charset=UTF-8_);

PrintWriter out = ();

String p1_MerId = (_p1_MerId_);

String r0_Cmd = (_r0_Cmd_);

String r1_Code = (_r1_Code_);//支付结果。1代表成功

String r2_TrxId = (_r2_TrxId_);

String r3_Amt = (_r3_Amt_);

String r4_Cur= (_r4_Cur_);

String r5_Pid= (_r5_Pid_);

String r6_Order = (_r6_Order_);//订单编号

String r7_Uid = (_r7_Uid_);

String r8_MP = (_r8_MP_);

String r9_BType = (_r9_BType_);//1浏览器访问的。2点对点

String hmac = (_hmac_);

//数据校验

boolean ok = (hmac, p1_MerId, r0_Cmd, r1_Code, r2_TrxId, r3_Amt, r4_Cur, r5_Pid, r6_Order, r7_Uid, r8_MP, r9_BType, _69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl_);

if(!ok){

(_数据有可能被篡改,请联系网站_);

}else{

if(_1_.equals(r1_Code)){

//支付成功:根据订单号更改订单状态。  点卡或充值时注意表单的重复提交问题。

if(_2_.equals(r9_BType)){

(_success_);

}

//更改订单的状态

/*Order order=(r6_Order);

(1);  //1表示已付款,0表示未付款

(order);*/

(1, r6_Order);

().removeAttribute(_cart_);

(_Refresh_, _2;URL=_+());

}

}

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request,response);

}

}

在这个网上书店的支付中,我们可以看到这样的效果:这里以支付1分钱为例,来演示在线支付功能。

用户在浏览商品后加入购物车并生成订单了。

先是跳转我们自己写的这个选择银行的表单中。

支付的过程我们会先跳转到易宝支付的页面。

网页支付详细设计 第9篇

生成其get,set方法,并且记得要序列化Serializable

private String ordernum;

private float price;

private int number;

private int status;

猜你喜欢