一、目前主要的两种支付方案

二、支付流程

1、用户在提交订单完成选择易宝支付按钮后,会跳转到如下页面选择要支付的银行,如下所示:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>在线支付</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/servlet/PayRequestServlet" method="post">
您的订单是:<input type="text" name="orderid">
订单的金额是:<input type="text" name="money">
<table width="60%">
<tr><td><br/></td></tr>
<tr>
<td>请您选择在线支付银行</td>
</tr>
<tr>
        //这些银行编码是易宝提供的
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="CMBCHINA-NET">招商银行 </td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="ICBC-NET">工商银行</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="ABC-NET">农业银行</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="CCB-NET">建设银行 </td>
</tr>
<tr>
<td><INPUT TYPE="submit" value="确定支付"></td>
</tr>
</table>
</form>
</body>
</html>

2、网站按照易宝接口文档构建请求地址:

//处理支付请求
public class PayRequestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String p0_Cmd = "Buy";
String p1_MerId = PayConfig.getValue("p1_MerId");
String p2_Order = request.getParameter("orderid");
String p3_Amt = request.getParameter("money");
String p4_Cur = "CNY";
String p5_Pid = "";
String p6_Pcat = "";
String p7_Pdesc = "";
String p8_Url = PayConfig.getValue("responseURL");
String p9_SAF = "";
String pa_MP = "";
String pd_FrpId = request.getParameter("pd_FrpId");
String pr_NeedResponse = "1";
String keyValue = PayConfig.getValue("keyValue");
String hmac = PaymentUtil.buildHmac(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, keyValue); // 构建请求地址
String requestUrl = "https://www.yeepay.com/app-merchant-proxy/node?p0_Cmd="
+ p0_Cmd + "&p1_MerId=" + p1_MerId;// 后面的省略 request.getRequestDispatcher(requestUrl).forward(request,response);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
//支付配置文件
p1_MerId=10001126856 //商户编号
keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl //密钥
responseURL=http://localhost:8080/payment/servlet/PaymentResponse //易宝支付成功后通知网站的地址

ps:

1>p1_MerId: 商户编号,申请易宝账户的时候易宝会给.

2>p8_Url: 商户接收支付成功数据的地址,也就是易宝支付成功后通知网站的地址,注意:如不填p8_Url的参数值支付成功后您将得不到支付成功的通知.

3>pd_FrpId: 支付通道编码,也就是用户选择的银行编码.

4>pr_NeedResponse: 应答机制,固定值为"1": 需要应答机制; 收到易宝支付服务器点对点支付成功通知,必须回写以"success"(无关大小写)开头的字符串,即使您收到成功通知时发现该订单已经处理过,也要正确回写"success",否则易宝支付将认为您的系统没有收到通知,启动重发机制,直到收到"success"为止.

5>hmac: 用户发的数据拼成字符串再结合易宝给的密钥再md5(申请易宝账户的时候易宝会给)算出的一个hmac码,易宝会给这个工具类,用以确定网站发给易宝的数据没有被串改.

3、只有支付成功时易宝支付才会通知商户.支付成功回调有两种,都会以GET形式通知到在线支付请求参数中的p8_Url上:

■ 浏览器重定向
■ 服务器点对点通讯
关于两种通知和业务处理说明:如果用户在支付成功后,并没有通知商家而是直接关闭了重定向的窗口,那么重定向就不会通知到商户,网站的订单状态就不会置为已支付,所以不管用户是否重定向通知到商户,服务器点对点通知都会通知到商户,所以在callback页中r9_btype=1和r9_btype=2的两种通知类型中都要进行业务处理.并注意处理重复订单的问题,以防两次通知都处理了相同的业务造成损失.
//支付成功响应地址
public class PaymentResponse extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String p1_MerId = PayConfig.getValue("p1_MerId");
String r0_Cmd = request.getParameter("r0_Cmd");
String r1_Code = request.getParameter("r1_Code");
String r2_TrxId = request.getParameter("r2_TrxId");
String r3_Amt = request.getParameter("r3_Amt");
String r4_Cur = request.getParameter("r4_Cur");
String r5_Pid = request.getParameter("r5_Pid");
String r6_Order = request.getParameter("r6_Order");
String r7_Uid = request.getParameter("r7_Uid");
String r8_MP = request.getParameter("r8_MP");
String r9_BType = request.getParameter("r9_BType");
String hmac = request.getParameter("hmac"); String keyValue = PayConfig.getValue("keyValue"); boolean b = PaymentUtil.verifyCallback(hmac, p1_MerId, r0_Cmd, r1_Code,
r2_TrxId, r3_Amt, r4_Cur, r5_Pid, r6_Order, r7_Uid, r8_MP,
r9_BType, keyValue);
if (!b) {
response.getWriter().write("交易签名已被修改!!!");
return;
} if ("1".equals(r1_Code)) { // 处理支付成功
if ("1".equals(r9_BType)) {
response.getWriter().write("支付成功!!");
return;
}
if ("2".equals(r9_BType)) {
response.getWriter().write("success");
}
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

ps:

1>r1_Code: 支付结果.

2>r9_BType: 交易结果返回类型: 为"1": 浏览器重定向; 为"2": 服务器点对点通讯.

3>hmac: 网站需要确定易宝发送的数据没有被串改.

三、具体支付流程图和易宝文档参考文件.

javaEE(9)_在线支付的更多相关文章

  1. Atitit 在线支付系统功能设计原理与解决方案 与目录

    Atitit 在线支付系统功能设计原理与解决方案 与目录 1.1. 支付系统1 1.2. 独立的支付子体系..微服务架构..1 1.3. 参考书籍1 支付战争 [The PayPal Wars:Bat ...

  2. Payssion,海外本地支付_海外本地收款_小语种本地支付_外贸收款_外贸网店收款_欧洲本地支付_俄罗斯本地支付_巴西支付_跨境支付_PAYSSION,让跨境支付更轻松!

    Payssion,海外本地支付_海外本地收款_小语种本地支付_外贸收款_外贸网店收款_欧洲本地支付_俄罗斯本地支付_巴西支付_跨境支付_PAYSSION,让跨境支付更轻松!       首页 / 关于 ...

  3. 银联在线支付B2C UnionPay.NET

    新春即将来临,首先给大家拜个早年,祝攻城狮们新年快乐.万事如意.合家欢乐.团团圆圆.幸福健康.来年更能大展宏图 实现各自的梦想! 同时预祝各大科技公司大佬们事业蒸蒸日上.公司转型突破创新.冲出突围带领 ...

  4. php实现支付宝在线支付和扫码支付demo

    ### php实现支付宝在线支付和扫码支付demo 背景:在做一个公众号时增加了h5端,需要接入支付,非微信环境,选择了支付宝,以下简单记录下实现过程,并做了简单的封装,拿来即可使用,注意:本项目只是 ...

  5. php支付宝在线支付接口开发教程【转】

    php支付宝在线支付接口开发教程 这篇文章主要为大家详细介绍了php支付宝在线支付接口开发教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下   1.什么是第三方支付 所谓第三方支付,就是一些和各 ...

  6. 【drp 1】使用易宝实现在线支付

    导读:在很多网站上,都会涉及到在线支付的功能,总所周知的有:淘宝.天猫.京东等等.我们常见的支付方式有支付宝.微信钱包.银行卡支付等.本篇博客,将介绍一种使用易宝第三方软件进行在线支付的功能. 一.基 ...

  7. Android集成支付宝接口 实现在线支付

    手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统互联网将会大放光彩的一个功能. 人人有手机,人人携带手机,花钱买东西,不再需要取钱付现,不再需要回家上网银,想买什么,扫 ...

  8. 在线支付接口之PHP支付宝接口开发简单介绍

    php100:92:在线支付接口之PHP支付宝接口开发 支付接口一般是第三方提供的代收款.付款的平台,可以通过支付接口帮助企业或个人利用一切可以使用的支付方式.常见支付平台:支付宝.快钱.云网支付.财 ...

  9. php最新微信扫码在线支付接口。ecshop和shopex,shopnc下完美无错

    最近为客户的一个在线商城做了一个微信扫码在线支付的接口.跟大家分享一下. 1 首先可以模仿其他的接口,比如支付宝,财付通等的接口,构建模块功能文件和语言文件.2 微信提供2种扫码方式,大家可以根据自己 ...

随机推荐

  1. Lightoj1011【KM算法】

    题意: 问男孩女孩最大的可能值?其实就是一个二分图的最大权值匹配问题:模板题吧.. #include<cstdio> #include<math.h> #include< ...

  2. 进击python第一篇:相遇

    1.第一句Python代码 在 当前目录下创建 hello.py 文件,内容如下: print "hello,world!" 执行 hello.py 文件,即: python he ...

  3. 最长XX序列问题小结 By cellur925

    今天我们搞一搞几个经典序列问题之间的爱♂恨♂情♂仇. 首先我们看一看LIS(最长上升子序列)(From my onenote)

  4. 网络装机pxe服务器的配置过程

    网络装机pxe服务器的配置过程 背景: 针对于Linux运维工作中遇到的需要大批量安装Linux系统的情况,通过网络装机的方式实现无人值守安装Linux操作系统,现需要配置一台pxe服务器用于pxe批 ...

  5. 测试 | 代码覆盖测试工具 | Eclemma

    安装: 打开eclipse,点击Help菜单下的Install New Software 在弹出的对话框中,点击Add 输入Name,如EclEmma 输入Location: http://updat ...

  6. 最新Centos7安装python3并与python2共存

    1.查看是否已经安装Python CentOS 7.2 默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5. 使用 python -V 命令查看一下是否安 ...

  7. [软件工程基础]2017.10.27 第二次 Scrum 会议

    决议 周六前项目交接 Milestone 完成 周六集体开发 游心整理物理网站上的实验流程和绪论复习题 石奇川上线静态版实验流程和绪论复习题库 李煦通构思后端如何实现绪论题库,包括和用户记录的关联方式 ...

  8. 牛客寒假6-J.迷宫

    链接:https://ac.nowcoder.com/acm/contest/332/J 题意: 你在一个 n 行 m 列的网格迷宫中,迷宫的每一格要么为空,要么有一个障碍. 你当前在第 r 行第 c ...

  9. GYM 101673F(树计数)

    树上每个割点计算一下各个size的组合相乘再相加为第一问答案,取最大的:再把本答案中最大的两个size相乘减掉,为第二问答案. const int maxn = 1e4 + 5; int n, siz ...

  10. 关于Mybatis的一点小记录(parameterType)

    1.Mybatis的parameterType有两个比较常用的,一个是类的对象,还有一个就是Map,然后取值的方法也很简单: 基本数据类型:#{参数} 获取参数中的值 复杂数据类型:#{属性名} ,m ...