java--用户下单-->支付--退款流程

工程做完了 来个总结

1.提交订单 1.1 提交参数(主要参数) 用户id、商家id、服务id、服务单价、数量、总价 1.2 验证提交过来的信息是否正确 验证参数:单价与总价 1.3 向订单表插入数据 状态:未付款、未评价 1.4 返回订单id

//如下2~10是微信支付、查询、退款流程 2.支付(先说微信支付流程,支付宝的下面说) 2.1 提交参数(不涉及三方接口需求参数) 用户id、订单id、支付金额、商品描述(微信支付接口需要) 2.2 支付前检查订单信息(存在今年下单明年支付,服务价格发生变化的情况) 验证参数:单价与总价 2.3 微信支付所需参数 //https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1 应用ID、商品描述、商户号、随机字符串、微信回调地址、商户订单ID、终端IP、交易类型、交易金额、签名 2.4 向微信发送支付请求 2.5 微信返回请求信息 2.5.1 请求成功(return_code=SUCCESS)(注意:请求成功不代表支付成功,具体看微信支付文档) 接着判断return_msg,如果为非空,则说明请求失败(其实这里不用判断也行), 2.5.1.1 向微信预支付记录表插入一条记录(即每次发起微信支付请求,无论成功与否,都要向微信预支付记录表插入记录,记录包括:客户端请求信息与微信服务端返回信息) 2.5.2 请求失败 很明显,直接向微信预支付记录表插入一条记录。 2.6 请求成功,验证签名信息 根据微信返回的参数 进行签名验证,验证失败,向微信预支付记录表插入一条记录。 2.7 请求成功,验证签名成功 2.7.1 解析微信返回的信息 2.7.2 判断(result_code=SUCCESS),这是交易码,它用于判断支付成功/失败 2.7.2.1 成功,说明交易成功了,设置返回给移动端的数据 2.7.2.2 失败,说明请求成功了,支付失败了 2.8 无论成功/失败,向微信预支付记录表插入一条记录。

3.移动端确认支付 //微信支付流程 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3 移动端开发流程详见 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 3.1 移动端调用微信支付 2.7交易成功返回给移动端预支付id、扩展字段、签名等字段,移动端注册appId、调起微信支付接口、发起微信支付请求(微信支付流程中的8,9,10三个步骤);接着微信服务器授权验证,通过后,返回给移动端输入密码的页面,移动端输入正确的密码,确认支付(微信支付流程中的11,12,13),微信服务器验证通过后,分为两步 3.1 同步通知:支付结果同步通知给移动端 3.2 异步通知:支付结果异步通知给商户服务器--就是回调服务

4.微信回调服务器端,异步通知支付结果 //微信支付结果通知 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3 4.1 取回调中的数据 // 代码如下,回调数据是xml格式 while ((inputLine = request.getReader().readLine()) != null) { notityXml += inputLine; } request.getReader().close(); 4.2 将xml格式的数据转换成map方式 4.3 判断回调是否成功 return_code=SUCCESS表示回调成功 4.3.1 return_code=SUCCESS,再判断return_msg=OK,如果失败,则向微信支付记录表插入一条记录 4.3.2 return_code=FAIL,则直接向微信支付记录表插入一条记录 4.4 判断支付是否成功 result_code=SUCCESS表示支付成功 4.4.1 支付成功,开始验证回调返回参数 4.4.2 验证失败,向微信支付记录表插入一条记录 4.4.3 验证成功,说明支付成功了,这时候需要做两件事 4.4.3.1 向微信服务器发送"return_code", "SUCCESS"和"return_msg", "OK" 4.4.3.2 处理自己服务器的业务,需要的参数:订单id、支付凭证id 0>由于微信回调会有多次,所以更新订单表之前需要检查下该订单的状态,如果已经是"已付款",则不需要再次更新订单表与向paycode表插入记录 1>更新订单表,订单状态:"已付款",付款方式:"微信支付",支付凭证单号:"xx", 2>更新订单表成功后,向订单支付码表插入记录,有几个服务,就需要插入几条记录 插入paycode表,关键字段 消费状态:未消费;退款状态:无退款;有效区分:有效;有效开始时间和有效截止时间

5.微信向移动端同步通知支付结果 微信服务器回调移动端onResp函数,向移动端发送支付结果。注意:不能以客户端收到的结果作为用户支付结果,应该以服务器端接收到的支付通知或者是移动端查询支付结果为准。

6.移动端查询微信支付结果 //微信查询订单接口 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_2&index=4 6.1 查询参数 应用ID、商户号、订单ID(移动端传过来)、随机字符串、签名 6.2 查询返回参数 同上面的步骤一致,判断查询是否成功 查询成功后,验证返回信息的有效性 验证成功后,判断支付结果 支付成功后,处理自己的业务 处理业务与微信服务器回调成功后处理的相同。

7.移动端调 关闭订单接口 //微信关闭订单接口 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_3&index=5 注:以下情况需要调用 关闭订单接口 1>用户订单支付失败需要重新生成订单号重新发起支付,此时需要对原订单号关闭,避免重复支付 2>用户发起支付后,在规定的时间内未支付,系统不再受理该次支付,需要关闭该订单 同上述步骤一样,只是 需要向 微信支付订单关闭记录表 插入数据

