中国电信翼支付网关接口接入

 

  最近在做中国电信的翼支付网关接口的接入,正好拿Java练练手。到目前为止,唯一不太适应的就是自己的Java积累几乎为0,什么都要重头写起,不像C#有这么多年的沉淀,可以随手拿来用。

  
废话先不多说。这个支付接口就和支付宝差不多,无非就是把一些必要的数据参数,POST到指定的接口地址,然后接收它返回的支付结果。接口没有什么复杂的逻辑处理,所以可以直接采用JSP+Servlet+JDBC来做简单处理。对于WEB支付请求的发起,可以从JSP把用户输入或选择的相关数据传到Servlet,然后在Servlet里把商户的基本信息以及用户数据封装下,再统一POST到网关接口地址:


 1        StringBuffer stb = new StringBuffer();
2        stb.append("<html>");
3        stb.append("<head><title>你的Title</title></head>");
4        stb.append("<body onload=\"document.form1.submit()\">");
5        stb.append("<form name=\"form1\" method=\"post\" action=\"https://webpaywg.bestpay.com.cn/payWeb.do\" >");
6        stb.append(String.format("<input name=\"MERCHANTID\" type=\"hidden\" value=\"%s\">", merchantId)); //商戶号
7        stb.append(String.format("<input name=\"ORDERSEQ\" type=\"hidden\" value=\"%s\">", orderSeq)); //订单号
8        stb.append(String.format("<input name=\"ORDERREQTRANSEQ\" type=\"hidden\" value=\"%s\">", orderSeq)); //订单请求交易流水号
9        stb.append(String.format("<input name=\"ORDERDATE\" type=\"hidden\" value=\"%s\">", orderDate)); //订单日期
10        stb.append(String.format("<input name=\"ORDERAMOUNT\" type=\"hidden\" value=\"%s\">", orderAmount)); //订单总金额
11        stb.append(String.format("<input name=\"PRODUCTAMOUNT\" type=\"hidden\" value=\"%s\">", orderAmount)); //产品金额
12        stb.append("<input name=\"ATTACHAMOUNT\" type=\"hidden\" value=\"0\">"); //附加金额
13        stb.append("<input name=\"CURTYPE\" type=\"hidden\" value=\"RMB\">"); //币种
14        stb.append("<input name=\"ENCODETYPE\" type=\"hidden\" value=\"1\">"); //加密方式 MD5
15        stb.append(String.format("<input name=\"MERCHANTURL\" type=\"hidden\" value=\"%s\">", merchantUrl)); //前台返回地址
16        stb.append(String.format("<input name=\"BACKMERCHANTURL\" type=\"hidden\" value=\"%s\">", backMerchantUrl)); //后台返回地址
17        stb.append(String.format("<input name=\"ATTACH\" type=\"hidden\" value=\"%s\">", attach)); //商户附加信息
18        stb.append("<input name=\"BUSICODE\" type=\"hidden\" value=\"0001\">"); //业务类型
19        stb.append("<input name=\"PRODUCTID\" type=\"hidden\" value=\"08\">"); // 业务标识
20        stb.append(String.format("<input name=\"TMNUM\" type=\"hidden\" value=\"%s\">", tmNum)); //终端号码
21        stb.append(String.format("<input name=\"CUSTOMERID\" type=\"hidden\" value=\"%s\">", customerId)); //客户标识
22        stb.append(String.format("<input name=\"PRODUCTDESC\" type=\"hidden\" value=\"%s\">", productDes)); //产品描述
23        stb.append(String.format("<input name=\"MAC\" type=\"hidden\" value=\"%s\">", mac)); //MAC校验域
24        stb.append(String.format("<input name=\"CLIENTIP\" type=\"hidden\" value=\"%s\">", clientIp)); //客户端IP
25        stb.append("</form></body>");
26        stb.append("</html>");
27        //入库、记录日志等
28        response.setContentType("text/html");
29        response.setCharacterEncoding("UTF-8");
30        PrintWriter out = response.getWriter();
31        out.write(stb.toString());

这里需要注意的是MAC这个值,翼支付网关会对这个值做校验;接口文档中提供了这个值的加密和MD5摘要算法样例,所以只要按照文档描述的规则来,一般不会有没有什么问题。上面的参数中,有一个前台返回地址和后台返回地址,当用户通过网银完成支付后,翼支付网关会把用户此次的支付结果POST到这2个地址,所以前台地址可以把支付结果展示给用户,后台地址的话就用来处理商户的业务逻辑吧。毕竟前台地址可能不会达到用户侧,或者用户在支付完成后就直接关了当前窗口。另外后台地址在接收到支付结果数据后,一定要原路响应网关,不然网关那边会不定时的持续发送重复的支付结果过来:


 1         request.setCharacterEncoding("UTF-8");
