java支付宝支付文档(含代码)_第1页
java支付宝支付文档(含代码)_第2页
java支付宝支付文档(含代码)_第3页
java支付宝支付文档(含代码)_第4页
java支付宝支付文档(含代码)_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java版支付宝支付功能Java版支付宝支付功能整理文档2一、 引用文件21、基础配置类:AlipayConfig.java22、支付宝MD5签名处理核心文件:MD5.java43、支付宝接口公用函数类:AlipayCore.java54、支付宝通知处理类:AlipayNotify.java95、支付宝各接口请求提交类:AlipaySubmit.java126.自定义订单类:UtilDate.java167.HttpClient方式访问:HttpProtocolHandler.java178、Http请求对象的封装:HttpRequest.java239、 Http返回对象的封装:HttpRe

2、sponse.java2710、表示Http返回的结果字符方式:HttpResultType.java29二、Controller处理方法301、支付宝PC端支付(即时到账)30(1、)支付方法30(2、)支付成功后的同步调用31(4、)支付成功后的异步调用332、 支付宝手机网页支付35(1、)支付方法35(2、)支付成功后的同步调用37(4、) 支付成功后的异步调用37三、 页面代码371、 跳转页面 :alipay.jsp和alipaywap.jsp372、 同步调用页面:return_url.jsp383、 异步调用页面:notify_url.jsp38第 68 页2017-03-15

3、 Lock-玄清Java版支付宝支付功能整理文档作者:Lock-玄清时间:2017-03-15注:此文档只支持付款,没有退款的功能1、 引用文件1、基础配置类:AlipayConfig.javapackage com.alipay.config;/* * *类名:AlipayConfig *功能:基础配置类 *详细:设置帐户有关信息及返回路径 *版本:3.4 *修改日期:2016-03-08 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */public

4、class AlipayConfig /请在这里配置您的基本信息/ 合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:public static String partner = ""/ 收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号public static String seller_id = partner;/ MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址: public static String key = "" /-pc端支付宝返回路径- / 服务器异步

5、通知页面路径 需http:/格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String notify_url = ""/ 页面跳转同步通知页面路径 需http:/格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String return_url = ""/ 签名方式public static String sign_type = "MD5"/ 调试用,创建TXT日志文件夹路径,见AlipayCore.java类中的logResul

6、t(String sWord)打印方法。public static String log_path = "C:"/ 字符编码格式 目前支持 gbk 或 utf-8public static String input_charset = "utf-8"/ 支付类型 ,无需修改public static String payment_type = "1"/-pc端支付宝调用接口- / 调用的接口名,无需修改public static String service = "create_direct_pay_by_user"

7、;/-手机端支付宝调用接口- public static String wap_service = "alipay.wap.create.direct.pay.by.user"/请在这里配置您的基本信息/ 请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 / 防钓鱼时间戳 若要使用请调用类文件submit中的query_timestamp函数public static String anti_phishing_key = ""/ 客户端的IP地址 非局域网的外网IP地址,如:public static String exter_i

