支付宝第三方接口对接(JAVA语言)

这是一个关于如何使用Java实现支付宝第三方接口对接的博客。主要内容包括生成签名、过滤空值和签名参数、数组排序及拼接、防钓鱼时间戳查询、远程服务器响应验证等功能的详细代码实现。
摘要由CSDN通过智能技术生成
alipay 的几个内核功能文件:
======================================================================================================
AlipayFunction.java
[java]  view plain  copy
  1. package com.test.util.alipay;  
  2.   
  3.   
  4. import java.io.FileWriter;  
  5. import java.io.IOException;  
  6. import java.net.MalformedURLException;  
  7. import java.net.URL;  
  8. import java.util.ArrayList;  
  9. import java.util.Collections;  
  10. import java.util.HashMap;  
  11. import java.util.List;  
  12. import java.util.Map;  
  13.   
  14. import org.dom4j.Document;  
  15. import org.dom4j.DocumentException;  
  16. import org.dom4j.Node;  
  17. import org.dom4j.io.SAXReader;  
  18.   
  19.   
  20.   
  21.   
  22. public class AlipayFunction {  
  23.     /** 
  24.      * 功能:生成签名结果 
  25.      * @param sArray 要签名的数组 
  26.      * @param key 安全校验码 
  27.      * @return 签名结果字符串 
  28.      */  
  29.     public static String BuildMysign(Map sArray, String key) {  
  30.         String prestr = CreateLinkString(sArray);  //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串  
  31.         prestr = prestr + key;                     //把拼接后的字符串再与安全校验码直接连接起来  
  32.         String mysign = Md5Encrypt.md5(prestr);  
  33.         return mysign;  
  34.     }  
  35.       
  36.     /** 
  37.      * 功能:除去数组中的空值和签名参数 
  38.      * @param sArray 签名参数组 
  39.      * @return 去掉空值与签名参数后的新签名参数组 
  40.      */  
  41.     public static Map ParaFilter(Map sArray){  
  42.         List keys = new ArrayList(sArray.keySet());  
  43.         Map sArrayNew = new HashMap();  
  44.           
  45.         for(int i = 0; i < keys.size(); i++){  
  46.             String key = (String) keys.get(i);  
  47.             String value = (String) sArray.get(key);  
  48.               
  49.             if( value == null || value.equals("") ||  
  50.                     key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type")){  
  51.                 continue;  
  52.             }  
  53.               
  54.             sArrayNew.put(key, value);  
  55.         }  
  56.           
  57.         return sArrayNew;  
  58.     }  
  59.       
  60.     /** 
  61.      * 功能:把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串 
  62.      * @param params 需要排序并参与字符拼接的参数组 
  63.      * @return 拼接后字符串 
  64.      */  
  65.     public static String CreateLinkString(Map params){  
  66.         List keys = new ArrayList(params.keySet());  
  67.         Collections.sort(keys);  
  68.   
  69.         String prestr = "";  
  70.   
  71.         for (int i = 0; i < keys.size(); i++) {  
  72.             String key = (String) keys.get(i);  
  73.             String value = (String) params.get(key);  
  74.   
  75.             if (i == keys.size() - 1) { //拼接时,不包括最后一个&字符  
  76.                 prestr = prestr + key + "=" + value;  
  77.             } else {  
  78.                 prestr = prestr + key + "=" + value + "&";  
  79.             }  
  80.         }  
  81.   
  82.         return prestr;  
  83.     }  
  84.       
  85.     /** 
  86.      * 功能:写日志,方便测试(看网站需求,也可以改成把记录存入数据库) 
  87.      * @param sWord 要写入日志里的文本内容 
  88.      */  
  89.     public static void LogResult(String sWord){  
  90.         // 该文件存在于和应用服务器 启动文件同一目录下,文件名是alipay log加服务器时间  
  91.         try {  
  92.             FileWriter writer = new FileWriter("D:\\alipay_log" + System.currentTimeMillis() + ".txt");  
  93.             writer.write(sWord);  
  94.             writer.close();  
  95.         } catch (Exception e) {  
  96.             e.printStackTrace();  
  97.         }  
  98.     }  
  99.       
  100.     /** 
  101.      * 功能:用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数 
  102.      * 注意:远程解析XML出错,与服务器是否支持SSL等配置有关 
  103.      * @param partner 合作身份者ID 
  104.      * @return 时间戳字符串 
  105.      * @throws IOException 
  106.      * @throws DocumentException 
  107.      * @throws MalformedURLException 
  108.      */  
  109.       
  110.     public static String query_timestamp(String partner)  
  111.             throws MalformedURLException, DocumentException, IOException {  
  112.         String strUrl = "https://mapi.alipay.com/gateway.do?service=query_timestamp&partner="+partner;  
  113.         StringBuffer buf1 = new StringBuffer();  
  114.         SAXReader reader = new SAXReader();  
  115.         Document doc = reader.read(new URL(strUrl).openStream());  
  116.           
  117.         List<Node> nodeList = doc.selectNodes("//alipay/*");  
  118.           
  119.         for (Node node : nodeList) {  
  120.             // 截取部分不需要解析的信息  
  121.             if (node.getName().equals("is_success")  
  122.                     && node.getText().equals("T")) {  
  123.                 // 判断是否有成功标示  
  124.                 List<Node> nodeList1 = doc.selectNodes("//response/timestamp/*");  
  125.                 for (Node node1 : nodeList1) {  
  126.                     buf1.append(node1.getText());  
  127.                 }  
  128.             }  
  129.         }  
  130.           
  131.         return buf1.toString();  
  132.     }  
  133. }  