2         String uptranSeq = request.getParameter("UPTRANSEQ"); //翼支付网关平台交易流水号
3         String tranDate = request.getParameter("TRANDATE"); //翼支付网关平台交易日期
4         String returnCode = request.getParameter("RETNCODE"); //处理结果码 “0000” 表示支付成功,其他值则表示支付失败
5         String retuInfo = request.getParameter("RETNINFO"); //处理结果解释码
6         if(retuInfo != null && !retuInfo.isEmpty()) {
7         retuInfo = URLDecoder.decode(retuInfo, "UTF-8");
8         }
9         String orderReqTranseq = request.getParameter("ORDERREQTRANSEQ"); //订单请求交易流水号
10         String orderReq = request.getParameter("ORDERSEQ"); //订单号
11         String orderAmount = request.getParameter("ORDERAMOUNT"); //订单总金额
12         String productAmount = request.getParameter("PRODUCTAMOUNT"); //产品金额
13         String attachMount = request.getParameter("ATTACHAMOUNT"); //附加金额
14         String curType = request.getParameter("CURTYPE"); //币种
15         String encodeType = request.getParameter("ENCODETYPE"); //加密方式
16         String bankId = request.getParameter("BANKID"); //银行编码
17         String attach = request.getParameter("ATTACH"); //商户附加信息
18         String upreqTranseq = request.getParameter("UPREQTRANSEQ"); //网关平台请求银行流水号
19         String upbankTranseq = request.getParameter("UPBANKTRANSEQ"); //银行流水号
20         String productNo = request.getParameter("PRODUCTNO"); //产品号码
21         String sign = request.getParameter("SIGN"); //数字签名
22         //对sign做数字签名校验(信息没有被篡改)
23         //商户业务逻辑处理、入库、日志等
24         String returnContent = "UPTRANSEQ_" + uptranSeq;
25         PrintWriter out = response.getWriter();
26         out.write(returnContent); //回写响应数据

  
WEB支付的处理主要就是这块,很好理解吧!
  至于退款接口,则是需要调用网关提供的WebService接口,如下所示,refundResult就是返回的退款结果了:


1         //Axis
2 refundV2.webservice.ideal.com.RefundServiceFenImplProxy teStub = new RefundServiceFenImplProxy();
3 String refundResult = teStub.refund(commCode, "", commPwd, oldOrderId, oldOrderPayId, orderRefundId, transamt, reqTime, mac);

  最后再记录下,在写一个简单的日志记录类时,本机开发环境的路径中又有空格又有中文。。。这样的话,采用
.getResource("").toURI().getPath() 方法来获取路径,就不怕任何奇特格式的路径了~~~

时间: 2025-01-05 23:54:26

中国电信翼支付网关接口接入的相关文章

中国电信翼支付2014编程大赛决赛-一种排序 个人解题过程

首先需要表明的是我在时限内想到这个解法,但是这个解法被判错,而我也想不到反例.赛后咨询举办方的时候,他们表示过几天会发测试数据给我们.所以今天就先把思路和代码先放上来,过几天收到数据再看看到底哪里错了. 如果有读者想到相应的反例,希望可以给我留言,谢谢. 题目详情(只限Java) 给定一串整数,你只能进行两种操作:任选一个整数放到这串数之前,或者这串之后.所有的整数都不相等. 问把这串整数变为由小到大的排好序最少需要的操作次数. 输入格式: 多组数据,每组数据1行,包含若干个空格分隔的非负整数,

CSDN 中国电信翼支付2014编程大赛复赛 修改数列(LIS)

题目意思:51nod1294 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1294 给出一个整数数组A,你可以将任何一个数修改为任意一个正整数,最终使得整个数组是严格递增的且均为正整数.问最少需要修改几个数? Input 第1行:一个数N表示序列的长度(1 <= N <= 100000). 第2 - N + 1行:每行1个数,对应数组元素.(0 <= A[i] <= 10^9) Output 输出最少需

中国电信翼支付2014编程大赛决赛之我的见解(如果有误,望指证)

