1. 程式人生 > >java開發 第三方支付 介面

java開發 第三方支付 介面

alipay 的幾個核心功能檔案:
======================================================================================================
AlipayFunction.java
[java] view plain copy print?
  1. package com.test.util.alipay;  
  2. import java.io.FileWriter;  
  3. import java.io.IOException;  
  4. import java.net.MalformedURLException;  
  5. import java.net.URL;  
  6. import java.util.ArrayList;  
  7. import java.util.Collections;  
  8. import java.util.HashMap;  
  9. import java.util.List;  
  10. import java.util.Map;  
  11. import org.dom4j.Document;  
  12. import org.dom4j.DocumentException;  
  13. import org.dom4j.Node;  
  14. import org.dom4j.io.SAXReader;  
  15. publicclass AlipayFunction {  
  16.     /** 
  17.      * 功能:生成簽名結果 
  18.      * @param sArray 要簽名的陣列 
  19.      * @param key 安全校驗碼 
  20.      * @return 簽名結果字串 
  21.      */
  22.     publicstatic String BuildMysign(Map sArray, String key) {  
  23.         String prestr = CreateLinkString(sArray);  //把陣列所有元素,按照“引數=引數值”的模式用“&”字元拼接成字串
  24.         prestr = prestr + key;                     //把拼接後的字串再與安全校驗碼直接連線起來
  25.         String mysign = Md5Encrypt.md5(prestr);  
  26.         return mysign;  
  27.     }  
  28.     /** 
  29.      * 功能:除去陣列中的空值和簽名引數 
  30.      * @param sArray 簽名引數組 
  31.      * @return 去掉空值與簽名引數後的新簽名引數組 
  32.      */
  33.     publicstatic Map ParaFilter(Map sArray){  
  34.         List keys = new ArrayList(sArray.keySet());  
  35.         Map sArrayNew = new HashMap();  
  36.         for(int i = 0; i < keys.size(); i++){  
  37.             String key = (String) keys.get(i);  
  38.             String value = (String) sArray.get(key);  
  39.             if( value == null || value.equals("") ||  
  40.                     key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type")){  
  41.                 continue;  
  42.             }  
  43.             sArrayNew.put(key, value);  
  44.         }  
  45.         return sArrayNew;  
  46.     }  
  47.     /** 
  48.      * 功能:把陣列所有元素排序,並按照“引數=引數值”的模式用“&”字元拼接成字串 
  49.      * @param params 需要排序並參與字元拼接的引數組 
  50.      * @return 拼接後字串 
  51.      */
  52.     publicstatic String CreateLinkString(Map params){  
  53.         List keys = new ArrayList(params.keySet());  
  54.         Collections.sort(keys);  
  55.         String prestr = "";  
  56.         for (int i = 0; i < keys.size(); i++) {  
  57.             String key = (String) keys.get(i);  
  58.             String value = (String) params.get(key);  
  59.             if (i == keys.size() - 1) {//拼接時,不包括最後一個&字元
  60.                 prestr = prestr + key + "=" + value;  
  61.             } else {  
  62.                 prestr = prestr + key + "=" + value + "&";  
  63.             }  
  64.         }  
  65.         return prestr;  
  66.     }  
  67.     /** 
  68.      * 功能:寫日誌,方便測試(看網站需求,也可以改成把記錄存入資料庫) 
  69.      * @param sWord 要寫入日誌裡的文字內容 
  70.      */
  71.     publicstaticvoid LogResult(String sWord){  
  72.         // 該檔案存在於和應用伺服器 啟動檔案同一目錄下,檔名是alipay log加伺服器時間
  73.         try {  
  74.             FileWriter writer = new FileWriter("D:\\alipay_log" + System.currentTimeMillis() + ".txt");  
  75.             writer.write(sWord);  
  76.             writer.close();  
  77.         } catch (Exception e) {  
  78.             e.printStackTrace();  
  79.         }  
  80.     }  
  81.     /** 
  82.      * 功能:用於防釣魚,呼叫介面query_timestamp來獲取時間戳的處理函式 
  83.      * 注意:遠端解析XML出錯,與伺服器是否支援SSL等配置有關 
  84.      * @param partner 合作身份者ID 
  85.      * @return 時間戳字串 
  86.      * @throws IOException 
  87.      * @throws DocumentException 
  88.      * @throws MalformedURLException 
  89.      */
  90.     publicstatic String query_timestamp(String partner)  
  91.             throws MalformedURLException, DocumentException, IOException {  
  92.         String strUrl = "https://mapi.alipay.com/gateway.do?service=query_timestamp&partner="+partner;  
  93.         StringBuffer buf1 = new StringBuffer();  
  94.         SAXReader reader = new SAXReader();  
  95.         Document doc = reader.read(new URL(strUrl).openStream());  
  96.         List<Node> nodeList = doc.selectNodes("//alipay/*");  
  97.         for (Node node : nodeList) {  
  98.             // 擷取部分不需要解析的資訊
  99.             if (node.getName().equals("is_success")  
  100.                     && node.getText().equals("T")) {  
  101.                 // 判斷是否有成功標示
  102.                 List<Node> nodeList1 = doc.selectNodes("//response/timestamp/*");  
  103.                 for (Node node1 : nodeList1) {  
  104.                     buf1.append(node1.getText());  
  105.                 }  
  106.             }  
  107.         }  
  108.         return buf1.toString();  
  109.     }  
  110. }  
package com.test.util.alipay;


import java.io.FileWriter;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;




public class AlipayFunction {
    /**
     * 功能:生成簽名結果
     * @param sArray 要簽名的陣列
     * @param key 安全校驗碼
     * @return 簽名結果字串
     */
    public static String BuildMysign(Map sArray, String key) {
        String prestr = CreateLinkString(sArray);  //把陣列所有元素,按照“引數=引數值”的模式用“&”字元拼接成字串
        prestr = prestr + key;                     //把拼接後的字串再與安全校驗碼直接連線起來
        String mysign = Md5Encrypt.md5(prestr);
        return mysign;
    }
    
    /**
     * 功能:除去陣列中的空值和簽名引數
     * @param sArray 簽名引數組
     * @return 去掉空值與簽名引數後的新簽名引數組
     */
    public static Map ParaFilter(Map sArray){
        List keys = new ArrayList(sArray.keySet());
        Map sArrayNew = new HashMap();
        
        for(int i = 0; i < keys.size(); i++){
            String key = (String) keys.get(i);
            String value = (String) sArray.get(key);
            
            if( value == null || value.equals("") ||
                    key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type")){
                continue;
            }
            
            sArrayNew.put(key, value);
        }
        
        return sArrayNew;
    }
    
    /**
     * 功能:把陣列所有元素排序,並按照“引數=引數值”的模式用“&”字元拼接成字串
     * @param params 需要排序並參與字元拼接的引數組
     * @return 拼接後字串
     */
    public static String CreateLinkString(Map params){
        List keys = new ArrayList(params.keySet());
        Collections.sort(keys);

        String prestr = "";

        for (int i = 0; i < keys.size(); i++) {
            String key = (String) keys.get(i);
            String value = (String) params.get(key);

            if (i == keys.size() - 1) {//拼接時,不包括最後一個&字元
                prestr = prestr + key + "=" + value;
            } else {
                prestr = prestr + key + "=" + value + "&";
            }
        }

        return prestr;
    }
    
    /**
     * 功能:寫日誌,方便測試(看網站需求,也可以改成把記錄存入資料庫)
     * @param sWord 要寫入日誌裡的文字內容
     */
    public static void LogResult(String sWord){
        // 該檔案存在於和應用伺服器 啟動檔案同一目錄下,檔名是alipay log加伺服器時間
        try {
            FileWriter writer = new FileWriter("D:\\alipay_log" + System.currentTimeMillis() + ".txt");
            writer.write(sWord);
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 功能:用於防釣魚,呼叫介面query_timestamp來獲取時間戳的處理函式
     * 注意:遠端解析XML出錯,與伺服器是否支援SSL等配置有關
     * @param partner 合作身份者ID
     * @return 時間戳字串
     * @throws IOException
     * @throws DocumentException
     * @throws MalformedURLException
     */
    
    public static String query_timestamp(String partner)
            throws MalformedURLException, DocumentException, IOException {
        String strUrl = "https://mapi.alipay.com/gateway.do?service=query_timestamp&partner="+partner;
        StringBuffer buf1 = new StringBuffer();
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new URL(strUrl).openStream());
        
        List<Node> nodeList = doc.selectNodes("//alipay/*");
        
        for (Node node : nodeList) {
            // 擷取部分不需要解析的資訊
            if (node.getName().equals("is_success")
                    && node.getText().equals("T")) {
                // 判斷是否有成功標示
                List<Node> nodeList1 = doc.selectNodes("//response/timestamp/*");
                for (Node node1 : nodeList1) {
                    buf1.append(node1.getText());
                }
            }
        }
        
        return buf1.toString();
    }
}




======================================================================================================
AlipayNotify.java
[java] view plain copy print?
  1. package com.test.util.alipay;  
  2. import java.io.BufferedReader;  
  3. import java.io.InputStreamReader;  
  4. import java.net.HttpURLConnection;  
  5. import java.net.URL;  
  6. import java.util.Map;  
  7. import com.test.constants.AlipayConfig;  
  8. publicclass AlipayNotify {  
  9.     /** 
  10.      * *功能:根據反饋回來的資訊,生成簽名結果 
  11.      * @param Params 通知返回來的引數陣列 
  12.      * @param key 安全校驗碼 
  13.      * @return 生成的簽名結果 
  14.      */
  15.     publicstatic String GetMysign(Map Params, String key){  
  16.         Map sParaNew = AlipayFunction.ParaFilter(Params);//過濾空值、sign與sign_type引數
  17.         String mysign = AlipayFunction.BuildMysign(sParaNew, key);//獲得簽名結果
  18.         return mysign;  
  19.     }  
  20.     /** 
  21.     * *功能:獲取遠端伺服器ATN結果,驗證返回URL 
  22.     * @param notify_id 通知校驗ID 
  23.     * @return 伺服器ATN結果 
  24.     * 驗證結果集: 
  25.     * invalid命令引數不對 出現這個錯誤,請檢測返回處理中partner和key是否為空 
  26.     * true 返回正確資訊 
  27.     * false 請檢查防火牆或者是伺服器阻止埠問題以及驗證時間是否超過一分鐘 
  28.     */
  29.     publicstatic String Verify(String notify_id){  
  30.         //獲取遠端伺服器ATN結果,驗證是否是支付寶伺服器發來的請求
  31.         String transport = AlipayConfig.transport;  
  32.         String partner = AlipayConfig.partner;  
  33.         String veryfy_url = "";  
  34.         if(transport.equalsIgnoreCase("https")){  
  35.             veryfy_url = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify";  
  36.         } else{  
  37.             veryfy_url = "http://notify.alipay.com/trade/notify_query.do?";  
  38.         }  
  39.         veryfy_url = veryfy_url + "&partner=" + partner + "¬ify_id=" + notify_id;  
  40.         String responseTxt = CheckUrl(veryfy_url);  
  41.         return responseTxt;  
  42.     }  
  43.     /** 
  44.     * *功能:獲取遠端伺服器ATN結果 
  45.     * @param urlvalue 指定URL路徑地址 
  46.     * @return 伺服器ATN結果 
  47.     * 驗證結果集: 
  48.     * invalid命令引數不對 出現這個錯誤,請檢測返回處理中partner和key是否為空 
  49.     * true 返回正確資訊 
  50.     * false 請檢查防火牆或者是伺服器阻止埠問題以及驗證時間是否超過一分鐘 
  51.     */
  52.     publicstatic String CheckUrl(String urlvalue){  
  53.         String inputLine = "";  
  54.         try {  
  55.             URL url = new URL(urlvalue);  
  56.             HttpURLConnection urlConnection = (HttpURLConnection) url  
  57.                     .openConnection();  
  58.             BufferedReader in = new BufferedReader(new InputStreamReader(  
  59.                     urlConnection.getInputStream()));  
  60.             inputLine = in.readLine().toString();  
  61.         } catch (Exception e) {  
  62.             e.printStackTrace();  
  63.         }  
  64.         return inputLine;  
  65.     }  
  66. }  
package com.test.util.alipay;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;

import com.test.constants.AlipayConfig;


public class AlipayNotify {
    /**
     * *功能:根據反饋回來的資訊,生成簽名結果
     * @param Params 通知返回來的引數陣列
     * @param key 安全校驗碼
     * @return 生成的簽名結果
     */
    public static String GetMysign(Map Params, String key){
        Map sParaNew = AlipayFunction.ParaFilter(Params);//過濾空值、sign與sign_type引數
        String mysign = AlipayFunction.BuildMysign(sParaNew, key);//獲得簽名結果
        
        return mysign;
    }
    