[java]  view plain   copy
  1. package com.test.util.alipay;  
  2.   
  3.   
  4. import java.io.FileWriter;  
  5. import java.io.IOException;  
  6. import java.net.MalformedURLException;  
  7. import java.net.URL;  
  8. import java.util.ArrayList;  
  9. import java.util.Collections;  
  10. import java.util.HashMap;  
  11. import java.util.List;  
  12. import java.util.Map;  
  13.   
  14. import org.dom4j.Document;  
  15. import org.dom4j.DocumentException;  
  16. import org.dom4j.Node;  
  17. import org.dom4j.io.SAXReader;  
  18.   
  19.   
  20.   
  21.   
  22. public class AlipayFunction {  
  23.     /** 
  24.      * 功能:生成签名结果 
  25.      * @param sArray 要签名的数组 
  26.      * @param key 安全校验码 
  27.      * @return 签名结果字符串 
  28.      */  
  29.     public static String BuildMysign(Map sArray, String key) {  
  30.         String prestr = CreateLinkString(sArray);  //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串  
  31.         prestr = prestr + key;                     //把拼接后的字符串再与安全校验码直接连接起来  
  32.         String mysign = Md5Encrypt.md5(prestr);  
  33.         return mysign;  
  34.     }  
  35.       
  36.     /** 
  37.      * 功能:除去数组中的空值和签名参数 
  38.      * @param sArray 签名参数组 
  39.      * @return 去掉空值与签名参数后的新签名参数组 
  40.      */  
  41.     public static Map ParaFilter(Map sArray){  
  42.         List keys = new ArrayList(sArray.keySet());  
  43.         Map sArrayNew = new HashMap();  
  44.           
  45.         for(int i = 0; i < keys.size(); i++){  
  46.             String key = (String) keys.get(i);  
  47.             String value = (String) sArray.get(key);  
  48.               
  49.             if( value == null || value.equals("") ||  
  50.                     key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type")){  
  51.                 continue;  
  52.             }  
  53.               
  54.             sArrayNew.put(key, value);  
  55.         }  
  56.           
  57.         return sArrayNew;  
  58.     }  
  59.       
  60.     /** 
  61.      * 功能:把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串 
  62.      * @param params 需要排序并参与字符拼接的参数组 
  63.      * @return 拼接后字符串 
  64.      */  
  65.     public static String CreateLinkString(Map params){  
  66.         List keys = new ArrayList(params.keySet());  
  67.         Collections.sort(keys);  
  68.   
  69.         String prestr = "";  
  70.   
  71.         for (int i = 0; i < keys.size(); i++) {  
  72.             String key = (String) keys.get(i);  
  73.             String value = (String) params.get(key);  
  74.   
  75.             if (i == keys.size() - 1) { //拼接时,不包括最后一个&字符  
  76.                 prestr = prestr + key + "=" + value;  
  77.             } else {  
  78.                 prestr = prestr + key + "=" + value + "&";  
  79.             }  
  80.         }  
  81.   
  82.         return prestr;  
  83.     }  
  84.       
  85.     /** 
  86.      * 功能:写日志,方便测试(看网站需求,也可以改成把记录存入数据库) 
  87.      * @param sWord 要写入日志里的文本内容 
  88.      */  
  89.     public static void LogResult(String sWord){  
  90.         // 该文件存在于和应用服务器 启动文件同一目录下,文件名是alipay log加服务器时间  
  91.         try {  
  92.             FileWriter writer = new FileWriter("D:\\alipay_log" + System.currentTimeMillis() + ".txt");  
  93.             writer.write(sWord);  
  94.             writer.close();  
  95.         } catch (Exception e) {  
  96.             e.printStackTrace();  
  97.         }  
  98.     }  
  99.       
  100.     /** 
  101.      * 功能:用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数 
  102.      * 注意:远程解析XML出错,与服务器是否支持SSL等配置有关 
  103.      * @param partner 合作身份者ID 
  104.      * @return 时间戳字符串 
  105.      * @throws IOException 
  106.      * @throws DocumentException 
  107.      * @throws MalformedURLException 
  108.      */  
  109.       
  110.     public static String query_timestamp(String partner)  
  111.             throws MalformedURLException, DocumentException, IOException {  
  112.         String strUrl = "https://mapi.alipay.com/gateway.do?service=query_timestamp&partner="+partner;  
  113.         StringBuffer buf1 = new StringBuffer();  
  114.         SAXReader reader = new SAXReader();  
  115.         Document doc = reader.read(new URL(strUrl).openStream());  
  116.           
  117.         List<Node> nodeList = doc.selectNodes("//alipay/*");  
  118.           
  119.         for (Node node : nodeList) {  
  120.             // 截取部分不需要解析的信息  
  121.             if (node.getName().equals("is_success")  
  122.                     && node.getText().equals("T")) {  
  123.                 // 判断是否有成功标示  
  124.                 List<Node> nodeList1 = doc.selectNodes("//response/timestamp/*");  
  125.                 for (Node node1 : nodeList1) {  
  126.                     buf1.append(node1.getText());  
  127.                 }  
  128.             }  
  129.         }  
  130.           
  131.         return buf1.toString();  
  132.     }  
  133. }  