如果有误,希望可以给我留言,谢谢. 题目详情(只限Java) 给定一串整数,你只能进行两种操作:任选一个整数放到这串数之前,或者这串之后.所有的整数都不相等. 问把这串整数变为由小到大的排好序最少需要的操作次数. 输入格式: 多组数据,每组数据1行,包含若干个空格分隔的非负整数,每个整数不超过2147483647. 输出格式: 每组数据输出一行包含一个整数,表示需要最少操作的次数. 答题说明 输入样例 1 2 3 1 4 2 10 2 1 输出样例: 0 1 2 算法解析: 长度即原数组的(子序

微信支付现金红包接口

微信支付现金红包接口正式开放,只需开通微信支付,即可接入现金红包.通过现金红包接口,公众号开发者可以策划相关运营活动,向用户发放微信支付现金红包,更好的达到品牌推广及回馈用户的效果.具体能力如下: 1.商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景 2.领取到红包后,用户的资金直接进入微信零钱,避免繁复的领奖流程,带给用户微信支付原生的流畅体验 微信红包发送规则 1. 发送频率规则 ◆ 每分钟发送红包数量不得超过1800个: ◆

SDK接入(2)之Android Google Play内支付(in-app Billing)接入

SDK接入(2)之Android Google Play内支付(in-app Billing)接入 继上篇SDK接入(1)之Android Facebook SDK接入整理完Facebook接入流程之后,再来整理下Google Play in-app Billing支付的接入流程.众所周知,Google Play是Google Android官方的应用商店,也是将应用发布到世界各地一个重要的渠道.支付作为盈利的一个重要手段,可以借助Google in-app Billing api来达到目的.

iOS支付宝支付(Alipay)详细接入流程以及项目中遇到的问题分析

iOS支付宝支付(Alipay)详细接入流程以及项目中遇到的问题分析 浏览: 149 发布日期: 2016-10-19  分类: ios 最近在项目中接入了微信支付和支付宝支付,总的来说没有那么坑,很多人都说文档不全什么的,确实没有面面 俱到,但是认真一步一步测试下还是妥妥的,再配合懂得后台,效率也是很高的,看了这篇文章,你也只要几分钟, 就能轻松接入支付宝,在别人投来崇拜的眼光的同时,你就能潇洒的回一句,略懂略懂......   先给大家我写的微信支付,很详细哦,喜欢的点个赞点击打开微信支付链

支付网关 | 京东618、双11用户支付的核心承载系统(上篇)

二零一七年六月二十一日,就是年中大促刚结束的那一天,我午饭时间独在办公室里徘徊,遇见X君,前来问我道,"可曾为这次大促写了一点什么没有?"我说"没有".他就正告我,"还是写一点罢:小伙伴们很想了解支撑起这么大的用户支付流量所采用的技术." 「摘要」由于设计时我跟小伙伴们把系统的定位更偏向于具有用户支付事务处理能力的消息总线.业务深度耦合涉及比较广,感觉一次性到位说清楚不太可能.故本篇分为上下两篇,上篇仅对支付网关架构和支付业务流程进行基本介绍,采

第三方支付网关

在电子商务越来越发达的今天,第三方支付网关也越来越多,虽然第三方支付的公司很多,但在接口方面还是比较相似的,都有一定的规则在其中,比如支付,它势必会有订单生成.支付.返回成功标志.对账等功能,当然,各家网关还有自己独有的一些特点,比如IPS的分账系统. 或许大家会在各家公司之间取舍,就我个人来看,现在做的比较成功的,还算支付宝,有淘宝这个得天独厚的电子商务平台,使支付宝这个第三方成为了国内首屈一指的支付平台,稳定性和安全性都相对比较好.IPS是国内较早起家的第三方支付网关,成熟的商业模式和完善的

精选国内六大主要支付网关

现在网付的人越来越多,操作性越来越强,可能会有很多的新手会发愁,用那个网关最安全可靠而又方便,在这里,我为大家精心准备了国内六大支付网关,以供大家选择,网上支付存有一定的风险,请大家一定要注意安全,尽量不要在公用的网络里支付,不要在网吧里操作,以防被盗! 1.支付宝  https://www.alipay.com/ 阿里巴巴旗下网站,淘宝网主要支付方式,今年开放网站支付接口,手续费全免,而且提供信用中介功能,买家收到货再付款,在中国现有电子商务环境下此方式容易取得买家信任.对于加入支付宝联盟的网