一、易宝支付java在线支付流程如下:

使用易宝支付:

接入免费,只需从交易金额中扣取1%的手续费
①申请账号
②获取秘钥及加密算法
③发送请求
④接受回调
⑤处理相应的逻辑

二、代码编写如下:

准备工作:

(1)商户账号:p1_MerId=10001126856
  (2)商户的keyValue:keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl
  (3)PaymentUtil类。

将(1)(2)中账户账号、商户keyvalue以及回调地址放入配置文件”merchantInfo.properties“中代码如下

?
1
2
3
p1_MerId=10001126856
keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl
responseURL=https://localhost:8888/store/order?method=callback


注:此处的responseURL采用的是本地的地址,如果有相应的域名则采用点对点的方式,填写相应的域名


PaymentUtil类代码如下:

?
1
2
3
4
5
6
7
8
9
10
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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
206
207
208
209
210
211
<code>package com.itheima.utils;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
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();
    // 业务类型
    sValue.append(p0_Cmd);
    // 商户编号
    sValue.append(p1_MerId);
    // 商户订单号
    sValue.append(p2_Order);
    // 支付金额
    sValue.append(p3_Amt);
    // 交易币种
    sValue.append(p4_Cur);
    // 商品名称
    sValue.append(p5_Pid);
    // 商品种类
    sValue.append(p6_Pcat);
    // 商品描述
    sValue.append(p7_Pdesc);
    // 商户接收支付成功数据的地址
    sValue.append(p8_Url);
    // 送货地址
    sValue.append(p9_SAF);
    // 商户扩展信息
    sValue.append(pa_MP);
    // 银行编码
    sValue.append(pd_FrpId);
    // 应答机制
    sValue.append(pr_NeedResponse);
    return PaymentUtil.hmacSign(sValue.toString(), 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();
    // 商户编号
    sValue.append(p1_MerId);
    // 业务类型
    sValue.append(r0_Cmd);
    // 支付结果
    sValue.append(r1_Code);
    // 易宝支付交易流水号
    sValue.append(r2_TrxId);
    // 支付金额
    sValue.append(r3_Amt);
    // 交易币种
    sValue.append(r4_Cur);
    // 商品名称
    sValue.append(r5_Pid);
    // 商户订单号
    sValue.append(r6_Order);
    // 易宝支付会员ID
    sValue.append(r7_Uid);
    // 商户扩展信息
    sValue.append(r8_MP);
    // 交易结果返回类型
    sValue.append(r9_BType);
    String sNewString = PaymentUtil.hmacSign(sValue.toString(), keyValue);
    return sNewString.equals(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 = aKey.getBytes(encodingCharset);
        value = aValue.getBytes(encodingCharset);
    } catch (UnsupportedEncodingException e) {
        keyb = aKey.getBytes();
        value = aValue.getBytes();
    }
    Arrays.fill(k_ipad, keyb.length, 64, (byte) 54);
    Arrays.fill(k_opad, keyb.length, 64, (byte) 92);
    for (int i = 0; i < keyb.length; i++) {
        k_ipad[i] = (byte) (keyb[i] ^ 0x36);
        k_opad[i] = (byte) (keyb[i] ^ 0x5c);
    }
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
        return null;
    }
    md.update(k_ipad);
    md.update(value);
    byte dg[] = md.digest();
    md.reset();
    md.update(k_opad);
    md.update(dg, 0, 16);
    dg = md.digest();
    return toHex(dg);
}
public static String toHex(byte input[]) {
    if (input == null)
        return null;
    StringBuffer output = new StringBuffer(input.length * 2);
    for (int i = 0; i < input.length; i++) {
        int current = input[i] & 0xff;
        if (current < 16)
            output.append("0");
        output.append(Integer.toString(current, 16));
    }
    return output.toString();
}
/**
 *
 * @param args
 * @param key
 * @return
 */
public static String getHmac(String[] args, String key) {
    if (args == null || args.length == 0) {
        return (null);
    }
    StringBuffer str = new StringBuffer();
    for (int i = 0; i < args.length; i++) {
        str.append(args[i]);
    }
    return (hmacSign(str.toString(), key));
}
/**
 * @param aValue
 * @return
 */
public static String digest(String aValue) {
    aValue = aValue.trim();
    byte value[];
    try {
        value = aValue.getBytes(encodingCharset);
    } catch (UnsupportedEncodingException e) {
        value = aValue.getBytes();
    }
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("SHA");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        return null;
    }
    return toHex(md.digest(value));
}
}
</code>

java发送支付请求代码如下:

?
1
2
3
4
5
6
7
8
9
10
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
58
59
60
61
62
63
64
65
<code><code>public String pay(HttpServletRequest request,HttpServletResponse respone) throws Exception{
    //接受参数
    String address=request.getParameter("address");
    String name=request.getParameter("name");
    String telephone=request.getParameter("telephone");
    String oid=request.getParameter("oid");
    //通过id获取order
    OrderService s=(OrderService) BeanFactory.getBean("OrderService");
    Order order = s.getById(oid);
    order.setAddress(address);
    order.setName(name);
    order.setTelephone(telephone);
    //更新order
    s.updateOrder(order);
    // 组织发送支付公司需要哪些数据
    String pd_FrpId = request.getParameter("pd_FrpId");
    String p0_Cmd = "Buy";
    String p1_MerId = ResourceBundle.getBundle("merchantInfo").getString("p1_MerId");
    String p2_Order = oid;
    String p3_Amt = "0.01";
    String p4_Cur = "CNY";
    String p5_Pid = "";
    String p6_Pcat = "";
    String p7_Pdesc = "";
    // 支付成功回调地址 ---- 第三方支付公司会访问、用户访问
    // 第三方支付可以访问网址
    String p8_Url = ResourceBundle.getBundle("merchantInfo").getString("responseURL");
    String p9_SAF = "";
    String pa_MP = "";
    String pr_NeedResponse = "1";
    // 加密hmac 需要密钥
    String keyValue = ResourceBundle.getBundle("merchantInfo").getString("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);
    //发送给第三方
    StringBuffer sb = new StringBuffer("https://www.yeepay.com/app-merchant-proxy/node?");
    sb.append("p0_Cmd=").append(p0_Cmd).append("&");
    sb.append("p1_MerId=").append(p1_MerId).append("&");
    sb.append("p2_Order=").append(p2_Order).append("&");
    sb.append("p3_Amt=").append(p3_Amt).append("&");
    sb.append("p4_Cur=").append(p4_Cur).append("&");
    sb.append("p5_Pid=").append(p5_Pid).append("&");
    sb.append("p6_Pcat=").append(p6_Pcat).append("&");
    sb.append("p7_Pdesc=").append(p7_Pdesc).append("&");
    sb.append("p8_Url=").append(p8_Url).append("&");
    sb.append("p9_SAF=").append(p9_SAF).append("&");
    sb.append("pa_MP=").append(pa_MP).append("&");
    sb.append("pd_FrpId=").append(pd_FrpId).append("&");
    sb.append("pr_NeedResponse=").append(pr_NeedResponse).append("&");
    sb.append("hmac=").append(hmac);
    respone.sendRedirect(sb.toString());
    return null;
}
</code></code>


回调函数代码如下:

?
1
2
3
4
5
6
7
8
9
10
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
58
59
<code><code><code>public String callback(HttpServletRequest request,HttpServletResponse response) throws Exception{
    String p1_MerId = request.getParameter("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 rb_BankId = request.getParameter("rb_BankId");
    String ro_BankOrderId = request.getParameter("ro_BankOrderId");
    String rp_PayDate = request.getParameter("rp_PayDate");
    String rq_CardNo = request.getParameter("rq_CardNo");
    String ru_Trxtime = request.getParameter("ru_Trxtime");
    // 身份校验 --- 判断是不是支付公司通知
    String hmac = request.getParameter("hmac");
    String keyValue = ResourceBundle.getBundle("merchantInfo").getString(
            "keyValue");
    // 自己对上面数据进行加密 --- 比较支付公司发过来hamc
    boolean isValid = 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 (isValid) {
        // 响应数据有效
        if (r9_BType.equals("1")) {
            // 浏览器重定向
            System.out.println("111");
            request.setAttribute("msg", "您的订单号为:"+r6_Order+",金额为:"+r3_Amt+"已经支付成功,等待发货~~");
        } else if (r9_BType.equals("2")) {
            // 服务器点对点 --- 支付公司通知你
            System.out.println("付款成功!222");
            // 修改订单状态 为已付款
            // 回复支付公司
            response.getWriter().print("success");
        }
        //修改订单状态
        OrderService s=(OrderService) BeanFactory.getBean("OrderService");
        Order order = s.getById(r6_Order);
        order.setState(1);
        s.updateOrder(order);
    } else {
        // 数据无效
        System.out.println("数据被篡改!");
    }
    return "/jsp/msg.jsp";
}
</code></code></code>

相应的界面操作流程

如上界面中,点击“通知商户支付成功“后调用回调函数

成长不易,请关注一下,万分感谢!

第三方支付3(易宝支付)相关推荐

  1. 在线支付(易宝支付)

    第三方支付方式:易宝支付. 支付过程图解: 相关资料: 易宝支付产品通用接口帮助文档点击打开链接 使用步骤:     ①src下面放入支付测试用的merchantInfo.properties(包含商 ...

  2. 第三方支付平台:易宝支付

    国付宝国企 LianLianPay连连支付 这个比较好用,可以自己试试 我这里说的是易宝支付 两种在线支付的方式 在线支付一共有两种方式: 电商直接与银行对接: 电商通过第三方支付平台与银行对接: 电 ...

  3. 支付入门-易宝支付实践

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程. 易宝支付的规范和流程 1)发起 ...

  4. 在线支付之易宝支付的使用方法

    项目中实现在线支付的功能有两种方式: 第一种方式:使用银行提供的接口直接和银行对接.这种方式不用交第三方费用,但是如果要接入多个银行,则需要在本网站中一一使用不同银行提供的接口,这个过程比较麻烦,其次 ...

  5. 传智播客--网上支付之易宝支付接入规范

    今天我们学习网上支付的实现.这个功能在网上商城等交易平台上是基本的功能.实现起来不难,却很实用.我们很有必要掌握好今天学习的知识.运用到我们今后 的工作中去. 1. 网上支付两种接入方案 --直接与银 ...

  6. 人人投携手易宝支付打造股权众筹安全平台

    目前,人人投(renrentou.com)与中国最大的第三方支付平台----易宝支付(北京通融通信息技术有限公司)达成了战略合作,双方在技术和产品等方面的深入合作,希望为实体店铺股权众筹创造更安全的支 ...

  7. java在线支付---02_分析易宝支付的工作流程

    2013/5/30 02_分析易宝支付的工作流程 Java技术qq交流群:JavaDream:251572072 ------------------------------------------- ...

  8. 关于易宝支付第三方接口的实现

    1 这是payment.php文件 <?php     //载入配置文件     require_once 'common.inc.php'; ?> <!DOCTYPE html P ...

  9. 在线支付(通过第三方支付平台易保支付)

    支付方案1:网站直接与银行对接 这种方式接方式的优缺点: 优点:钱通过银行直接存到网站帐户,交易资金结算安全.适合资金流量比较大的企业. 缺点:每个银行可能有不同的接入方案,开发人员需要针对不同银行编 ...

  10. 【SSH网上商城项目实战21】从Demo中看易宝支付的流程

    这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后,再做实际的开发,因为是一个Demo,所以我没有考虑一些设计模式的东西,就是直接实现支付功能.实现支付功能需要易宝给我们提供的AP ...

最新文章

  1. “积水上报”广获好评 畅移信息接棒 “互联网+政务”落地
  2. java string类api_java基础—String类型常用api
  3. 机器学习入门(1)之基本概念简介
  4. 【Elasticsearch】使用 Elasticsearch 的 44 条建议
  5. 2016HUAS暑假集训训练题 F - 简单计算器
  6. 异常记录---Error creating bean with name ‘sqlSessionFactory‘
  7. 【实战】NLP命名实体识别开源实战教程
  8. WL-OA Kernel论文讲解——On Valid Optimal Assignment Kernels and Applications to Graph Classification
  9. VFP中加密和解密数据库的程序(VFP6-9运行没有问题)
  10. php 数据结构set,ES6的Set数据结构是什么
  11. ip地址块的聚合,计算其聚合后的可用地址数
  12. WPS 2019|WPS Office 2019官方最新版 v11.1下载
  13. 小迪渗透代码审计(柒)
  14. GoDaddy域名过户PUSH攻略
  15. (史上最完整) 队列 的基本操作和实现 及排队系统实例
  16. element-ui 级联选择器el-cascader踩坑
  17. STM32玩转物联网实战篇:01.网络通信前准备
  18. [Swift5]自定义UITableViewCell左滑操作,适配iOS11 ~ iOS13
  19. 不做标题党软文营销如何写出好标题
  20. 动态获取织梦CMS最新更新 利于收录的SiteMap.php文件

热门文章

  1. CISCO 模拟器 Dynamips 使用说明
  2. Java 虚拟机详解
  3. android 第三方圆弧进度条,Android 圆弧进度条 水平进度条 水波进度条
  4. PMP考试需要准备什么教材呢?
  5. chrome最新Android版本,谷歌chrome浏览器安卓版下载,谷歌chrome浏览器安卓最新版本下载地址 v70.0.3538.110 - 浏览器家园...
  6. c语言ic卡读写软件,IC卡读写工具|ACR122U写卡软件下载 v3.7 免费版_最火软件站
  7. python 安装包时出现:SyntaxError: invalid syntax
  8. 跟着王道考研学计算机网络笔记(一):初步了解计算机网络
  9. Windows勒索病毒'Wannacry'修复补丁下载,救命必看!
  10. matlab 加权回归估计_matlab代码:地理加权回归(GWR)示例