[Java] 歐付寶金流串接教學
前言:
很多接案的人,都會碰到需要接金流的時候。而歐付寶是個台灣的金流平台。
這邊記錄下,串接的心得。我用的語言是Java, 採liferay這個portal平台,不過這份教學當然適合servlet.
不過官方技術文件,太規格導向了。應該要方便developer快速開發才是 很多資訊還是要向官方問才知道。
流程 :
- 假設有一個網購網站,有使用者下了單之後,採用信用卡付款。此時照官方使用範例
會把所有資訊弄成html的語法(html hidden fields),再加密送出去。
eg.
<input type="hidden" name="Language" value="English">
如果不懂,覺得太抽象可以用 http://dev.lovewed.tw/allpay/ 這個網站來測試整個流程(歐付寶有提供測試平台,測試信用卡 卡號)。
了解整個流程後,我們可以確定歐付寶正常無誤就可以開始串寫程式了。
- payment.jsp, 這支是負責user填完資料驗證後,且在我方server有紀錄後,送給轉到歐付寶付款用的。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="AllPay.Payment.Integration.*" %>
<%@ page import="java.util.Hashtable" %>
<%@ page import="java.util.Set" %>
<%@ page import="java.util.TreeSet" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>AllPay</title>
</head>
<body>
<%
List<String> enErrors = new ArrayList<String>();
try {
AllInOne oPayment = new AllInOne(); /* 服務參數 */
oPayment.ServiceMethod = HttpMethod.HttpPOST;
oPayment.ServiceURL = "";
oPayment.HashKey = "";
oPayment.HashIV = "";
oPayment.MerchantID = ""; /* 基本參數 */
oPayment.Send.ReturnURL = "http://172.16.30.41:8080/AllPayWeb/checkOutFeedback_All.jsp";
oPayment.Send.ClientBackURL = "http://172.16.30.41:8080/AllPayWeb/checkOutFeedback_All.jsp";
oPayment.Send.OrderResultURL = "http://172.16.30.41:8080/AllPayWeb/checkOutFeedback_All.jsp";
oPayment.Send.MerchantTradeNo = String.valueOf((new Date()).getTime());
oPayment.Send.MerchantTradeDate = new Date();
oPayment.Send.TotalAmount = new Decimal("300");
oPayment.Send.TradeDesc = AllPayFunction.genString("測試");
oPayment.Send.ChoosePayment = PaymentMethod.ALL;
oPayment.Send.Remark = AllPayFunction.genString("測試Pay");
oPayment.Send.ChooseSubPayment = PaymentMethodItem.ATM_TAISHIN;
oPayment.Send.NeedExtraPaidInfo = ExtraPaymentInfo.Yes;
oPayment.Send.DeviceSource = DeviceType.PC; oPayment.SendExtend.ExpireDate = 1;
oPayment.SendExtend.PaymentInfoURL = "http://172.16.30.41:8080/AllPayWeb/checkOutFeedback_All.jsp";
//oPayment.SendExtend.ClientRedirectURL = "http://172.16.30.41:8080/"; // 加入選購商品資料。
Item a1 = new Item();
a1.Name = "一棟房子";
a1.Price = new Decimal("300");
a1.Currency = "元";
a1.Quantity = 2;
a1.URL = "<<產品說明位址>>";
oPayment.Send.Items.add(a1); Item a2 = new Item();
a2.Name = "iPhone 6S";
a2.Price = new Decimal("400");
a2.Currency = "元";
a2.Quantity = 8;
a2.URL = "<<產品說明位址>>";
oPayment.Send.Items.add(a2); enErrors.addAll(oPayment.CheckOut(response.getWriter())); }
catch (Exception e) {
enErrors.add(e.getMessage());
}
finally {
if (enErrors.size() > 0)
out.print(enErrors);
}
%>
</body>
</html>bittorrent
- paymentresult.jsp
<%@include file="init.jsp" %>
<%
List<String> enErrors = new ArrayList<String>(); try {
//ParamUtil.print(request);
AllInOne oPayment = new AllInOne();
Hashtable<String, String> htFeedback = new Hashtable<String, String>();
//HttpServletRequest request = PortalUtil.getHttpServletRequest(actionrequest);
enErrors.addAll(oPayment.CheckOutFeedback(htFeedback, request));
Set<String> key = htFeedback.keySet();
String name[] = key.toArray(new String[key.size()]); // id = id.Replace("_", "-");
String HashKey = "";
String HashIV = ""; //Get a payment result data
String szMerchantID = "";
String szMerchantTradeNo = "";
String szPaymentDate = "";
String szPaymentType = "";
String szPaymentTypeChargeFee = "";
String szRtnCode = "";
String szRtnMsg = "";
String szSimulatePaid = "";
String szTradeAmt = "";
String szTradeDate = "";
String szTradeNo = "";
/* 使用 ATM 交易時,回傳的額外參數 */
String szBankCode = "";
String szVirtualAccount = "";
String szExpireDate = ""; String szCheckMacValue = ""; for (int i = 0; i < name.length; i++) {
/* 支付後的回傳的基本參數 */
if (name[i].equals("MerchantID"))
szMerchantID = htFeedback.get(name[i]);
else if (name[i].equals("MerchantTradeNo"))
szMerchantTradeNo = htFeedback.get(name[i]);
else if (name[i].equals("PaymentDate"))
szPaymentDate = htFeedback.get(name[i]);
else if (name[i].equals("PaymentType"))
szPaymentType = htFeedback.get(name[i]);
else if (name[i].equals("PaymentTypeChargeFee"))
szPaymentTypeChargeFee = htFeedback.get(name[i]);
else if (name[i].equals("RtnCode"))
szRtnCode = htFeedback.get(name[i]);
else if (name[i].equals("RtnMsg"))
szRtnMsg = htFeedback.get(name[i]);
else if (name[i].equals("SimulatePaid"))
szSimulatePaid = htFeedback.get(name[i]);
else if (name[i].equals("TradeAmt"))
szTradeAmt = htFeedback.get(name[i]);
else if (name[i].equals("TradeDate"))
szTradeDate = htFeedback.get(name[i]);
else if (name[i].equals("TradeNo"))
szTradeNo = htFeedback.get(name[i]);
else if(name[i].equals("BankCode"))
szBankCode = htFeedback.get(name[i]);
else if(name[i].equals("vAccount"))
szVirtualAccount = htFeedback.get(name[i]);
else if(name[i].equals("ExpireDate"))
szExpireDate = htFeedback.get(name[i]);
}
System.out.println("MerchantID = " + szMerchantID);
System.out.println("MerchantTradeNo = " + szMerchantTradeNo);
System.out.println("PaymentDate = " + szPaymentDate);
System.out.println("PaymentType = " + szPaymentType);
System.out.println("PaymentTypeChargeFee = "
+ szPaymentTypeChargeFee);
System.out.println("RtnCode = " + szRtnCode);
System.out.println("RtnMsg = " + szRtnMsg);
System.out.println("SimulatePaid = " + szSimulatePaid);
System.out.println("TradeAmt = " + szTradeAmt);
System.out.println("TradeDate = " + szTradeDate);
System.out.println("TradeNo = " + szTradeNo);
/* 使用 ATM 交易時,回傳的額外參數 */
System.out.println("BankCode = " + szBankCode);
System.out.println("vAccount = " + szVirtualAccount);
System.out.println("ExpireDate = " + szExpireDate);
out.println("");
} catch (Exception e) {
enErrors.add(e.getMessage());
} finally {
if (enErrors.size() == 0)
out.println("1|OK");
else
out.println("0|" + enErrors); }
%>bittorrent
則是user在歐付寶付款後,通知我方server用的,好讓我方server在資料庫中,紀錄成功入賬。
結尾:
基本上,只要欄位照著規格書填對。就沒有太大的問題,而看到官方有其他的問題則是參數中有 / - 等字串
所以過程中,我是已經避免此問題了。
若有問題,可以留言討論。
[Java] 歐付寶金流串接教學的更多相关文章
- java学习笔记05--字符串 .
java学习笔记05--字符串 . 一.String类 由字符所组成的一串文字符号被称之为字符串.在java中字符串不仅仅是字符数组,而且是String类的一个实例,可以使用String类来构建. 字 ...
- 【转】Jollen 的 Android 教學,#12: 如何建立選單 Menu
原文网址:http://www.jollen.org/blog/2009/06/jollen-android-programming-12.html Android應用程式的UI可以使用XML來定義, ...
- VPN Gate Client v4.11-免費、無限流量VPN翻牆(跳板)軟體(使用教學)
VPN Gate Client安裝教學 ▼把下載的檔案壓縮後,開啟安裝檔案. ▼接下來就是一般安裝步驟,下一步>下一步 ▼同意>下一步>下一步 ▼安裝目錄可以用預設的也可以自 ...
- [How To] TrueCrypt使用教學 - 重要資訊的加密保險箱(转)
我在2013年八月的時候寫了這篇關於TrueCrypt的使用教學,但從去年(2014)五月下旬開始,TrueCrypt的首頁出現了"Using TrueCrypt is not secure ...
- 【NS2】NS2 教學手冊(转载)
之前做毕设的时候搜索NS2的相关资料,发现这个里面涵盖很广,特此收藏,感谢原作者的辛勤劳作. NS2 教學手冊 ( NS2 Learning Guide) [快速連結區] My works 中文影音 ...
- 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)
本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 ...
- Java堆内存又溢出了!教你一招必杀技
JAVA堆内存管理是影响性能主要因素之一.堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的. 先看下JAVA堆内存是如何划分的,如图: JVM内存划分为 ...
- java实体类和json串字段名称不一致或者与map中字段名称不一致使用注解转化
package yuanCheng; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List ...
- Java 调用 C++ (Java 调用 dll)康哥手把手教你
摘要: 本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4979243.html 因为要做点图形处理的项目,需要在Java中调用dll库,所以开发的第一步是 ...
随机推荐
- wepy-数据双向绑定input
初入wepy,发现wepy和vue神似,但还是有不一样的地方,例如v-model数据双向绑定 场景: 一个input搜索框,用户输入内容,点击“叉叉”按钮,输入的内容全部清空,这是一个很常见的场景 j ...
- NPM错误
有时突然报下面错误: 本人经验是IP变了...
- Java——常用类(File)
[File] <1>java.io.File类代表系统文件名(路径和文件名). ----注意:这里代表的只是文件名,而不是物理上的文件(硬盘上的数据),通过该类无法读 ...
- [luogu]P2680 运输计划[二分答案][树上差分]
[luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...
- Vue中v-for配合使用Swiper插件问题
问题描述: 在一个页面中需要一个用swiper的轮播图,数据大概有40条,每一屏幕的swiper只显示其中的n条数据. 代码描述: <div id="app"> < ...
- 笨办法学Python(learn python the hard way)--练习程序41
下面是练习41,基于python3 #ex41.py 1 #打印文档字符串 print(函数名.__doc__) 2 from sys import exit 3 from random import ...
- 9 关联管理器(RelatedManager)
知识预览: class RelatedManager class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: ...
- 高通平台Camera调试(一)【转】
本文转载自:http://www.voidcn.com/blog/Winva/article/p-6044730.html 4.3. Camera 参考文档: 1) 80-NA157-22_PRESE ...
- dp基础大概 (8.6)
一些前言: 据说动态规划会用排序,数据结构来进行乱搞优化操作 动态规划滴核心是个啥呢?状态表示和状态转移 设状态:哪些因素会影响到最终答案,就把哪些因素用数组的维度表示出来 要充分描述,也要简洁 举个 ...
- 如何吸引用户打开自己发送的EDM邮件
一般来说,邮件发送到用户的收件箱,但用户不一定会阅读.因为每个用户收到的邮件都很多.那么,究竟应该如何吸引读者打开自己的EDM邮件呢? 只有当用户认识并信任发件人的时候,此时邮件的打开率是最高的,可以 ...