    /**
    * *功能:獲取遠端伺服器ATN結果,驗證返回URL
    * @param notify_id 通知校驗ID
    * @return 伺服器ATN結果
    * 驗證結果集:
    * invalid命令引數不對 出現這個錯誤,請檢測返回處理中partner和key是否為空
    * true 返回正確資訊
    * false 請檢查防火牆或者是伺服器阻止埠問題以及驗證時間是否超過一分鐘
    */
    public static String Verify(String notify_id){
        //獲取遠端伺服器ATN結果,驗證是否是支付寶伺服器發來的請求
        String transport = AlipayConfig.transport;
        String partner = AlipayConfig.partner;
        String veryfy_url = "";
        if(transport.equalsIgnoreCase("https")){
            veryfy_url = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify";
        } else{
            veryfy_url = "http://notify.alipay.com/trade/notify_query.do?";
        }
        veryfy_url = veryfy_url + "&partner=" + partner + "¬ify_id=" + notify_id;
        
        String responseTxt = CheckUrl(veryfy_url);
        
        return responseTxt;
    }
    
    /**
    * *功能:獲取遠端伺服器ATN結果
    * @param urlvalue 指定URL路徑地址
    * @return 伺服器ATN結果
    * 驗證結果集:
    * invalid命令引數不對 出現這個錯誤,請檢測返回處理中partner和key是否為空
    * true 返回正確資訊
    * false 請檢查防火牆或者是伺服器阻止埠問題以及驗證時間是否超過一分鐘
    */
    public static String CheckUrl(String urlvalue){
        String inputLine = "";

        try {
            URL url = new URL(urlvalue);
            HttpURLConnection urlConnection = (HttpURLConnection) url
                    .openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    urlConnection.getInputStream()));
            inputLine = in.readLine().toString();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return inputLine;
    }
}


======================================================================================================
AlipayService.java
[java] view plain copy print?
  1. package com.test.util.alipay;  
  2. import java.util.ArrayList;  
  3. import java.util.HashMap;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6. publicclass AlipayService {  
  7.     /** 
  8.      * 功能:構造表單提交HTML 
  9.      * @param partner 合作身份者ID 
  10.      * @param seller_email 簽約支付寶賬號或賣家支付寶帳戶 
  11.      * @param return_url 付完款後跳轉的頁面 要用 以http開頭格式的完整路徑,不允許加?id=123這類自定義引數 
  12.      * @param notify_url 交易過程中伺服器通知的頁面 要用 以http開格式的完整路徑,不允許加?id=123這類自定義引數 
  13.      * @param show_url 網站商品的展示地址,不允許加?id=123這類自定義引數 
  14.      * @param out_trade_no 請與貴網站訂單系統中的唯一訂單號匹配 
  15.      * @param subject 訂單名稱,顯示在支付寶收銀臺裡的“商品名稱”裡,顯示在支付寶的交易管理的“商品名稱”的列表裡。 
  16.      * @param body 訂單描述、訂單詳細、訂單備註,顯示在支付寶收銀臺裡的“商品描述”裡 
  17.      * @param total_fee 訂單總金額,顯示在支付寶收銀臺裡的“應付總額”裡 
  18.      * @param paymethod 預設支付方式,四個值可選:bankPay(網銀); cartoon(卡通); directPay(餘額);  CASH(網點支付) 
  19.      * @param defaultbank 預設網銀代號,代號列表見club.alipay.com/read.php?tid=8681379 
  20.      * @param encrypt_key 防釣魚時間戳 
  21.      * @param exter_invoke_ip 買家本地電腦的IP地址 
  22.      * @param extra_common_param 自定義引數,可存放任何內容(除等特殊字元外),不會顯示在頁面上 
  23.      * @param buyer_email 預設買家支付寶賬號 
  24.      * @param royalty_type 提成型別,該值為固定值:10,不需要修改 
  25.      * @param royalty_parameters 提成資訊集,與需要結合商戶網站自身情況動態獲取每筆交易的各分潤收款賬號、各分潤金額、各分潤說明。最多隻能設定10條 
  26.      * @param input_charset 字元編碼格式 目前支援 GBK 或 utf-8 
  27.      * @param key 安全校驗碼 
  28.      * @param sign_type 簽名方式 不需修改 
  29.      * @param key 安全校驗碼 
  30.      * @return 表單提交HTML文字 
  31.      */
  32.     publicstatic String BuildForm(String partner,  
  33.             String seller_email,  
  34.             String return_url,  
  35.             String notify_url,  
  36.             String show_url,  
  37.             String out_trade_no,  
  38.             String subject,  
  39.             String body,  
  40.             String total_fee,  
  41.             String paymethod,  
  42.             String defaultbank,  
  43.             String anti_phishing_key,  
  44.             String exter_invoke_ip,  
  45.             String extra_common_param,  
  46.             String buyer_email,  
  47.             String royalty_type,  
  48.             String royalty_parameters,  
  49.             String input_charset,  
  50.             String key,  
  51.             String sign_type,  
  52.             String it_b_pay){  
  53.         Map sPara = new HashMap();  
  54.         sPara.put("service","create_direct_pay_by_user");  
  55.         sPara.put("payment_type","1");  
  56.         sPara.put("partner", partner);  
  57.         sPara.put("seller_email", seller_email);  
  58.         sPara.put("return_url", return_url);  
  59.         sPara.put("notify_url", notify_url);  
  60.         sPara.put("_input_charset", input_charset);  
  61.         sPara.put("show_url", show_url);  
  62.         sPara.put("out_trade_no", out_trade_no);  
  63.         sPara.put("subject", subject);  
  64.         sPara.put("body", body);  
  65.         sPara.put("total_fee", total_fee);  
  66.         sPara.put("paymethod", paymethod);  
  67.         sPara.put("defaultbank", defaultbank);  
  68.         sPara.put("anti_phishing_key", anti_phishing_key);  
  69.         sPara.put("exter_invoke_ip", exter_invoke_ip);  
  70.         sPara.put("extra_common_param", extra_common_param);  
  71.         sPara.put("buyer_email", buyer_email);  
  72.         sPara.put("royalty_type", royalty_type);  
  73.         sPara.put("royalty_parameters", royalty_parameters);  
  74.         sPara.put("it_b_pay", it_b_pay);  
  75.         Map sParaNew = AlipayFunction.ParaFilter(sPara); //除去陣列中的空值和簽名引數
  76.         String mysign = AlipayFunction.BuildMysign(sParaNew, key);//生成簽名結果
  77.         StringBuffer sbHtml = new StringBuffer();  
  78.         List keys = new ArrayList(sParaNew.keySet());  
  79.         String gateway = "https://www.alipay.com/cooperate/gateway.do?";  
  80.         //GET方式傳遞
  81.         //sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + gateway + "_input_charset=" + input_charset + "\" method=\"get\">");
  82.         //POST方式傳遞(GET與POST二必選一)
  83.         sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + gateway + "_input_charset=" + input_charset + "\" method=\"post\">");  
  84.         for (int i = 0; i < keys.size(); i++) {  
  85.             String name = (String) keys.get(i);  
  86.             String value = (String) sParaNew.get(name);  
  87.             sbHtml.append("<input type=\"hidden\" name=\"" + name + "\" value=\"" + value + "\"/>");  
  88.         }  
  89.         sbHtml.append("<input type=\"hidden\" name=\"sign\" value=\"" + mysign + "\"/>");  
  90.         sbHtml.append("<input type=\"hidden\" name=\"sign_type\" value=\"" + sign_type + "\"/>");  
  91.         //submit按鈕控制元件請不要含有name屬性
  92.         sbHtml.append("<input type=\"submit\" value=\"支付寶確認付款\"></form>");  
  93.         sbHtml.append("<script>document.forms['alipaysubmit'].submit();</script>");  
  94.         return sbHtml.toString();  
  95.     }  
  96. }  
package com.test.util.alipay;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class AlipayService {
    /**
     * 功能:構造表單提交HTML
     * @param partner 合作身份者ID
     * @param seller_email 簽約支付寶賬號或賣家支付寶帳戶
     * @param return_url 付完款後跳轉的頁面 要用 以http開頭格式的完整路徑,不允許加?id=123這類自定義引數
     * @param notify_url 交易過程中伺服器通知的頁面 要用 以http開格式的完整路徑,不允許加?id=123這類自定義引數
     * @param show_url 網站商品的展示地址,不允許加?id=123這類自定義引數
     * @param out_trade_no 請與貴網站訂單系統中的唯一訂單號匹配
     * @param subject 訂單名稱,顯示在支付寶收銀臺裡的“商品名稱”裡,顯示在支付寶的交易管理的“商品名稱”的列表裡。
     * @param body 訂單描述、訂單詳細、訂單備註,顯示在支付寶收銀臺裡的“商品描述”裡
     * @param total_fee 訂單總金額,顯示在支付寶收銀臺裡的“應付總額”裡
     * @param paymethod 預設支付方式,四個值可選:bankPay(網銀); cartoon(卡通); directPay(餘額);  CASH(網點支付)
     * @param defaultbank 預設網銀代號,代號列表見club.alipay.com/read.php?tid=8681379
     * @param encrypt_key 防釣魚時間戳
     * @param exter_invoke_ip 買家本地電腦的IP地址
     * @param extra_common_param 自定義引數,可存放任何內容(除等特殊字元外),不會顯示在頁面上
     * @param buyer_email 預設買家支付寶賬號
     * @param royalty_type 提成型別,該值為固定值:10,不需要修改
     * @param royalty_parameters 提成資訊集,與需要結合商戶網站自身情況動態獲取每筆交易的各分潤收款賬號、各分潤金額、各分潤說明。最多隻能設定10條
     * @param input_charset 字元編碼格式 目前支援 GBK 或 utf-8
     * @param key 安全校驗碼
     * @param sign_type 簽名方式 不需修改
     * @param key 安全校驗碼
     * @return 表單提交HTML文字
     */
    public static String BuildForm(String partner,
            String seller_email,
            String return_url,
            String notify_url,
            String show_url,
            String out_trade_no,
            String subject,
            String body,
            String total_fee,
            String paymethod,
            String defaultbank,
            String anti_phishing_key,
            String exter_invoke_ip,
            String extra_common_param,
            String buyer_email,
            String royalty_type,
            String royalty_parameters,
            String input_charset,
            String key,
            String sign_type,
            String it_b_pay){
        Map sPara = new HashMap();
        sPara.put("service","create_direct_pay_by_user");
        sPara.put("payment_type","1");
        sPara.put("partner", partner);
        sPara.put("seller_email", seller_email);
        sPara.put("return_url", return_url);
        sPara.put("notify_url", notify_url);
        sPara.put("_input_charset", input_charset);
        sPara.put("show_url", show_url);
        sPara.put("out_trade_no", out_trade_no);
        sPara.put("subject", subject);
        sPara.put("body", body);
        sPara.put("total_fee", total_fee);
        sPara.put("paymethod", paymethod);
        sPara.put("defaultbank", defaultbank);
        sPara.put("anti_phishing_key", anti_phishing_key);
        sPara.put("exter_invoke_ip", exter_invoke_ip);
        sPara.put("extra_common_param", extra_common_param);
        sPara.put("buyer_email", buyer_email);
        sPara.put("royalty_type", royalty_type);
        sPara.put("royalty_parameters", royalty_parameters);
        sPara.put("it_b_pay", it_b_pay);
        
        Map sParaNew = AlipayFunction.ParaFilter(sPara); //除去陣列中的空值和簽名引數
        String mysign = AlipayFunction.BuildMysign(sParaNew, key);//生成簽名結果
        
        StringBuffer sbHtml = new StringBuffer();
        List keys = new ArrayList(sParaNew.keySet());
        String gateway = "https://www.alipay.com/cooperate/gateway.do?";
        
        //GET方式傳遞
        //sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + gateway + "_input_charset=" + input_charset + "\" method=\"get\">");
        //POST方式傳遞(GET與POST二必選一)
        sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + gateway + "_input_charset=" + input_charset + "\" method=\"post\">");
        
        for (int i = 0; i < keys.size(); i++) {
            String name = (String) keys.get(i);
            String value = (String) sParaNew.get(name);
            
            sbHtml.append("<input type=\"hidden\" name=\"" + name + "\" value=\"" + value + "\"/>");
        }
        sbHtml.append("<input type=\"hidden\" name=\"sign\" value=\"" + mysign + "\"/>");
        sbHtml.append("<input type=\"hidden\" name=\"sign_type\" value=\"" + sign_type + "\"/>");
        
        //submit按鈕控制元件請不要含有name屬性
        sbHtml.append("<input type=\"submit\" value=\"支付寶確認付款\"></form>");
        
        sbHtml.append("<script>document.forms['alipaysubmit'].submit();</script>");
        
        return sbHtml.toString();
    }
}


======================================================================================================
Md5Encrypt.java

[java] view plain copy print?
  1. package com.test.util.alipay;  
  2. import java.io.UnsupportedEncodingException;  
  3. import java.security.MessageDigest;  
  4. import java.security.NoSuchAlgorithmException;  
  5. import com.test.constants.AlipayConfig;  
  6. /** 
  7. * 功能:支付寶MD5加密處理核心檔案,不需要修改 
  8. * 版本:3.1 
  9. * 修改日期:2010-11-01 
  10. * 說明: 
  11. * 以下程式碼只是為了方便商戶測試而提供的樣例程式碼,商戶可以根據自己網站的需要,按照技術文件編寫,並非一定要使用該程式碼。 
  12. * 該程式碼僅供學習和研究支付寶介面使用,只是提供一個 
  13. * */
  14. publicclass Md5Encrypt {  
  15.     /** 
  16.      * Used building output as Hex 
  17.      */
  18.     privatestaticfinalchar[] DIGITS = { '0''1''2''3''4''5''6',  
  19.             '7''8''9''a''b''c''d''e''f' };  
  20.     /** 
  21.      * 對字串進行MD5加密 
  22.      * 
  23.      * @param text 
  24.      *            明文 
  25.      * 
  26.      * @return 密文 
  27.      */
  28.     publicstatic String md5(String text) {  
  29.         MessageDigest msgDigest = null;  
  30.         try {  
  31.             msgDigest = MessageDigest.getInstance("MD5");  
  32.         } catch (NoSuchAlgorithmException e) {  
  33.             thrownew IllegalStateException(  
  34.                     "System doesn't support MD5 algorithm.");  
  35.         }  
  36.         try {  
  37.             msgDigest.update(text.getBytes(AlipayConfig.input_charset));    //注意改介面是按照指定編碼形式簽名
  38.         } catch (UnsupportedEncodingException e) {  
  39.             thrownew IllegalStateException(  
  40.                     "System doesn't support your  EncodingException.");  
  41.         }  
  42.         byte[] bytes = msgDigest.digest();  
  43.         String md5Str = new String(encodeHex(bytes));  
  44.         return md5Str;  
  45.     }  
  46.     publicstaticchar[] encodeHex(byte[] data) {  
  47.         int l = data.length;  
  48.         char[] out = newchar[l << 1];  
  49.         // two characters form the hex value.
  50.         for (int i = 0, j = 0; i < l; i++) {  
  51.             out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];  
  52.             out[j++] = DIGITS[0x0F & data[i]];  
  53.         }  
  54.         return out;  
  55.     }  
  56. }  