8.用户退款申请 8.1 请求本地服务器申请退款 请求参数:订单ID、退款数量、退款金额、退款原因 退款情况 1>全部使用,用户与商家商量退款事宜,生成退款单 2>部分使用/全部未使用,允许退款未使用的部分,生成退款单与退款单明细表 8.2 本地服务器验证退款信息 1>判断该订单支付时间,大于7天,不予退款 2>查询该订单已消费支付码(unUsePaymentCodeList数组)与未消费支付码(usePaymentCodeList数组) 3>判断部分使用/全部未使用情况 3-1>判断 unUsePaymentCodeList.size() == refundNum 3-2>上述成立后,判断refundMoney.equals(refundNum * paymentCodeList.get(0).getPrice()),即移动端传过来的 退款金额==移动端传过来的退款数量*该服务在数据库的价格。 4>判断全部使用的情况 4-1>判断usePaymentCodeList.size() == refundNum 4-2>上述成立后,判断refundMoney.equals(refundNum * paymentCodeList.get(0).getPrice()) 8.3 开始本地业务处理 8.3.1 向退款单里插入一条记录 8.3.2 处理全部消费情况的业务 更新支付码表状态,主要字段:退款状态、退款申请号 8.3.2 处理部分消费/全部未消费的业务 循环处理 for (int i = 0; i < unUsePaymentCodeList.size(); i++){ 1>向退款明细表里插入记录 2>更新该paymentCode状态,主要字段:退款状态、退款申请号(在payCode表) } 8.4 给移动端返回 退款单id

9.申请微信退款 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_4&index=6 这是由本地服务器端完成 移动端提交主要参数:用户ID、订单ID、订单金额、商品描述、退款单号、退款金额。 退款参数验证 1>订单金额要与下单金额一样 2>退款金额要小于下单金额 9.1 步骤同微信支付、查询类似 1>设置微信退款所需参数 2>提交退款申请请求 3>接收微信返回信息 4>判断退款请求是否成功,这时候都需要向 微信退款记录表里插入记录 5>验证微信发回来参数的有效性,失败,向 微信退款记录表里插入记录 6>验证成功,向 微信退款记录表里插入记录,同时处理本地业务 6-1>更新退款单表,主要字段:退款状态(已退款)、微信退款单号 6-2>判断是否存在退款单详情,如果存在,则需要更新退款单详情表,主要字段:退款状态(已退款) 6-3>更新订单明细表,主要字段,退款状态

10.微信退款查询 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_5&index=7 移动端提交参数:退款单id 10.1 步骤同微信退款步骤类似 10.2 查询退款成功后,处理与 退款成功后 一样的业务

//如下是支付宝支付、查询、退款流程 11.支付(支付宝) 11.1 移动端提交给本地服务器的参数 用户ID、订单ID、订单金额 11.2 依然是处理 提交参数的验证 单价验证/总价验证 11.3 本地服务器组合支付宝需要的参数,包括签名验证等信息,回传给移动端,同时需要向 支付宝发起支付记录表插入一条记录 返回给移动端数据:支付记录ID、支付宝请求所需参数 11.4 移动端调起手机里面的支付宝支付程序,将从本地服务器接收的数据传给支付程序,并向支付宝服务器端发起支付请求 11.5 支付宝服务器端验证移动端请求参数 1>同步向 移动端发出 支付结果 2>异步向 本地服务器发出 支付结果 11.6 本地服务器接收到支付宝回调后,处理本地业务 11.6.1 回调成功后,向支付宝支付记录表插入一条记录(无论支付是否成功,这里都插入一条记录) 11.6.2 回调成功,且支付成功后,处理本地服务器业务 //这里的业务就和微信支付时一样 1>更新订单表状态 主要字段:支付状态(已付款)、支付方式(支付宝)、支付凭证 2>向paymentCode表插入记录 11.6.3 移动端向服务器发送支付结果查询 提交参数:订单ID、支付宝同步回调返回给移动端的内容、支付宝支付记录ID 1>移动端整合支付宝查询接口所需的参数 2>发送支付查询请求 3>查询成功、支付成功、验证成功,接着处理本地的业务 //回调有多次,所以这里更新订单表信息之前先判断下是否已经更新 3-1>更新订单表信息 3-2>向订单详情表插入记录(多个服务时,多条记录) 11.7 用户发起退款 提交参数:用户ID、订单ID、订单金额、商品描述、退款单号、退款金额 11.7.1 服务器端整合支付宝退款所需数据 11.7.2 服务器端向支付宝服务器端发送退款申请 //支付宝即时到账有密退款接口 https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.Df968Y&treeId=62&articleId=104744&docType=1 11.7.3 支付宝处理完成后,会同步通知商户(当前页面跳转的方式)与异步通知商户。商户可以从页面跳转同步通知获取信息 或者 从服务器异步通知页面中 获取支付宝返回的信息。 11.8 总结下退款流程 1>用户到已下单的商品页面,点击退款,即向商家cms发送一条退款请求。 2>接着用户页面会显示"商品退款中,请等待"。 3>此时卖家的cms里会有一条退款信息(退款申请人、退款商品信息、退款申请日期、退款原因、退款金额等信息) 4>卖家核实信息后,点击"同意退款"(选择支付宝退款),即向支付宝服务器发送退款请求信息。 主要参数包括:商家在支付宝的注册信息、退款金额等信息,即向支付宝转账退款金额。 5>支付宝服务器收到商家的转账信息,核实后,一方面通知商家退款成功;同时支付宝向买家的支付宝账户中转入商家退款金额。

表设计如下 1.用户订单表

输入图片说明 2.支付码表

输入图片说明 3.退款表

输入图片说明 4.退款明细表

输入图片说明

转载于:https://my.oschina.net/u/2312022/blog/704286

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值