8、nvoke_ip = ""/请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 2、支付宝MD5签名处理核心文件:MD5.javapackage com.alipay.sign;import java.io.UnsupportedEncodingException;import java.security.SignatureException;import mons.codec.digest.DigestUtils;/* * 功能:支付宝MD5签名处理核心文件,不需要修改* 版本:3.3* 修改日期:2012-08-17* 说明:* 以下代码只是为了方便商户测试而提供的

9、样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。* 该代码仅供学习和研究支付宝接口使用,只是提供一个* */public class MD5 /* * 签名字符串 * param text 需要签名的字符串 * param key 密钥 * param input_charset 编码格式 * return 签名结果 */ public static String sign(String text, String key, String input_charset) text = text + key; return DigestUtils.md5Hex(getC

10、ontentBytes(text, input_charset); /* * 签名字符串 * param text 需要签名的字符串 * param sign 签名结果 * param key 密钥 * param input_charset 编码格式 * return 签名结果 */ public static boolean verify(String text, String sign, String key, String input_charset) text = text + key; String mysign = DigestUtils.md5Hex(getContentByt

11、es(text, input_charset); if(mysign.equals(sign) return true; else return false; /* * param content * param charset * return * throws SignatureException * throws UnsupportedEncodingException */ private static byte getContentBytes(String content, String charset) if (charset = null | "".equal

12、s(charset) return content.getBytes(); try return content.getBytes(charset); catch (UnsupportedEncodingException e) throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset); 3、支付宝接口公用函数类:AlipayCore.javapackage com.alipay.util;import java.io.File;import java.io.FileWriter;im

13、port java.io.IOException;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import mons.codec.digest.DigestUtils;import mons.httpclient.methods.multipart.FilePartSource;import mons.httpclient.methods.multipart.PartSource;import

14、 com.alipay.config.AlipayConfig;/* * *类名:AlipayFunction *功能:支付宝接口公用函数类 *详细:该类是请求、通知返回两个文件所调用的公用函数核心处理文件,不需要修改 *版本:3.3 *日期:2012-08-14 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */public class AlipayCore /* * 除去数组中的空值和签名参数 * param sArray 签名参数组 * return

15、 去掉空值与签名参数后的新签名参数组 */ public static Map<String, String> paraFilter(Map<String, String> sArray) Map<String, String> result = new HashMap<String, String>(); if (sArray = null | sArray.size() <= 0) return result; for (String key : sArray.keySet() String value = sArray.get(key

16、); if (value = null | value.equals("") | key.equalsIgnoreCase("sign") | key.equalsIgnoreCase("sign_type") continue; result.put(key, value); return result; /* * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串 * param params 需要排序并参与字符拼接的参数组 * return 拼接后字符串 */ public static Strin

17、g createLinkString(Map<String, String> params) List<String> keys = new ArrayList<String>(params.keySet(); Collections.sort(keys); String prestr = "" for (int i = 0; i < keys.size(); i+) String key = keys.get(i); String value = params.get(key); if (i = keys.size() - 1)

18、/拼接时,不包括最后一个&字符 prestr = prestr + key + "=" + value; else prestr = prestr + key + "=" + value + "&" return prestr; /* * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库) * param sWord 要写入日志里的文本内容 */ public static void logResult(String sWord) FileWriter writer = null; try writer = n

19、ew FileWriter(AlipayConfig.log_path + "alipay_log_" + System.currentTimeMillis()+".txt"); writer.write(sWord); catch (Exception e) e.printStackTrace(); finally if (writer != null) try writer.close(); catch (IOException e) e.printStackTrace(); /* * 生成文件摘要 * param strFilePath 文件路径

20、* param file_digest_type 摘要算法 * return 文件摘要结果 */ public static String getAbstract(String strFilePath, String file_digest_type) throws IOException PartSource file = new FilePartSource(new File(strFilePath); if(file_digest_type.equals("MD5") return DigestUtils.md5Hex(file.createInputStream()

21、; else if(file_digest_type.equals("SHA") return DigestUtils.sha256Hex(file.createInputStream(); else return "" 4、支付宝通知处理类:AlipayNotify.javapackage com.alipay.util;import java.io.BufferedReader;import java.io.InputStreamReader;import .HttpURLConnection;import .URL;import java.util

22、.Map;import com.alipay.config.AlipayConfig;import com.alipay.sign.MD5;/* * *类名:AlipayNotify *功能:支付宝通知处理类 *详细:处理支付宝各接口通知返回 *版本:3.3 *日期:2012-08-17 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考 *注意* *调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常 */public class

23、AlipayNotify /* * 支付宝消息验证地址 */ private static final String HTTPS_VERIFY_URL = " /* * 验证消息是否是支付宝发出的合法消息 * param params 通知返回来的参数数组 * return 验证结果 */ public static boolean verify(Map<String, String> params) /判断responsetTxt是否为true,isSign是否为true /responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id

24、一分钟失效有关 /isSign不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关 String responseTxt = "false"if(params.get("notify_id") != null) String notify_id = params.get("notify_id");responseTxt = verifyResponse(notify_id); String sign = "" if(params.get("sign") != null

25、) sign = params.get("sign"); boolean isSign = getSignVeryfy(params, sign); /写日志记录(若要调试,请取消下面两行注释) /String sWord = "responseTxt=" + responseTxt + "n isSign=" + isSign + "n 返回回来的参数:" + AlipayCore.createLinkString(params); /AlipayCore.logResult(sWord); if (isSign

26、 && responseTxt.equals("true") return true; else return false; /* * 根据反馈回来的信息,生成签名结果 * param Params 通知返回来的参数数组 * param sign 比对的签名结果 * return 生成的签名结果 */private static boolean getSignVeryfy(Map<String, String> Params, String sign) /过滤空值、sign与sign_type参数 Map<String, String>

27、; sParaNew = AlipayCore.paraFilter(Params); /获取待签名字符串 String preSignStr = AlipayCore.createLinkString(sParaNew); /获得签名验证结果 boolean isSign = false; if(AlipayConfig.sign_type.equals("MD5") ) isSign = MD5.verify(preSignStr, sign, AlipayConfig.key, AlipayConfig.input_charset); return isSign; /

28、* * 获取远程服务器ATN结果,验证返回URL * param notify_id 通知校验ID * return 服务器ATN结果 * 验证结果集: * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 * true 返回正确信息 * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟 */ private static String verifyResponse(String notify_id) /获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求 String partner = AlipayConfig.par

29、tner; String veryfy_url = HTTPS_VERIFY_URL + "partner=" + partner + "&notify_id=" + notify_id; return checkUrl(veryfy_url); /* * 获取远程服务器ATN结果 * param urlvalue 指定URL路径地址 * return 服务器ATN结果 * 验证结果集: * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 * true 返回正确信息 * false 请检查防火墙或者是服务

30、器阻止端口问题以及验证时间是否超过一分钟 */ private 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 .getInputStr

31、eam(); inputLine = in.readLine().toString(); catch (Exception e) e.printStackTrace(); inputLine = "" return inputLine; 5、支付宝各接口请求提交类:AlipaySubmit.javapackage com.alipay.util;import java.io.IOException;import .MalformedURLException;import .URL;import java.util.ArrayList;import java.util.Lis

32、t;import java.util.Map;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Node;import org.dom4j.io.SAXReader;import com.alipay.config.AlipayConfig;import com.alipay.sign.MD5;/* * *类名:AlipaySubmit *功能:支付宝各接口请求提交类 *详细:构造支付宝各接口表单HTML文本,获取远程HTTP数据 *版本:3.3 *日期:2012-08-13 *说明: *

33、以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */public class AlipaySubmit /* * 支付宝提供给商户的服务接入网关URL(新) */ private static final String ALIPAY_GATEWAY_NEW = " /* * 生成签名结果 * param sPara 要签名的数组 * return 签名结果字符串 */public static String buildRequestMysign(Map<

34、String, String> sPara) String prestr = AlipayCore.createLinkString(sPara); /把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 String mysign = "" if(AlipayConfig.sign_type.equals("MD5") ) mysign = MD5.sign(prestr, AlipayConfig.key, AlipayConfig.input_charset); return mysign; /* * 生成要请求给支付宝

35、的参数数组 * param sParaTemp 请求前的参数数组 * return 要请求的参数数组 */ private static Map<String, String> buildRequestPara(Map<String, String> sParaTemp) /除去数组中的空值和签名参数 Map<String, String> sPara = AlipayCore.paraFilter(sParaTemp); /生成签名结果 String mysign = buildRequestMysign(sPara); /签名结果与签名方式加入请求提交参

36、数组中 sPara.put("sign", mysign); sPara.put("sign_type", AlipayConfig.sign_type); return sPara; /* * 建立请求,以表单HTML形式构造(默认) * param sParaTemp 请求参数数组 * param strMethod 提交方式。两个值可选:post、get * param strButtonName 确认按钮显示文字 * return 提交表单HTML文本 */ public static String buildRequest(Map<Str

37、ing, String> sParaTemp, String strMethod, String strButtonName) /待请求参数数组 Map<String, String> sPara = buildRequestPara(sParaTemp); List<String> keys = new ArrayList<String>(sPara.keySet(); StringBuffer sbHtml = new StringBuffer(); sbHtml.append("<form id="alipaysubmi

38、t" name="alipaysubmit" action="" + ALIPAY_GATEWAY_NEW + "_input_charset=" + AlipayConfig.input_charset + "" method="" + strMethod + "">"); for (int i = 0; i < keys.size(); i+) String name = (String) keys.get(i); String value

39、 = (String) sPara.get(name); sbHtml.append("<input type="hidden" name="" + name + "" value="" + value + ""/>"); /submit按钮控件请不要含有name属性 sbHtml.append("<input type="submit" value="" + strButtonName + "&q

40、uot; style="display:none;"></form>"); sbHtml.append("<script>document.forms'alipaysubmit'.submit();</script>"); return sbHtml.toString(); /* * 用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数 * 注意:远程解析XML出错,与服务器是否支持SSL等配置有关 * return 时间戳字符串 * throws IOExcepti

41、on * throws DocumentException * throws MalformedURLException */public static String query_timestamp() throws MalformedURLException, DocumentException, IOException /构造访问query_timestamp接口的URL串 String strUrl = ALIPAY_GATEWAY_NEW + "service=query_timestamp&partner=" + AlipayConfig.partner

42、+ "&_input_charset" +AlipayConfig.input_charset; StringBuffer result = new StringBuffer(); SAXReader reader = new SAXReader(); Document doc = reader.read(new URL(strUrl).openStream(); List<Node> nodeList = doc.selectNodes("/alipay/*"); for (Node node : nodeList) / 截取部分不

43、需要解析的信息 if (node.getName().equals("is_success") && node.getText().equals("T") / 判断是否有成功标示 List<Node> nodeList1 = doc.selectNodes("/response/timestamp/*"); for (Node node1 : nodeList1) result.append(node1.getText(); return result.toString(); 6.自定义订单类:UtilDa

44、te.javapackage com.alipay.util;import java.util.Date;import java.util.Random;import java.text.SimpleDateFormat;import java.text.DateFormat;/* * *类名:UtilDate *功能:自定义订单类 *详细:工具类,可以用作获取系统日期、订单编号等 *版本:3.3 *日期:2012-08-17 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只

45、是提供一个参考。 */public class UtilDate /* 年月日时分秒(无下划线) yyyyMMddHHmmss */ public static final String dtLong = "yyyyMMddHHmmss" /* 完整时间 yyyy-MM-dd HH:mm:ss */ public static final String simple = "yyyy-MM-dd HH:mm:ss" /* 年月日(无下划线) yyyyMMdd */ public static final String dtShort = "yyy

46、yMMdd" /* * 返回系统当前时间(精确到毫秒),作为一个唯一的订单编号 * return * 以yyyyMMddHHmmss为格式的当前系统时间 */public static String getOrderNum()Date date=new Date();DateFormat df=new SimpleDateFormat(dtLong);return df.format(date);/* * 获取系统当前日期(精确到毫秒),格式:yyyy-MM-dd HH:mm:ss * return */public static String getDateFormatter()D

47、ate date=new Date();DateFormat df=new SimpleDateFormat(simple);return df.format(date);/* * 获取系统当期年月日(精确到天),格式:yyyyMMdd * return */public static String getDate()Date date=new Date();DateFormat df=new SimpleDateFormat(dtShort);return df.format(date);/* * 产生随机的三位数 * return */public static String getThree()Random rad=new Random();return rad.nextInt(1000)+""7.HttpClient方式访问:HttpProtocolHandler.javapackage com.alipay.util.httpClient;import mons.httpclient.HttpException;import java.io.IOException;import .UnknownHostException;import mons.httpclient.HttpClien

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论