======================================================================================================
AlipayNotify.java
[java]  view plain  copy
  1. package com.test.util.alipay;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.InputStreamReader;  
  5. import java.net.HttpURLConnection;  
  6. import java.net.URL;  
  7. import java.util.Map;  
  8.   
  9. import com.test.constants.AlipayConfig;  
  10.   
  11.   
  12. public class AlipayNotify {  
  13.     /** 
  14.      * *功能:根据反馈回来的信息,生成签名结果 
  15.      * @param Params 通知返回来的参数数组 
  16.      * @param key 安全校验码 
  17.      * @return 生成的签名结果 
  18.      */  
  19.     public static String GetMysign(Map Params, String key){  
  20.         Map sParaNew = AlipayFunction.ParaFilter(Params);//过滤空值、sign与sign_type参数  
  21.         String mysign = AlipayFunction.BuildMysign(sParaNew, key);//获得签名结果  
  22.           
  23.         return mysign;  
  24.     }  
  25.       
  26.     /** 
  27.     * *功能:获取远程服务器ATN结果,验证返回URL 
  28.     * @param notify_id 通知校验ID 
  29.     * @return 服务器ATN结果 
  30.     * 验证结果集: 
  31.     * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 
  32.     * true 返回正确信息 
  33.     * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟 
  34.     */  
  35.     public static String Verify(String notify_id){  
  36.         //获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求  
  37.         String transport = AlipayConfig.transport;  
  38.         String partner = AlipayConfig.partner;  
  39.         String veryfy_url = "";  
  40.         if(transport.equalsIgnoreCase("https")){  
  41.             veryfy_url = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify";  
  42.         } else{  
  43.             veryfy_url = "http://notify.alipay.com/trade/notify_query.do?";  
  44.         }  
  45.         veryfy_url = veryfy_url + "&partner=" + partner + "¬ify_id=" + notify_id;  
  46.           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值