package com.huaji.shtel.alipay;
//支付宝配置类
public class AlipayConfig {
/***合作身份者ID,以2088开头由16位纯数字组成的字符串*/
public static String partner="**********";//参数内容我是写在了配置文件里面
/***收款支付宝账号,一般情况下收款账号就是签约账号*/
public static String seller_email="*********";
/***商户的私钥*/
public static String key="*******";
/***
* notify_url交易过程中服务器通知的页面要用http://格式的完整路径,不允许加?id=123这类自定义参数
* 这里不需要支付宝主动提供订单状态变化的回调的话,是暂时没有用的,我这里没用到
*/
public static String notify_url="自行定义";
/***付完款后跳转的页面要用http://格式的完整路径,不允许加?id=123这类自定义参数
* 不能写成http://localhost/
*/
public static String return_url="自行定义";
//网站商品的展示地址,不允许加?id=123这类自定义参数
//public static String show_url="";//这里我也没用到
//访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;
//若不支持请选择http public static String transport="http";
//调试用,创建TXT日志文件夹路径;没用到
public static String log_path="";//"D://";public static Stringl og_path="D://";
/***字符编码格式目前支持gbk或utf-8*好像必须是小写的(没试过)*/
public static String input_charset="utf-8";
/***签名方式不需修改*/
public static String sign_type="MD5";
}
//采用MD5签名
package com.huaji.shtel.alipay.sign;
import java.io.UnsupportedEncodingException;
import java.security.SignatureException;
import org.apache.commons.codec.digest.DigestUtils;
public class MD5 {
/**
* 签名字符串
* @param text 需要签名的字符串
* @param sign 签名结果
* @param key 密钥
* @param input_charset 编码格式
* @return 签名结果
*/
public static boolean verify(String preSignStr, String sign, String key, String input_charset) {
preSignStr = preSignStr + key;
String mysign = DigestUtils.md5Hex(getContentBytes(preSignStr, input_charset));
if(mysign.equals(sign)) {
return true;
}else {
return false;
}
}
/**
* 签名字符串
* @param text 需要签名的字符串
* @param key 密钥
* @param input_charset 编码格式
* @return 签名结果
*/
public static String sign(String prestr, String key, String input_charset) {
prestr = prestr + key;
return DigestUtils.md5Hex(getContentBytes(prestr, input_charset));
}
/**
* @param content
* @param charset
* @return
* @throws SignatureException
* @throws UnsupportedEncodingException
*/
private static byte[] getContentBytes(String prestr, String input_charset) {
if (input_charset == null || "".equals(input_charset)) {
return prestr.getBytes();
}
try {
return prestr.getBytes(input_charset);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + input_charset);
}
}
}
//支付宝core类
package com.huaji.shtel.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 org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.httpclient.methods.multipart.FilePartSource;
import org.apache.commons.httpclient.methods.multipart.PartSource;
import com.huaji.shtel.alipay.AlipayConfig;
public class AlipayCore {
/**
* 除去数组中的空值和签名参数
* @param sArray 签名参数组
* @return 去掉空值与签名参数后的新签名参数组
*/
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);
if (value == null || value.equals("") || key.equalsIgnoreCase("sign")
|| key.equalsIgnoreCase("sign_type")) {
continue;
}
result.put(key, value);
}
return result;
}
/**
* 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
* @param params 需要排序并参与字符拼接的参数组
* @return 拼接后字符串
*/
public static String 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) {//拼接时,不包括最后一个&字符
prestr = prestr + key + "=" + value;
} else {
prestr = prestr + key + "=" + value + "&";
}
}
return prestr;
}
/**
* 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
* @param sWord 要写入日志里的文本内容
*/
public static void 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 文件摘要结果
*/
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());
}else if(file_digest_type.equals("SHA")) {
return DigestUtils.sha256Hex(file.createInputStream());
}else {
return "";
}
}
}
//notify类
package com.huaji.shtel.alipay.util;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import com.huaji.shtel.alipay.AlipayConfig;
import com.huaji.shtel.alipay.sign.MD5;
public class AlipayNotify {
//支付宝传递通过双向签名认证的方式,防止用户恶意改变上传回调参数,
//本地将所有参数通过md5加密生成一个签名,附带传给支付宝,
//支付宝处理完后,也会传一个签名结果回来,本地在进行比对,必须相同才可以通过.
/***支付宝消息验证地址*所有的参数会跟在这里url后面传给支付宝 */
private static final String HTTPS_VERIFY_URL="https://mapi.alipay.com/gateway.do?service=notify_verify&;";
/***验证消息是否是支付宝发出的合法消息
* @paramparams 通知返回来的参数数组
* @return 验证结果
*/
public static boolean verify(Map<String,String> params){
//判断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");
}
System.out.println(sign);
boolean isSign=getSignVeryfy(params,sign);
//写日志记录(若要调试,请取消下面两行注释)
String sWord="responseTxt="+responseTxt+"/nisSign="+isSign+"/n返回回来的参数:"+AlipayCore.createLinkString(params);
System.out.println(sWord);
//AlipayCore.logResult(sWord);
if(isSign && responseTxt.equals("true")){
return true;
}else{
return false;
}
}
/***根据反馈回来的信息,生成签名结果
* @paramParams 通知返回来的参数数组
* @param sign比对的签名结果
* @return 生成的签名结果
*/
private static boolean getSignVeryfy(Map<String,String> Params,String sign){
//过滤空值、sign与sign_type参数
Map<String,String> 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;
}
/***获取远程服务器ATN结果,验证返回URL
* @paramnotify_id 通知校验ID
* @return 服务器ATN结果
* 验证结果集:
* invalid命令参数不对出现这个错误,请检测返回处理中partner和key是否为空
* true返回正确信息
* false请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
* */
private static String verifyResponse(String notify_id){
//获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求
String partner=AlipayConfig.partner;
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 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
* */
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
.getInputStream()));
inputLine = in.readLine().toString();
} catch (Exception e) {
e.printStackTrace();
inputLine = "";
}
return inputLine;
}
}
//submit类
package com.huaji.shtel.alipay.util;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.httpclient.NameValuePair;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import com.huaji.shtel.alipay.AlipayConfig;
import com.huaji.shtel.alipay.sign.MD5;
import com.huaji.shtel.alipay.util.httpClient.HttpProtocolHandler;
import com.huaji.shtel.alipay.util.httpClient.HttpRequest;
import com.huaji.shtel.alipay.util.httpClient.HttpResponse;
import com.huaji.shtel.alipay.util.httpClient.HttpResultType;
public class AlipaySubmit {
/***支付宝提供给商户的服务接入网关URL(新)*/
private static final String ALIPAY_GATEWAY_NEW="https://mapi.alipay.com/gateway.do?";
/***生成签名结
* @paramsPara 要签名的数组
* @return 签名结果字符串
* */
public static String buildRequestMysign(Map<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;
}
/***生成要请求给支付宝的参数数组
* @paramsParaTemp 请求前的参数数组
* @return 要请求的参数数组
* */
private static Map<String,String> buildRequestPara(Map<String,String> sParaTemp){
//除去数组中的空值和签名参数M
Map<String,String> sPara=AlipayCore.paraFilter(sParaTemp);
//生成签名结果
String mysign=buildRequestMysign(sPara);
//签名结果与签名方式加入请求提交参数组中
sPara.put("sign",mysign);
sPara.put("sign_type",AlipayConfig.sign_type);
return sPara;
}
/***建立请求,以表单HTML形式构造(默认)
* @paramsParaTemp 请求参数数组
* @paramstrMethod 提交方式。两个值可选:post、get
* @paramstrButtonName 确认按钮显示文字
* @return 提交表单HTML文本
* 这里就是提交页面的form表单*/
public static String buildRequest(Map<String,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=\"alipaysubmit\" 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=(String)sPara.get(name);
sbHtml.append("<input type=\"hidden\"name=\""+name+"\"value=\""+value+"\"/>");
}
//submit按钮控件请不要含有name属性
sbHtml.append("<input type=\"submit\" value=\"" + strButtonName + "\" style=\"display:none;\"></form>");
sbHtml.append("<script>document.forms['alipaysubmit'].submit();</script>");
//这里设置自动提交,可以注释掉这些,来自己手动提交测//试
return sbHtml.toString();
}
/***建立请求,以表单HTML形式构造,带文件上传功能
* @paramsParaTemp 请求参数数组
* @paramstrMethod 提交方式。两个值可选:post、get
* @paramstrButtonName 确认按钮显示文字
* @paramstrParaFileName 文件上传的参数名
* @return 提交表单HTML文本
* */
public static String buildRequest(Map<String,String>sParaTemp,String strMethod,String strButtonName,String strParaFileName){
//待请求参数数组
Map<String,String> sPara=buildRequestPara(sParaTemp);
List<String> keys=new ArrayList<String>(sPara.keySet());
StringBuffer sbHtml=new StringBuffer();
sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" enctype=\"multipart/form-data\" 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=(String)sPara.get(name);
sbHtml.append("<input type=\"hidden\" name=\""+name+"\" value=\""+value+"\"/>");
}
sbHtml.append("<input type=\"file\" name=\""+strParaFileName+"\"/>");
//submit按钮控件请不要含有name属性sbHtml.append("<inputtype=/"submit/"value=/""+strButtonName+"/"style=/"display:none;/"></form>");
return sbHtml.toString();
}
/***建立请求,以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果*如果接口中没有上传文件参数,那么strParaFileName与strFilePath设置为空值
* 如:buildRequest("","",sParaTemp)
* @paramstrParaFileName 文件类型的参数名
* @paramstrFilePath 文件路径
* @paramsParaTemp 请求参数数组
* @return 支付宝处理结果
* @throwsException
* */
public static String buildRequest(String strParaFileName,String strFilePath,Map<String,String>sParaTemp)throws Exception{
//待请求参数数组
Map<String,String>sPara=buildRequestPara(sParaTemp);
HttpProtocolHandler httpProtocolHandler=HttpProtocolHandler.getInstance();
HttpRequest request=new HttpRequest(HttpResultType.BYTES);
//设置编码集
request.setCharset(AlipayConfig.input_charset);
request.setParameters(generatNameValuePair(sPara));
request.setUrl(ALIPAY_GATEWAY_NEW+"_input_charset="+AlipayConfig.input_charset);
HttpResponse response=httpProtocolHandler.execute(request,strParaFileName,strFilePath);
if(response==null){
return null;
}
String strResult=response.getStringResult();
return strResult;
}
/***MAP类型数组转换成NameValuePair类型
* @param propertiesMAP类型数组
* @return NameValuePair类型数组
* */
private static NameValuePair[] generatNameValuePair(Map<String,String> properties){
NameValuePair[]nameValuePair=new NameValuePair[properties.size()];
int i=0;
for(Map.Entry<String,String>entry:properties.entrySet()){
nameValuePair[i++]=new NameValuePair(entry.getKey(),entry.getValue());
}
return nameValuePair;
}
/***用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数
* 注意:远程解析XML出错,与服务器是否支持SSL等配置有关
* @return 时间戳字符串
* @throws IOException
* @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+"&;_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){
//截取部分不需要解析的信息
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();
}
}
//utilDate类
package com.huaji.shtel.alipay.util;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
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 = "yyyyMMdd";
/**
* 返回系统当前时间(精确到毫秒),作为一个唯一的订单编号
* @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(){
Date 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)+"";
}
}
//httpClient
/httpProtocolHandler类
package com.huaji.shtel.alipay.util.httpClient;
import org.apache.commons.httpclient.HttpException;
import java.io.IOException;
import java.net.UnknownHostException;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpConnectionManager;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.util.IdleConnectionTimeoutThread;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.FilePartSource;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;
import org.apache.commons.httpclient.params.HttpMethodParams;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/* *
*类名:HttpProtocolHandler
*功能:HttpClient方式访问
*详细:获取远程HTTP数据
*版本:3.3
*日期:2012-08-17
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public class HttpProtocolHandler {
private static String DEFAULT_CHARSET = "GBK";
/** 连接超时时间,由bean factory设置,缺省为8秒钟 */
private int defaultConnectionTimeout = 8000;
/** 回应超时时间, 由bean factory设置,缺省为30秒钟 */
private int defaultSoTimeout = 30000;
/** 闲置连接超时时间, 由bean factory设置,缺省为60秒钟 */
private int defaultIdleConnTimeout = 60000;
private int defaultMaxConnPerHost = 30;
private int defaultMaxTotalConn = 80;
/** 默认等待HttpConnectionManager返回连接超时(只有在达到最大连接数时起作用):1秒*/
private static final long defaultHttpConnectionManagerTimeout = 3 * 1000;
/**
* HTTP连接管理器,该连接管理器必须是线程安全的.
*/
private HttpConnectionManager connectionManager;
private static HttpProtocolHandler httpProtocolHandler = new HttpProtocolHandler();
/**
* 工厂方法
*
* @return
*/
public static HttpProtocolHandler getInstance() {
return httpProtocolHandler;
}
/**
* 私有的构造方法
*/
private HttpProtocolHandler() {
// 创建一个线程安全的HTTP连接池
connectionManager = new MultiThreadedHttpConnectionManager();
connectionManager.getParams().setDefaultMaxConnectionsPerHost(defaultMaxConnPerHost);
connectionManager.getParams().setMaxTotalConnections(defaultMaxTotalConn);
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().setConnectionTimeout(connectionTimeout);
// 设置回应超时
int soTimeout = defaultSoTimeout;
if (request.getTimeout() > 0) {
soTimeout = request.getTimeout();
}
httpclient.getHttpConnectionManager().getParams().setSoTimeout(soTimeout);
// 设置等待ConnectionManager释放connection的时间
httpclient.getParams().setConnectionManagerTimeout(defaultHttpConnectionManagerTimeout);
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());
} else if(strParaFileName.equals("") && strFilePath.equals("")) {
//post模式且不带上传文件
method = new PostMethod(request.getUrl());
((PostMethod) method).addParameters(request.getParameters());
method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded; text/html; charset=" + charset);
}else {
//post模式且带上传文件
method = new PostMethod(request.getUrl());
List<Part> parts = new ArrayList<Part>();
for (int i = 0; i < request.getParameters().length; i++) {
parts.add(new StringPart(request.getParameters()[i].getName(), request.getParameters()[i].getValue(), charset));
}
//增加文件参数,strParaFileName是参数名,使用本地文件
parts.add(new FilePart(strParaFileName, new FilePartSource(new File(strFilePath))));
// 设置请求体
((PostMethod) method).setRequestEntity(new MultipartRequestEntity(parts.toArray(new Part[0]), new HttpMethodParams()));
}
// 设置Http Header中的User-Agent属性
method.addRequestHeader("User-Agent", "Mozilla/4.0");
HttpResponse response = new HttpResponse();
try {
httpclient.executeMethod(method);
if (request.getResultType().equals(HttpResultType.STRING)) {
response.setStringResult(method.getResponseBodyAsString());
} else if (request.getResultType().equals(HttpResultType.BYTES)) {
response.setByteResult(method.getResponseBody());
}
response.setResponseHeaders(method.getResponseHeaders());
} catch (UnknownHostException ex) {
return null;
} catch (IOException ex) {
return null;
} catch (Exception ex) {
return null;
} finally {
method.releaseConnection();
}
return response;
}
/**
* 将NameValuePairs数组转变为字符串
*
* @param nameValues
* @return
*/
protected String toString(NameValuePair[] nameValues) {
if (nameValues == null || nameValues.length == 0) {
return "null";
}
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < nameValues.length; i++) {
NameValuePair nameValue = nameValues[i];
if (i == 0) {
buffer.append(nameValue.getName() + "=" + nameValue.getValue());
} else {
buffer.append("&" + nameValue.getName() + "=" + nameValue.getValue());
}
}
return buffer.toString();
}
}
/httpRequest
package com.huaji.shtel.alipay.util.httpClient;
import org.apache.commons.httpclient.NameValuePair;
/* *
*类名:HttpRequest
*功能:Http请求对象的封装
*详细:封装Http请求
*版本:3.3
*日期:2011-08-17
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public class HttpRequest {
/** HTTP GET method */
public static final String METHOD_GET = "GET";
/** HTTP POST method */
public static final String METHOD_POST = "POST";
/**
* 待请求的url
*/
private String url = null;
/**
* 默认的请求方式
*/
private String method = METHOD_POST;
private int timeout = 0;
private int connectionTimeout = 0;
/**
* Post方式请求时组装好的参数值对
*/
private NameValuePair[] parameters = null;
/**
* Get方式请求时对应的参数
*/
private String queryString = null;
/**
* 默认的请求编码方式
*/
private String charset = "GBK";
/**
* 请求发起方的ip地址
*/
private String clientIp;
/**
* 请求返回的方式
*/
private HttpResultType resultType = HttpResultType.BYTES;
public HttpRequest(HttpResultType resultType) {
super();
this.resultType = resultType;
}
/**
* @return Returns the clientIp.
*/
public String getClientIp() {
return clientIp;
}
/**
* @param clientIp The clientIp to set.
*/
public void setClientIp(String clientIp) {
this.clientIp = clientIp;
}
public NameValuePair[] getParameters() {
return parameters;
}
public void setParameters(NameValuePair[] parameters) {
this.parameters = parameters;
}
public String getQueryString() {
return queryString;
}
public void setQueryString(String queryString) {
this.queryString = queryString;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public int getConnectionTimeout() {
return connectionTimeout;
}
public void setConnectionTimeout(int connectionTimeout) {
this.connectionTimeout = connectionTimeout;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
/**
* @return Returns the charset.
*/
public String getCharset() {
return charset;
}
/**
* @param charset The charset to set.
*/
public void setCharset(String charset) {
this.charset = charset;
}
public HttpResultType getResultType() {
return resultType;
}
public void setResultType(HttpResultType resultType) {
this.resultType = resultType;
}
}
/httpResponse类
package com.huaji.shtel.alipay.util.httpClient;
import org.apache.commons.httpclient.Header;
import com.huaji.shtel.alipay.AlipayConfig;
import java.io.UnsupportedEncodingException;
/* *
*类名:HttpResponse
*功能:Http返回对象的封装
*详细:封装Http返回信息
*版本:3.3
*日期:2011-08-17
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public class HttpResponse {
/**
* 返回中的Header信息
*/
private Header[] responseHeaders;
/**
* String类型的result
*/
private String stringResult;
/**
* btye类型的result
*/
private byte[] byteResult;
public Header[] getResponseHeaders() {
return responseHeaders;
}
public void setResponseHeaders(Header[] responseHeaders) {
this.responseHeaders = responseHeaders;
}
public byte[] getByteResult() {
if (byteResult != null) {
return byteResult;
}
if (stringResult != null) {
return stringResult.getBytes();
}
return null;
}
public void setByteResult(byte[] byteResult) {
this.byteResult = byteResult;
}
public String getStringResult() throws UnsupportedEncodingException {
if (stringResult != null) {
return stringResult;
}
if (byteResult != null) {
return new String(byteResult, AlipayConfig.input_charset);
}
return null;
}
public void setStringResult(String stringResult) {
this.stringResult = stringResult;
}
}
/httpResultType类
/*
* Alipay.com Inc.
* Copyright (c) 2004-2005 All Rights Reserved.
*/
package com.huaji.shtel.alipay.util.httpClient;
/* *
*类名:HttpResultType
*功能:表示Http返回的结果字符方式
*详细:表示Http返回的结果字符方式
*版本:3.3
*日期:2012-08-17
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public enum HttpResultType {
/**
* 字符串方式
*/
STRING,
/**
* 字节数组方式
*/
BYTES
}