前言:

  很多接案的人,都會碰到需要接金流的時候。而歐付寶是個台灣的金流平台。

  這邊記錄下,串接的心得。我用的語言是Java, 採liferay這個portal平台,不過這份教學當然適合servlet.

  不過官方技術文件,太規格導向了。應該要方便developer快速開發才是 很多資訊還是要向官方問才知道。

流程 :

  1. 假設有一個網購網站,有使用者下了單之後,採用信用卡付款。此時照官方使用範例

    會把所有資訊弄成html的語法(html hidden fields),再加密送出去。

    eg.

    <input type="hidden" name="Language" value="English">
  2. 如果不懂,覺得太抽象可以用 http://dev.lovewed.tw/allpay/ 這個網站來測試整個流程(歐付寶有提供測試平台,測試信用卡 卡號)。

    了解整個流程後,我們可以確定歐付寶正常無誤就可以開始串寫程式了。

  3. 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

  4. 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] 歐付寶金流串接教學的更多相关文章

  1. java学习笔记05--字符串 .

    java学习笔记05--字符串 . 一.String类 由字符所组成的一串文字符号被称之为字符串.在java中字符串不仅仅是字符数组,而且是String类的一个实例,可以使用String类来构建. 字 ...

  2. 【转】Jollen 的 Android 教學,#12: 如何建立選單 Menu

    原文网址:http://www.jollen.org/blog/2009/06/jollen-android-programming-12.html Android應用程式的UI可以使用XML來定義, ...

  3. VPN Gate Client v4.11-免費、無限流量VPN翻牆(跳板)軟體(使用教學)

    VPN Gate Client安裝教學 ▼把下載的檔案壓縮後,開啟安裝檔案. ▼接下來就是一般安裝步驟,下一步>下一步   ▼同意>下一步>下一步   ▼安裝目錄可以用預設的也可以自 ...

  4. [How To] TrueCrypt使用教學 - 重要資訊的加密保險箱(转)

    我在2013年八月的時候寫了這篇關於TrueCrypt的使用教學,但從去年(2014)五月下旬開始,TrueCrypt的首頁出現了"Using TrueCrypt is not secure ...

  5. 【NS2】NS2 教學手冊(转载)

    之前做毕设的时候搜索NS2的相关资料,发现这个里面涵盖很广,特此收藏,感谢原作者的辛勤劳作. NS2 教學手冊 ( NS2 Learning Guide) [快速連結區] My works  中文影音 ...

  6. 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)

    本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 ...

  7. Java堆内存又溢出了!教你一招必杀技

    JAVA堆内存管理是影响性能主要因素之一.堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的. 先看下JAVA堆内存是如何划分的,如图: JVM内存划分为 ...

  8. java实体类和json串字段名称不一致或者与map中字段名称不一致使用注解转化

    package yuanCheng; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List ...

  9. Java 调用 C++ (Java 调用 dll)康哥手把手教你

    摘要: 本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4979243.html 因为要做点图形处理的项目,需要在Java中调用dll库,所以开发的第一步是 ...

随机推荐

  1. 初学oracle第三天

    体系结构 Oracle 采取的是 Client/Server 架构. 3.1 Client   3.1.1 Sqlplus 这是一个轻量级的功能强大的客户端, 是 dba 必须掌握的工具. 我们可以配 ...

  2. 去掉html中的标签

    //去掉html中的图片 String regEx_image = "(<img.*src\\s*=\\s*(.*?)[^>]*?>)"; Pattern p_s ...

  3. 【leetcode】522. Longest Uncommon Subsequence II

    题目如下: 解题思路:因为given list长度最多是50,我的解法就比较随意了,直接用一个嵌套的循环,判断数组中每个元素是否是其他的subsequence,最后找出不属于任何元素subsequen ...

  4. LeetCode--008--字符串转换整数 (atoi)(python)

    示例 1: 输入: "42"输出: 42示例 2: 输入: " -42"输出: -42解释: 第一个非空白字符为 '-', 它是一个负号.  我们尽可能将负号与 ...

  5. Spring快速复习和总结

    IOC:管理和启动的java类的权力反转到了Spring容器了: 具体说明:Spring容器将配置好的bean放到容器(通过beanfactory,这是一个接口)中,并开始启动(反射)和调用(反射)和 ...

  6. pages

    pages pages 接受一个数组,每一项都是一个字符串,指定 SWAN App 都有哪些页面.每一项代表页面的[路径 + 文件名],数组第一项代表 SWAN 初始页面. SWAN 中新增或减少页面 ...

  7. luogu P1028 数的计算 x

    P1028 数的计算 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理; 2.在它 ...

  8. Codeforces Round #579 (Div. 3) 套题 题解

    A. Circle of Students      题目:https://codeforces.com/contest/1203/problem/A 题意:一堆人坐成一个环,问能否按逆时针或者顺时针 ...

  9. sh_09_格式化输出

    sh_09_格式化输出 # 定义字符串变量 name,输出 我的名字叫 小明,请多多关照! name = "大小明" print("我的名字叫 %s,请多多关照!&quo ...

  10. bash中前后移动一个单词和删除单词的快捷键

    bash中一个很重要的快捷键,就是向后删除一个单词: ctrl+w=ctrl+W 一个字符一个字符的移动是: ctrl+f, ctrl+b 但是, 一个单词一个单词的移动是: (但是, 这个用得比较少 ...