package com.test.util.alipay;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import com.test.constants.AlipayConfig;

/**
* 功能:支付寶MD5加密處理核心檔案,不需要修改
* 版本:3.1
* 修改日期:2010-11-01
* 說明:
* 以下程式碼只是為了方便商戶測試而提供的樣例程式碼,商戶可以根據自己網站的需要,按照技術文件編寫,並非一定要使用該程式碼。
* 該程式碼僅供學習和研究支付寶介面使用,只是提供一個
* */

public class Md5Encrypt {
    /**
     * Used building output as Hex
     */
    private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6',
            '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

    /**
     * 對字串進行MD5加密
     *
     * @param text
     *            明文
     *
     * @return 密文
     */
    public static String md5(String text) {
        MessageDigest msgDigest = null;

        try {
            msgDigest = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            throw new IllegalStateException(
                    "System doesn't support MD5 algorithm.");
        }

        try {
            msgDigest.update(text.getBytes(AlipayConfig.input_charset));    //注意改介面是按照指定編碼形式簽名
 
        } catch (UnsupportedEncodingException e) {

            throw new IllegalStateException(
                    "System doesn't support your  EncodingException.");

        }

        byte[] bytes = msgDigest.digest();

        String md5Str = new String(encodeHex(bytes));

        return md5Str;
    }

    public static char[] encodeHex(byte[] data) {

        int l = data.length;

        char[] out = new char[l << 1];

        // two characters form the hex value.
        for (int i = 0, j = 0; i < l; i++) {
            out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];
            out[j++] = DIGITS[0x0F & data[i]];
        }

        return out;
    }

}



======================================================================================================
AlipayConfig.java這裡是對賬號,Key,回撥連線地址等一些設定
[java] view plain copy print?
  1. package com.test.constants;  
  2. import java.util.Properties;  
  3. import com.test.util.PropertiesUtil;  
  4. publicclass AlipayConfig {  
  5.     privatestatic AlipayConfig  alconfig = null;  
  6.     private AlipayConfig(){  
  7.     }  
  8.      publicstatic AlipayConfig getInstance(){  
  9.         if(alconfig==null){  
  10.             alconfig = new AlipayConfig();  
  11.         }  
  12.         return alconfig;  
  13.     }  
  14.     // 如何獲取安全校驗碼和合作身份者ID
  15.     // 1.訪問支付寶商戶服務中心(b.alipay.com),然後用您的簽約支付寶賬號登陸.
  16.     // 2.訪問“技術服務”→“下載技術整合文件”(https://b.alipay.com/support/helperApply.htm?action=selfIntegration)
  17.     // 3.在“自助整合幫助”中,點選“合作者身份(Partner ID)查詢”、“安全校驗碼(Key)查詢”
  18.     // ↓↓↓↓↓↓↓↓↓↓請在這裡配置您的基本資訊↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
  19.     // 合作身份者ID,以2088開頭由16位純數字組成的字串
  20.     publicstatic String it_b_pay = "1h";  
  21.     publicstatic String partner = "2088601003079118";  
  22.     publicstatic String service = "create_direct_pay_by_user";  
  23.     // 交易安全檢驗碼,由數字和字母組成的32位字串    
  24.     publicstatic String key = "zxcdvxgksaam2zjrmv5cv0p4jqesaioh";  
  25.     // 簽約支付寶賬號或賣家收款支付寶帳戶
  26.     publicstatic String seller_email = "[email protected]";  
  27.     // 讀配置檔案
  28.     // notify_url 交易過程中伺服器通知的頁面 要用 http://格式的完整路徑,不允許加?id=123這類自定義引數
  29.      publicstatic String notify_url ="http:www.xxx.com/projectName/alipayTrade.action";  
  30.     // 付完款後跳轉的頁面 要用 http://格式的完整路徑,不允許加?id=123這類自定義引數
  31.     // return_url的域