java实现易宝支付
易宝支付:
1.环境搭建:
Java使用Servlet或者springMVC,使用maven进行环境搭建。
2.添加jar包:
<dependencies> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies> |
3.易宝支付工具类:PaymentUtil
package com.tank.pay.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)); } // public static void main(String[] args) { // System.out.println(hmacSign("AnnulCard1000043252120080620160450.0http://localhost/SZXpro/callback.asp��?4564868265473632445648682654736324511","8UPp0KE8sq73zVP370vko7C39403rtK1YwX40Td6irH216036H27Eb12792t")); // } } |
4.易宝配置文件:zhifu.properties
p1_MerId=10001126856 keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl responseURL=http://localhost:9003/payresponse.action |
易宝支付:
package com.tank.pay.web; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.tank.pay.utils.PaymentUtil; /** * 支付请求,发起支付 */ public class PayServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //发起请求,拼接参数,重定向到指定页面 //正常情况如果是支付未支付的数据,应该传递参数过来,比如订单号等信息,然后服务端查询需要多少钱,而不是以页面传递为准, //如果是正常的充值,则以传递为准,但是是否有额外条件,需要自己判断,比如页面上面的选项只有,10.50,,100. //拼接13个请求参数 String p0_Cmd = "Buy";//业务类型 String p1_MerId = "10001126856";// 商户编号 String p2_Order = "ta12345679890";//商户订单号 String p3_Amt = "0.01";// 支付金额 String p4_Cur = "CNY";//交易币种 String p5_Pid = "Mathbook";//商品名称 String p6_Pcat = "book";// 商品种类 String p7_Pdesc = "lean more ";//商品描述 String p8_Url = "http://localhost:18080/ResponseServlet";//商户接收支付成功数据的地址 String p9_SAF = "0";//送货地址 String pa_MP = "yuanyangfanhui";//商户扩展信息 String pd_FrpId = "ICBC-NET";// 支付通道编码(指定工商银行) String pr_NeedResponse = "1";//应答机制 //拼接前面13个参数的校验值 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, "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl"); //正式请求地址 String url="https://www.yeepay.com/app-merchant-proxy/node?"+ "&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+ "&p9_SAF="+p9_SAF+ "&pa_MP="+pa_MP+ "&pd_FrpId="+pd_FrpId+ "&pr_NeedResponse="+pr_NeedResponse+ "&hmac="+hmac; response.sendRedirect(url); } } |
5.易宝支付返回结果:ResponseServlet
返回的url:
http://localhost:18080/ResponseServlet?p1_MerId=10001126856&r0_Cmd=Buy&r1_Code=1&r2_TrxId=716287214431153I&r3_Amt=0.01&r4_Cur=RMB&r5_Pid=Mathbook&r6_Order=ta12345679890&r7_Uid=&r8_MP=yuanyangfanhui&r9_BType=1&ru_Trxtime=20171125154812&ro_BankOrderId=51579430841711&rb_BankId=ICBC-NET&rp_PayDate=20171125154759&rq_CardNo=&rq_SourceFee=0.0&rq_TargetFee=0.0&hmac=6e7ace8edfab5831173ca12ce61d74e7
6.ResponseServlet:
/** * 处理支付响应 */ public class ResponseServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map<String,String[]> parameterMap = request.getParameterMap(); System.out.println(parameterMap); } } |
控制台打印信息:
{p1_MerId=[Ljava.lang.String;@9db5a4, r0_Cmd=[Ljava.lang.String;@5a5607, r1_Code=[Ljava.lang.String;@65ded4, r2_TrxId=[Ljava.lang.String;@1675c3c, r3_Amt=[Ljava.lang.String;@54fd21, r4_Cur=[Ljava.lang.String;@c7d02, r5_Pid=[Ljava.lang.String;@d582a9, r6_Order=[Ljava.lang.String;@148a373, r7_Uid=[Ljava.lang.String;@70f38e, r8_MP=[Ljava.lang.String;@167726f, r9_BType=[Ljava.lang.String;@1d16ee0, ru_Trxtime=[Ljava.lang.String;@1061e92, ro_BankOrderId=[Ljava.lang.String;@29793f, rb_BankId=[Ljava.lang.String;@51979f, rp_PayDate=[Ljava.lang.String;@bd5e5b, rq_CardNo=[Ljava.lang.String;@13a2a50, rq_SourceFee=[Ljava.lang.String;@174d49, rq_TargetFee=[Ljava.lang.String;@7cd0bb, hmac=[Ljava.lang.String;@9916a9} |
7.支付成功:
成功后跳转到自己指定的路径,带回返回的数据。
支付成功会有两次不同地方的返回:
1. 返回到自己指定的响应页面(responseServlet),可以对返回值进行处理判断
2. 服务器会进行端到端的传输。(成功以服务器的成功为标准)
注意:这里只是一个支付的简单测试,在实际的开发中,我们支付时需要在前台页面进行银行的选择,jsp的跳转需要我们在实际情况中去考虑,返回结果,我们需要去判断各种情况的发生,对不同情况进行相应的处理,我们的支付(13个参数)或者返回数据,我们可以将他们封装层Bean对象,方便我们去调用,或者查看数据信息。
java实现易宝支付相关推荐
- java 对接易宝支付完成真实网上支付
java 对接易宝支付完成真实网上支付 目录结构 index.jsp界面 跳转界面 支付界面 确认界面 支付成功界面 回调界面 源码 学习资源推荐 https://blog.csdn.net/qq_4 ...
- java在线支付---09,10,11,12_在线支付_分析易宝支付网关的应答协议与处理代码,完成用于处理支付响应的Servlet的初步编写和调试,完成处理支付网关响应结果的Servlet,支付实现
09_在线支付_分析易宝支付网关的应答协议与处理代码 创梦综合技术qq交流群:CreDream:251572072 对支付结果返回的数据加密生成md5-hmac public static boole ...
- java在线支付---06,07,08_在线支付_编写将数据提交给易宝支付的JSP页面,集成和测试向易宝发送支付请求,实现浏览器自动向易宝发送支付请求
06_在线支付_编写将数据提交给易宝支付的JSP页面 -------------------------------------------------------------- 1./payment ...
- java在线支付---04_编写易宝支付的客户端加密工具类
2013/5/30 04_编写易宝支付的客户端加密工具类 创梦综合技术qq交流群:CreDream:251572072 ---------------------------------------- ...
- java在线支付---02_分析易宝支付的工作流程
2013/5/30 02_分析易宝支付的工作流程 Java技术qq交流群:JavaDream:251572072 ------------------------------------------- ...
- 易宝支付架构师移动产品线技术负责人程超走在Java的路上
程超目前就职于易宝支付,任职架构师.人们常说,一个架构师工作的好坏决定了整个软件开发项目的成败.可见架构师的重要性所在,在程超看来做好一名构架师要做到"言传身教",架构师作为技术工 ...
- 【CSDN英雄会】 易宝支付架构师、移动产品线技术负责人程超:走在Java的路上
英雄会是CSDN旗下针对国内IT技术领域专家展示和交流的平台.通过线下线上的互动形式,为CSDN社区专家提供更多学习.合作.宣传的机会.英雄会后续将在北上广深等国内一二线城市建立分会,各个分会后期将组 ...
- java在线支付---03_分析易宝支付网关的请求协议
03_分析易宝支付网关的请求协议 创梦综合技术qq交流群:CreDream:251572072 -------------------------------------- 1.buildHmac() ...
- 第三方支付平台:易宝支付
国付宝国企 LianLianPay连连支付 这个比较好用,可以自己试试 我这里说的是易宝支付 两种在线支付的方式 在线支付一共有两种方式: 电商直接与银行对接: 电商通过第三方支付平台与银行对接: 电 ...
最新文章
- 如何不显示index.php,如何隐藏index.php入口文件?
- 【转】ionic run android 成功launch success,但是genymotion虚拟机没有显示
- python常用的十进制、16进制之间的转换
- Input类,Vector3实例
- 当try,catch,finally中均有return语句时,会返回哪一个?---finally中的return
- 手把手教我班小姐姐学java之面向对象
- OSChina 周六乱弹 ——用大脑直接写代码
- 9个月宝宝还不会爬怎么办?
- 2021年春季学期期末统一考试电子商务概论(农) 试题
- 计算机win7关机重启,电脑win7关机后自动重启如何解决_win7一关机就立马自动重启修复方法-win7之家...
- 使用ffmpeg对视频、图片进行旋转,上下翻转,水平翻转
- Android混淆那些事儿
- 【GIS开发】VB6.0下MO控件的安装:安装教程及MO破解教程(MapObjects2.x)
- “数说故事——香港城市大学AI联合实验室”筹备会议今日召开
- Linux下常用的编辑文件与保存命令
- GAMES104 作业2-ColorGrading
- 信创产业国产CPU产业研究报告
- 地震勘探原理c语言,《地震勘探原理》
- 线段覆盖长度(c++)
- apple watch和小米手表的操作逻辑对比: