Java版支付宝支付功能整理文档 (2)
一、引用文件 (2)
1、基础配置类:AlipayConfig.java (2)
2、支付宝MD5签名处理核心文件:MD5.java (3)
3、支付宝接口公用函数类:AlipayCore.java (5)
4、支付宝通知处理类:AlipayNotify.java (8)
5、支付宝各接口请求提交类:AlipaySubmit.java (12)
6.自定义订单类:UtilDate.java (15)
7.HttpClient方式访问:HttpProtocolHandler.java (17)
8、Http请求对象的封装:HttpRequest.java (23)
9、Http返回对象的封装:HttpResponse.java (26)
10、表示Http返回的结果字符方式:HttpResultType.java (28)
二、Controller处理方法 (29)
1、支付宝PC端支付(即时到账) (29)
(1、)支付方法 (29)
(2、)支付成功后的同步调用 (30)
(4、)支付成功后的异步调用 (32)
2、支付宝手机网页支付 (34)
(1、)支付方法 (34)
(2、)支付成功后的同步调用 (36)
(4、) 支付成功后的异步调用 (36)
三、页面代码 (36)
1、跳转页面:alipay.jsp和alipaywap.jsp (36)
2、同步调用页面:return_url.jsp (37)
3、异步调用页面:notify_url.jsp (37)
Java版支付宝支付功能整理文档
作者:Lock-玄清
时间:2017-03-15
注:此文档只支持付款,没有退款的功能
一、引用文件
1、基础配置类:AlipayConfig.java
package com.alipay.config;
/* *
*类名:AlipayConfig
*功能:基础配置类
*详细:设置帐户有关信息及返回路径
*版本:3.4
*修改日期:2016-03-08
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
publicclass AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://https://www.wendangku.net/doc/1b12862869.html,/order/pidAndKey.htm
publicstatic String partner = "";
// 收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号
publicstatic String seller_id = partner;
// MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://https://www.wendangku.net/doc/1b12862869.html,/order/pidAndKey.htm
publicstatic String key = "";
//----------------pc端支付宝返回路径--------------------- // 服务器异步通知页面路径需http://格式的完整路径,不能
加?id=123这类自定义参数,必须外网可以正常访问
publicstatic String notify_url = "";
// 页面跳转同步通知页面路径需http://格式的完整路径,不能
加?id=123这类自定义参数,必须外网可以正常访问
publicstatic String return_url = "";
// 签名方式
publicstatic String sign_type = "MD5";
// 调试用,创建TXT日志文件夹路径,见AlipayCore.java类中的logResult(String sWord)打印方法。
publicstatic String log_path = "C:\\";
// 字符编码格式目前支持 gbk 或 utf-8
publicstatic String input_charset = "utf-8";
// 支付类型,无需修改
publicstatic String payment_type = "1";
//----------------pc端支付宝调用接口---------------------
// 调用的接口名,无需修改
publicstatic String service = "create_direct_pay_by_user";
//----------------手机端支付宝调用接口--------------------- publicstatic String wap_service =
"https://www.wendangku.net/doc/1b12862869.html,er";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//↓↓↓↓↓↓↓↓↓↓请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 防钓鱼时间戳若要使用请调用类文件submit中的query_timestamp 函数
publicstatic String anti_phishing_key = "";
// 客户端的IP地址非局域网的外网IP地址,如:221.0.0.1
publicstatic String exter_invoke_ip = "";
//↑↑↑↑↑↑↑↑↑↑请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
}
2、支付宝MD5签名处理核心文件:MD5.java
package com.alipay.sign;
import java.io.UnsupportedEncodingException;
import java.security.SignatureException;
import https://www.wendangku.net/doc/1b12862869.html,mons.codec.digest.DigestUtils;
/**
* 功能:支付宝MD5签名处理核心文件,不需要修改
* 版本:3.3
* 修改日期:2012-08-17
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
* 该代码仅供学习和研究支付宝接口使用,只是提供一个
* */
publicclass MD5 {
/**
* 签名字符串
* @param text 需要签名的字符串
* @param key 密钥
* @param input_charset 编码格式
* @return签名结果
*/
publicstatic String sign(String text, String key, String
input_charset) {
text = text + key;
return DigestUtils.md5Hex(getContentBytes(text,
input_charset));
}
/**
* 签名字符串
* @param text 需要签名的字符串
* @param sign 签名结果
* @param key 密钥
* @param input_charset 编码格式
* @return签名结果
*/
publicstaticboolean verify(String text, String sign, String key, String input_charset) {
text = text + key;
String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset));
if(mysign.equals(sign)) {
returntrue;
}
else {
returnfalse;
}
}
/**
* @param content
* @param charset
* @return
* @throws SignatureException
* @throws UnsupportedEncodingException
*/
privatestaticbyte[] getContentBytes(String content, String charset) {
if (charset == null || "".equals(charset)) {
return content.getBytes();
}
try {
return content.getBytes(charset);
} catch (UnsupportedEncodingException e) {
thrownew RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
}
}
}
3、支付宝接口公用函数类:AlipayCore.java
package com.alipay.util;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import https://www.wendangku.net/doc/1b12862869.html,mons.codec.digest.DigestUtils;
import
https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.methods.multipart.FilePartSource ;
import
https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.methods.multipart.PartSource; import com.alipay.config.AlipayConfig;
/* *
*类名:AlipayFunction
*功能:支付宝接口公用函数类
*详细:该类是请求、通知返回两个文件所调用的公用函数核心处理文件,不需要修改
*版本:3.3
*日期:2012-08-14
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
publicclass AlipayCore {
/**
* 除去数组中的空值和签名参数
* @param sArray 签名参数组
* @return去掉空值与签名参数后的新签名参数组
*/
publicstatic Map
Map
if (sArray == null || sArray.size() <= 0) {
return result;
}
for (String key : sArray.keySet()) {
String value = sArray.get(key);
if (value == null || value.equals("") ||
key.equalsIgnoreCase("sign")
|| key.equalsIgnoreCase("sign_type")) { continue;
}
result.put(key, value);
}
return result;
}
/**
* 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
* @param params 需要排序并参与字符拼接的参数组
* @return拼接后字符串
*/
publicstatic String createLinkString(Map
List
ArrayList
Collections.sort(keys);
String prestr = "";
for (int i = 0; i String key = keys.get(i); String value = params.get(key); if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符 prestr = prestr + key + "=" + value; } else { prestr = prestr + key + "=" + value + "&"; } } return prestr; } /** * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库) * @param sWord 要写入日志里的文本内容 */ publicstaticvoid logResult(String sWord) { FileWriter writer = null; try { writer = new 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 文件路径 * @param file_digest_type 摘要算法 * @return文件摘要结果 */ publicstatic 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()); } elseif(file_digest_type.equals("SHA")) { return DigestUtils.sha256Hex(file.createInputStream()); } else { return""; } } } 4、支付宝通知处理类:AlipayNotify.java package com.alipay.util; import java.io.BufferedReader; import java.io.InputStreamReader; import https://www.wendangku.net/doc/1b12862869.html,.HttpURLConnection; import https://www.wendangku.net/doc/1b12862869.html,.URL; import java.util.Map; import com.alipay.config.AlipayConfig; import com.alipay.sign.MD5; /* * *类名:AlipayNotify *功能:支付宝通知处理类 *详细:处理支付宝各接口通知返回 *版本:3.3 *日期:2012-08-17 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考 *************************注意************************* *调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常 */ publicclass AlipayNotify { /** * 支付宝消息验证地址 */ privatestaticfinal String HTTPS_VERIFY_URL = "https://https://www.wendangku.net/doc/1b12862869.html,/gateway.do?service=notify_verify&"; /** * 验证消息是否是支付宝发出的合法消息 * @param params 通知返回来的参数数组 * @return验证结果 */ publicstaticboolean verify(Map //判断responsetTxt是否为true,isSign是否为true //responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关 //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) {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&&responseTxt.equals("true")) { returntrue; } else { returnfalse; } } /** * 根据反馈回来的信息,生成签名结果 * @param Params 通知返回来的参数数组 * @param sign 比对的签名结果 * @return生成的签名结果 */ privatestaticboolean getSignVeryfy(Map //过滤空值、sign与sign_type参数 Map 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; } /** * 获取远程服务器ATN结果,验证返回URL * @param notify_id 通知校验ID * @return服务器ATN结果 * 验证结果集: * invalid命令参数不对出现这个错误,请检测返回处理中partner和key是否为空 * true 返回正确信息 * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟 */ privatestatic String verifyResponse(String notify_id) { //获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求 String partner = AlipayConfig.partner; String veryfy_url= HTTPS_VERIFY_URL+ "partner="+ partner + "¬ify_id=" + notify_id; return checkUrl(veryfy_url); } /** * 获取远程服务器ATN结果 * @param urlvalue 指定URL路径地址 * @return服务器ATN结果 * 验证结果集: * invalid命令参数不对出现这个错误,请检测返回处理中partner和key是否为空 * true 返回正确信息 * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟 */ privatestatic 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(); inputLine = ""; } return inputLine; } } 5、支付宝各接口请求提交类:AlipaySubmit.java package com.alipay.util; import java.io.IOException; import https://www.wendangku.net/doc/1b12862869.html,.MalformedURLException; import https://www.wendangku.net/doc/1b12862869.html,.URL; import java.util.ArrayList; 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; import com.alipay.config.AlipayConfig; import com.alipay.sign.MD5; /* * *类名:AlipaySubmit *功能:支付宝各接口请求提交类 *详细:构造支付宝各接口表单HTML文本,获取远程HTTP数据 *版本:3.3 *日期:2012-08-13 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */ publicclass AlipaySubmit { /** * 支付宝提供给商户的服务接入网关URL(新) */ privatestaticfinal String ALIPAY_GATEWAY_NEW = "https://https://www.wendangku.net/doc/1b12862869.html,/gateway.do?"; /** * 生成签名结果 * @param sPara 要签名的数组 * @return签名结果字符串 */ publicstatic String buildRequestMysign(Map 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; } /** * 生成要请求给支付宝的参数数组 * @param sParaTemp 请求前的参数数组 * @return要请求的参数数组 */ privatestatic Map //除去数组中的空值和签名参数 Map AlipayCore.paraFilter(sParaTemp); //生成签名结果 String mysign = buildRequestMysign(sPara); //签名结果与签名方式加入请求提交参数组中 sPara.put("sign", mysign); sPara.put("sign_type", AlipayConfig.sign_type); return sPara; } /** * 建立请求,以表单HTML形式构造(默认) * @param sParaTemp 请求参数数组 * @param strMethod 提交方式。两个值可选:post、get * @param strButtonName 确认按钮显示文字 * @return提交表单HTML文本 */ publicstatic String buildRequest(Map //待请求参数数组 Map sbHtml.append(" sbHtml.append(""); return sbHtml.toString(); } /** * 用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数 * 注意:远程解析XML出错,与服务器是否支持SSL等配置有关 * @return时间戳字符串 * @throws IOException * @throws DocumentException * @throws MalformedURLException */ publicstatic String query_timestamp() throws MalformedURLException, DocumentException, IOException { //构造访问query_timestamp接口的URL串 String strUrl = ALIPAY_GATEWAY_NEW + "service=query_timestamp&partner=" + AlipayConfig.partner + "&_input_charset" +AlipayConfig.input_charset; StringBuffer result = new StringBuffer(); SAXReader reader = new SAXReader(); Document doc= reader.read(new URL(strUrl).openStream()); List for (Node node : nodeList) { // 截取部分不需要解析的信息 if (node.getName().equals("is_success") &&node.getText().equals("T")) { // 判断是否有成功标示 List doc.selectNodes("//response/timestamp/*"); for (Node node1 : nodeList1) { result.append(node1.getText()); } } } return result.toString(); } } 6.自定义订单类:UtilDate.java package 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 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */ publicclass UtilDate { /** 年月日时分秒(无下划线) yyyyMMddHHmmss */ publicstaticfinal String dtLong = "yyyyMMddHHmmss"; /** 完整时间 yyyy-MM-dd HH:mm:ss */ publicstaticfinal String simple = "yyyy-MM-dd HH:mm:ss"; /** 年月日(无下划线) yyyyMMdd */ publicstaticfinal String dtShort = "yyyyMMdd"; /** * 返回系统当前时间(精确到毫秒),作为一个唯一的订单编号 * @return * 以yyyyMMddHHmmss为格式的当前系统时间 */ publicstatic String getOrderNum(){ Date date=new Date(); DateFormat df=new SimpleDateFormat(dtLong); return df.format(date); } /** * 获取系统当前日期(精确到毫秒),格式:yyyy-MM-dd HH:mm:ss * @return */ publicstatic String getDateFormatter(){ Date date=new Date(); DateFormat df=new SimpleDateFormat(simple); return df.format(date); } /** * 获取系统当期年月日(精确到天),格式:yyyyMMdd * @return */ publicstatic String getDate(){ Date date=new Date(); DateFormat df=new SimpleDateFormat(dtShort); return df.format(date); } /** * 产生随机的三位数 * @return */ publicstatic String getThree(){ Random rad=new Random(); return rad.nextInt(1000)+""; } } 7.HttpClient方式访问:HttpProtocolHandler.java package com.alipay.util.httpClient; import https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.HttpException; import java.io.IOException; import https://www.wendangku.net/doc/1b12862869.html,.UnknownHostException; import https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.HttpClient; import https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.HttpConnectionManager; import https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.HttpMethod; import https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.MultiThreadedHttpConnectionManag er; import https://www.wendangku.net/doc/1b12862869.html,ValuePair; import https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.methods.GetMethod; import https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.methods.PostMethod; import https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.util.IdleConnectionTimeoutThread ; import https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.methods.multipart.FilePart; import https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.methods.multipart.FilePartSource ; import https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.methods.multipart.MultipartReque stEntity; import https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.methods.multipart.Part; import https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.methods.multipart.StringPart; import https://www.wendangku.net/doc/1b12862869.html,mons.httpclient.params.HttpMethodParams; import java.io.File; import java.util.ArrayList; import java.util.List; /* * *类名:HttpProtocolHandler *功能:HttpClient方式访问 *详细:获取远程HTTP数据 *版本:3.3 *日期:2012-08-17 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */ publicclass HttpProtocolHandler { privatestatic String DEFAULT_CHARSET = "GBK"; /** 连接超时时间,由bean factory设置,缺省为8秒钟 */ privateint defaultConnectionTimeout = 8000; /** 回应超时时间, 由bean factory设置,缺省为30秒钟 */ privateint defaultSoTimeout = 30000; /** 闲置连接超时时间, 由bean factory设置,缺省为60秒钟 */ privateint defaultIdleConnTimeout = 60000; privateint defaultMaxConnPerHost = 30; privateint defaultMaxTotalConn = 80; /** 默认等待HttpConnectionManager返回连接超时(只有在达到最大连接数时起作用):1秒*/ privatestaticfinallong defaultHttpConnectionManagerTimeout = 3 * 1000; /** * HTTP连接管理器,该连接管理器必须是线程安全的. */ private HttpConnectionManager connectionManager; privatestatic HttpProtocolHandler httpProtocolHandler = new HttpProtocolHandler(); /** * 工厂方法 * * @return */ publicstatic HttpProtocolHandler getInstance() { return httpProtocolHandler; } /** * 私有的构造方法 */ private HttpProtocolHandler() { // 创建一个线程安全的HTTP连接池 connectionManager = new MultiThreadedHttpConnectionManager(); connectionManager.getParams().setDefaultMaxConnectionsPerHost( defaultMaxConnPerHost); connectionManager.getParams().setMaxTotalConnections(defaultMa xTotalConn); IdleConnectionTimeoutThread ict = new IdleConnectionTimeoutThread(); ict.addConnectionManager(connectionManager); ict.setConnectionTimeout(defaultIdleConnTimeout); ict.start(); } /** * 执行Http请求 * * @param request 请求数据 * @param strParaFileName 文件类型的参数名 * @param strFilePath 文件路径 * @return * @throws HttpException, IOException */ public HttpResponse execute(HttpRequest request, String strParaFileName, String strFilePath) throws HttpException, IOException { HttpClient httpclient = new HttpClient(connectionManager); // 设置连接超时 int connectionTimeout = defaultConnectionTimeout; if (request.getConnectionTimeout() > 0) { connectionTimeout = request.getConnectionTimeout(); } httpclient.getHttpConnectionManager().getParams().setConnectio nTimeout(connectionTimeout); // 设置回应超时 int soTimeout = defaultSoTimeout; if (request.getTimeout() > 0) { soTimeout = request.getTimeout(); } httpclient.getHttpConnectionManager().getParams().setSoTimeout (soTimeout); // 设置等待ConnectionManager释放connection的时间 httpclient.getParams().setConnectionManagerTimeout(defaultHttp ConnectionManagerTimeout); String charset = request.getCharset(); charset = charset == null ? DEFAULT_CHARSET : charset; HttpMethod method = null; //get模式且不带上传文件 if (request.getMethod().equals(HttpRequest.METHOD_GET)) { method = new GetMethod(request.getUrl()); method.getParams().setCredentialCharset(charset); // parseNotifyConfig会保证使用GET方法时,request一定使用QueryString method.setQueryString(request.getQueryString()); 在线支付技术设计文档 以下是关于支付宝接口的所有东西,包括支付宝接口需要的参数,一些通用规则、特殊用途等。 一.结构 a) 一般由两部分组成,接入部分与通知返回部分。接入部分即为传递参数等信息组合成超级链接,并用该链接来进行跳转。通知返回部分则是支付宝服务器对该笔订单处理完毕后,通知与返回该笔订单的详细信息到商户服务器,商户服务器接收到后,并对其进行数据处理。 b) 以实物标准双接口的程序为例。接入部分的页面文件包含:配置页alipayapi.jsp、程序入口页index.jsp、服务器异步通知页notify_url.jsp 以及页面跳转同步通知页return_url.jsp。通知返回部分的页面文件包含:基础配置类文件AlipayConfig.java、支付宝接口公用函数类文件AlipayCore.java、支付宝通知处理类AlipayNotify.java、支付宝各接口请求提交类文件AlipaySubmit.java、支付宝自定义订单类文件UtilDate.java、MD5签名类文件MD5.java、支付宝HttpClient处理类文件HttpProtocolHandler.java 、支付宝HttpClient 请求类文件、支付宝HttpClient返回类文件HttpResponse.java、支付宝HttpClient返回的结果字符方式类文件。这里大家可以一目了 然,MD5加密方法类与方法详细页不论是哪部分都有被调用,因此AlipayCore.java文件可视为核心代码部分, c) 详细介绍 1.AlipayCore.java public static Map paraFilter(Map Java版支付宝支付功能整理文档 (2) 一、引用文件 (2) 1、基础配置类:AlipayConfig.java (2) 2、支付宝MD5签名处理核心文件:MD5.java (3) 3、支付宝接口公用函数类:AlipayCore.java (5) 4、支付宝通知处理类:AlipayNotify.java (8) 5、支付宝各接口请求提交类:AlipaySubmit.java (12) 6.自定义订单类:UtilDate.java (15) 7.HttpClient方式访问:HttpProtocolHandler.java (17) 8、Http请求对象的封装:HttpRequest.java (23) 9、Http返回对象的封装:HttpResponse.java (26) 10、表示Http返回的结果字符方式:HttpResultType.java (28) 二、Controller处理方法 (29) 1、支付宝PC端支付(即时到账) (29) (1、)支付方法 (29) (2、)支付成功后的同步调用 (30) (4、)支付成功后的异步调用 (32) 2、支付宝手机网页支付 (34) (1、)支付方法 (34) (2、)支付成功后的同步调用 (36) (4、) 支付成功后的异步调用 (36) 三、页面代码 (36) 1、跳转页面:alipay.jsp和alipaywap.jsp (36) 2、同步调用页面:return_url.jsp (37) 3、异步调用页面:notify_url.jsp (37) Java版支付宝支付功能整理文档 作者:Lock-玄清 时间:2017-03-15 注:此文档只支持付款,没有退款的功能 一、引用文件 1、基础配置类:AlipayConfig.java package com.alipay.config; /* * *类名:AlipayConfig *功能:基础配置类 *详细:设置帐户有关信息及返回路径 *版本:3.4 *修改日期:2016-03-08 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */ publicclass AlipayConfig { //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://https://www.wendangku.net/doc/1b12862869.html,/order/pidAndKey.htm publicstatic String partner = ""; // 收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号 publicstatic String seller_id = partner; // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://https://www.wendangku.net/doc/1b12862869.html,/order/pidAndKey.htm publicstatic String key = ""; //----------------pc端支付宝返回路径--------------------- // 服务器异步通知页面路径需http://格式的完整路径,不能 加?id=123这类自定义参数,必须外网可以正常访问 publicstatic String notify_url = ""; 左一首页: 1、门头:搜素功能(左上,语音功能),右边通讯录+添加朋友,群聊,收钱,扫一扫 2、额头:扫一扫+付钱+收钱+卡包 3、上半身项目:记录习惯:转账,信用卡还款,充值,余额宝,淘票票,滴滴出行,芝麻信用,火车票,共享单车+更多(以及自由设定常用项目) 4、腰部:消息通知(能量+支付助手+小鸡+花呗+健康)等等 5、肚子:电影推荐+活动通知(红包领取) 6、大腿:惠支付:天天领红包+我的奖励金 7、小腿以下:天天特价 左二财富: 1、总资产+收益 2、理财方式:余额宝+定期理财+基金+黄金 3、老手:适合的理财方式:中间上面的延伸:工资理财+还贷管家+每周一读 4、新手:下面有理财新手推荐;基金,债券以及软文推荐文章 5、精选财富号:各大基金公众号和其他 中间口碑网: 1、主要是美食,电影等消费(类似美团等网站)+连接高德生态圈 2、外卖:收购的饿了么 3、滴滴出行(放这边什么鬼) 右二朋友 1、门头:搜素功能(左上,语音功能),右边通讯录+添加朋友 2、额头: A:生活号=微信公众号 B:小程序:小黄车+来电(公众充电宝/充电口)/街电(捆绑推广)+电子执照+车保险+4sF 服务+找工作+家政服务+违章+社保等等 C:生活圈=朋友圈 3、往下是优酷会员 4、服务提醒(消息通知(能量+支付助手+小鸡+花呗+健康)等等) 5、信用卡办理等推荐 6、淘票票 7、朋友往来信息 8、吱声团队:朋友社交功能使用说明书(最下面,一般不注意) 右一:我的(余额宝为主) 从上到下:账号以及设置、蚂蚁会员及积分、账单、总资产、余额、余额宝、银行卡、芝麻信用、保险服务、花呗、蚂蚁借呗、网商银行、公益、娱乐宝(火了一时,现在垫底) 支付宝接入技术文档 V1.0 李财根 2014/6/25 目录 概述 (3) WEB接入 (4) 手机WAP接入 (6) Android接入 (10) 其他 (10) 概述 本文主要介绍支付宝即时到帐接口的接入。首先请确保你拥有支付宝企业账户,并通过实名认证。如果没有企业号,请先到支付宝官网申请。审核时间很快的。如果长时间未审核,请联系支付宝客服。 在以上前提下,你需要准备合作者身份(PID), 安全校验码(KEY), RSA加密KEY .登录支付宝后,可以查看。(RSA需要自己手动生成),然后上传即可。 接着下载支付宝的集成文档,里面有DEMO和生成RSA的工具OPENSSL 。 RSA密钥生成命令 生成RSA私钥 openssl>genrsa -out rsa_private_key.pem 1024 生成RSA公钥(生成后上传到支付宝的KEY管理界面) openssl>rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 将RSA私钥转换成PKCS8格式(Android端需要) openssl>pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt –out rsaPKCS8.pem 注意:你需要的是– BEGIN ..--- 和– END.. –之间的部分(如下图)。支付宝公钥都是一样的。 WEB接入 下载DEMO后,导入到工作空间。 修改AlipayConfig的参数: 接着,修改一下index.jsp 设置一些input的默认值(便于调试)。 接着修改alipayapi.jsp, AliPay支付宝标准快速付款接口文档(doc 26页) 纯网关接口文档 副标题:网银直连 修订历史 版本号作者修订章节修订原因修订日期 V1.0 技术支持团队全版修改加强文档结构的合理性2008-11-17 接口升级、增加查询签约接口2009-8-2 V1.1 甘宁订正部分接口参数和 描述信息,例如:即时 支付支持错误通知地 址(error_notify_url) 更新签约接口内容 使文档阅读性更强2009-12-8 V1.2 甘宁重新整理流程以及文 档说明 V1.3 甘宁增加“公用回传参数”满足用户自定义参数的要求2010-3-18 V1.4 甘宁通知中增加网银流水满足商户网银支付需求2010-3-29 V1.5 甘宁请求参数列表支持自定义超时可以使用时间 2010-9-13 区间 信用卡大额支付也支持纯网关2010-10-26 V1.5.1 甘宁增加4.3.2的信用卡简 码 说明: 本接口将支付宝即时到帐接口用作纯网关的功能做详细介绍。 在集成时处理机制和原有支付宝即时到帐一样,请求时必须增加默认支付方式(paymethod)和默认网银(defaultbank)2个参数 目录 1 前言 ------------------------------------------------------------------------------------ 3 1.1 概述 ------------------------------------------------------------------------------- 3 1.2 术语 ------------------------------------------------------------------------------- 3 2 接口功能及参数介绍 -------------------------------------------------------------------- 3 2.1 标准即时到账接口(适用于纯网银) ----------------------------------------------- 3 2.1.1 功能描述 ------------------------------------------------------------------------------------------ 3 2.1.2 交互流程 ------------------------------------------------------------------------------------------ 4 2.1.3 交互模式 ------------------------------------------------------------------------------------------ 4 2.1.4 接口详细说明 ------------------------------------------------------------------------------------ 4 2.1.5 接口注意事项 ----------------------------------------------------------------------------------- 11 2.1.6 接口错误代码列表 ----------------------------------------------------------------------------- 11 3 签名通用策略 --------------------------------------------------------------------------13 3.1 安全方面C HECK L IST --------------------------------------------------------------13 3.2 签名方面--------------------------------------------------------------------------13 3.2.1 签名机制 ----------------------------------------------------------------------------------------- 13 3.2.2 4.2.2签名方式 -------------------------------------------------------------------------------------- 13 3.3 其他方面--------------------------------------------------------------------------14 4 附录 -----------------------------------------------------------------------------------14 4.1 接口通用机制 ---------------------------------------------------------------------14 4.1.1 系统调用 ----------------------------------------------------------------------------------------- 14 4.1.2 页面跳转 ----------------------------------------------------------------------------------------- 14 4.1.3 支付宝主动通知处理流程 -------------------------------------------------------------------- 16 4.1.4 通知验证 ----------------------------------------------------------------------------------------- 17 支付宝的安全,和隐患 一:支付宝网站采用的安全手段,起到什么效果 (一):“支付宝账户”有两个密码,一个是登录密码,用于登录账户,查看账目等一般性操作;另一个是支付密码,凡是牵涉到资金流转的过程,都需要使用支付密码。缺少任何一个密码,都不能使资金发生流转。同时,对同一天内允许的密码输入出错次数有限制,超过出错次数后,系统将自动锁定该账户。 登陆密码和支付密码登录密码和支付密码一定要分别设置,不能为了方便设置成同样一个密码。密码最好是数字加上字母以及符号的组合,尽量避免选择用您的生日和昵称作为登录密码或支付密码。请不要使用其他的在线服务(比如易趣、MSN、YAHOO或网上银行)一样的密码。在多个网站中使用一样的密码会增加其他人获取您的密码并访问您的账户的可能性 (二):数字证书是由权威公正的第三方机构,即CA中心签发的证书。它以数字证书为核心的加密技术可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性。 (三):支付盾是支付宝公司推出的使用硬件进行验证和签名的安全解决方案,它是具有电子签名和数字认证的工具,保证了您在网上信息传递时的保密性、唯一性、真实性和完整性。 (四):“支付宝网站”采用了先进的128位SSL加密技术(参照国内银行网站的普遍做法),确保您在支付宝页面上输入的任何信息可以安全传送到支付宝,而不用担心有人会通过网络窃取您的敏感信息。(五):绑定手机,使用手机动态口令。支付宝等网络支付账户都支持绑定手机并支持设定手机动态口令。用户可以设定当单笔支付额度或者每日支付累计额度超过一定金额时就需要进行手机动态口令校验,从而增强资金的安全性。 二:网上支付安全隐患 网上支付对于很多人来说并不陌生。你也许通过某家商业银行的网上银行转账、支付交易保证金,或是通过一些专业的网上支付服务商(如“支付宝”)进行过网上购物在线支付。所有这些通过互联网进行的支付方式都是网上支付。 网上支付受欢迎程度并不一致。一方面,很多人感受到互联网支付的快捷和方便,从而对网上支付情有独钟,他们觉得网上支付可以明显减少到银行的往来奔波之苦、可以免除排队的烦劳;另一方面,一部分人对网上支付退避三舍,不敢轻易尝试网上支付。经调查分析,不同人群对待网上支付的不同态度在很大程度上是由于他们对网上支付安全担心程度不同所致。 也就是说,对于后者,他们觉得网上支付需要更好的安全保障。从目前网上支付的发展水平和出现的网上支付案例来看,现行的网上支付 支付宝接入接口文档 文档历史 目录 微信支付接入接口文档 (1) 1 API介绍 (3) 1.1接口调用方式 (3) 2 API说明 (4) 2.1获取商户开通的支付方式.............................................................. 错误!未定义书签。 2.1.1 功能描述............................................................................... 错误!未定义书签。 2.1.2 访问地址............................................................................... 错误!未定义书签。 2.1.3 请求参数............................................................................... 错误!未定义书签。 2.1.4 应答参数............................................................................... 错误!未定义书签。 2.2扫码支付接口(商户扫消费者) (4) 2.2.1 功能描述 (4) 2.2.2 访问地址 (4) 2.2.3请求参数 (4) 2.2.4 应答参数 (5) 2.3消费撤销 (5) 2.3.1 功能描述 (5) 2.3.2 访问地址 (5) 2.3.3 请求参数 (5) 2.3.4 应答参数 (6) 2.4消费退款........................................................................................... 错误!未定义书签。 会员免注册登录接口 1.接入流程 2.安全规范 2.1.数字签名 数据传输过程中的数据真实性和完整性,我们需要对数据进行数字签名,在接收签名数据之后进行签名校验。 2.1.1.签名机制 待签名数据是请求参数按照以下方式组装成的字符串: ?请求参数按照参数名字符升序排列,如果有重复参数名,那么重复的参 数再按照参数值的字符升序排列。 ?所有参数(除了sign和sign_type)按照上面的排序用&连接起来,格 式是:p1=v1&p2=v2。 调用某接口需要以下参数: service= user_authentication, partner=20880063000, email=test@https://www.wendangku.net/doc/1b12862869.html, 那么待签名数据就是: email=test@https://www.wendangku.net/doc/1b12862869.html,&partner=20880063000&service= user_authentication 注意事项: ?没有值的参数无需传递,也无需包含到待签名数据中。 ?签名时将字符转化成字节流时指定的字符集与_input_charset保持一致。 ?如果传递了_input_charset参数,这个参数也应该包含在待签名数据中。 ?根据HTTP协议要求,传递参数的值中如果存在特殊字符(如:&、@等), 那么该值需要做URL Encoding,这样请求接收方才能接收到正确的参数值。 这种情况下,待签名数据应该是原生值而不是encoding之后的值。例如:调用某接口需要对请求参数email进行数字签名,那么待签名数据应该是:email=test@https://www.wendangku.net/doc/1b12862869.html,,而不是email=test%https://www.wendangku.net/doc/1b12862869.html,。 2.1.2.签名方式 按照sign_type参数指定的签名算法对待签名数据进行MD5加密。 1.3.接入URL https://https://www.wendangku.net/doc/1b12862869.html,/cooperate/gateway.do 接入方式 (GET/POST)提交 2.参数表在线支付技术设计文档(修改版)
java支付宝支付文档(含代码)
支付宝说明书
支付宝接入技术文档
AliPay支付宝标准快速付款接口文档(doc 26页)
支付宝文档
支付宝接入接口文档
支付宝登录接口文档