支付宝在线支付接口
index.jsp
<%@ page contentType="text/html;charset=gb2312"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body >
<br> <a href="<%=gateway.payment.payment.CreateUrl()%>"><img src="images/alipay_bwrx.gif" border="0"></a>
</body> </html>
alipay_notify.jsp <%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.util.*"%>
<%request.setCharacterEncoding("gb2312"); String partner = ""; //partner合作伙伴id(必须填写) String privateKey = ""; //partner 的对应交易安全校验码(必须填写) String alipayNotifyURL = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify" + "&partner=" + partner + "¬ify_id=" + request.getParameter("notify_id");
//获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的 //如果你的服务器不支持https访问的话,需要用老的接口查询地址了,论坛上会公布 String responseTxt = gateway.checkURL.checkURL .check(alipayNotifyURL);
Map params = new HashMap(); //获得POST 过来参数设置到新的params中 Map requestParams = request.getParameterMap(); for (Iterator iter = requestParams.keySet().iterator(); iter .hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; //valueStr = valueStr + values[i]; } params.put(name, valueStr); } String mysign = com.alipay.util.SignatureHelper.sign(params, privateKey); //out.println(mysign+"-----"+request.getParameter("sign")); if (mysign.equals(request.getParameter("sign")) || responseTxt.equals("true") ){ out.println("success"); } %>
retrun_url.jsp <%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.util.*"%>
<%request.setCharacterEncoding("gb2312"); //String partner = ""; //partner合作伙伴id(必须填写) String privateKey = ""; //partner 的对应交易安全校验码(必须填写) // String alipayNotifyURL = "http://www.alipay.com/cooperate/gateway.do?service=notify_verify" // + "&partner=" // + partner // + "¬ify_id=" // + request.getParameter("notify_id");
//获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的 //String responseTxt = gateway.checkURL.checkURL // .check(alipayNotifyURL); //由于return url的返回通知,notifyid为空,无法到服务器查询真假,所以只要比对签名就好 Map params = new HashMap(); //获得POST 过来参数设置到新的params中 Map requestParams = request.getParameterMap(); for (Iterator iter = requestParams.keySet().iterator(); iter .hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; //valueStr = valueStr + values[i]; } params.put(name, valueStr); } String mysign = com.alipay.util.SignatureHelper_return.sign(params, privateKey); //out.println(mysign+"-----"+request.getParameter("sign")); if (mysign.equals(request.getParameter("sign")) ){ if (request.getParameter("trade_status").equalsIgnoreCase("TRADE_FINISHED")){ // 可以做重定向,也可以用来虚拟物品发货 } }
%>
SignatureHelper.java package com.alipay.util;
import gateway.md5.Md5Encrypt;
import java.util.ArrayList;
import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties;
public class SignatureHelper {
public static String sign(Map params, String privateKey) { Properties properties = new Properties();
for (Iterator iter = params.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); Object value = params.get(name); if (value == null) { continue; }
if (name == null || name.equalsIgnoreCase("sign") || name.equalsIgnoreCase("sign_type")) { continue; }
properties.setProperty(name, value.toString()); }
String content = getSignatureContent(properties); return sign(content, privateKey); }
@SuppressWarnings("unchecked") public static String getSignatureContent(Properties properties) { StringBuffer content = new StringBuffer(); List keys = new ArrayList(properties.keySet()); Collections.sort(keys);
for (int i = 0; i < keys.size(); i++) { String key = (String) keys.get(i); String value = properties.getProperty(key); content.append((i == 0 ? "" : "&") + key + "=" + value); }
return content.toString(); }
public static String sign(String content, String privateKey) { if (privateKey == null) { return null; } String signBefore = content + privateKey; // System.out.print(Md5Encrypt.md5(signBefore)); return Md5Encrypt.md5(signBefore);
} }
SignatureHelper_return.java package com.alipay.util;
import gateway.md5.Md5Encrypt;
import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties;
public class SignatureHelper_return {
public static String sign(Map params, String privateKey) { Properties properties = new Properties();
for (Iterator iter = params.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); Object value = params.get(name); if (value == null) { continue; }
if ( name.equalsIgnoreCase("sign") || name.equalsIgnoreCase("sign_type")) { continue; }
properties.setProperty(name, value.toString()); }
String content = getSignatureContent(properties); return sign(content, privateKey); }
@SuppressWarnings("unchecked") public static String getSignatureContent(Properties properties) { StringBuffer content = new StringBuffer(); List keys = new ArrayList(properties.keySet()); Collections.sort(keys);
for (int i = 0; i < keys.size(); i++) { String key = (String) keys.get(i); String value = properties.getProperty(key); content.append((i == 0 ? "" : "&") + key + "=" + value); }
return content.toString(); }
public static String sign(String content, String privateKey) { if (privateKey == null) { return null; } String signBefore = content + privateKey; // System.out.print(Md5Encrypt.md5(signBefore)); return Md5Encrypt.md5(signBefore);
} }
checkURL.java package gateway.checkURL; import java.net.*; import java.io.*;
public class checkURL { /** * 对字符串进行MD5加密 * @param myUrl * * @param url * * @return 获取url内容 */ public static String check(String urlvalue ) {
String inputLine = ""; try { URL url = new URL(urlvalue); HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); String stTemp = ""; while((stTemp = in.readLine()) != null) { System.out.println(stTemp); inputLine = inputLine + stTemp; } } catch(Exception e) { e.printStackTrace(); } return inputLine; }
}
Md5Encrypt.java /** * Alipay.com Inc. Copyright (c) 2004-2005 All Rights Reserved. * * <p> * Created on 2005-7-9 * </p> */ package gateway.md5; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;
/** * MD5加密算法 */ public class Md5Encrypt { /** * 对字符串进行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."); }
msgDigest.update(text.getBytes());
byte[] bytes = msgDigest.digest();
byte tb; char low; char high; char tmpChar;
String md5Str = new String();
for (int i = 0; i < bytes.length; i++) { tb = bytes[i];
tmpChar = (char) ((tb >>> 4) & 0x000f);
if (tmpChar >= 10) { high = (char) (('a' + tmpChar) - 10); } else { high = (char) ('0' + tmpChar); }
md5Str += high; tmpChar = (char) (tb & 0x000f);
if (tmpChar >= 10) { low = (char) (('a' + tmpChar) - 10); } else { low = (char) ('0' + tmpChar); }
md5Str += low; }
return md5Str; } }
payment.java package gateway.payment;
import java.util.*;
public class payment {
public static String CreateUrl() { Date out_trade_no=new Date(); String paygateway = "https://www.alipay.com/cooperate/gateway.do?"; //'支付接口 String service = "create_direct_pay_by_user"; String partner = ""; //partner合作伙伴ID(必填) String sign_type = "MD5"; String subject = "订单号:" + out_trade_no; //subject 商品名称 String body = "交易地点总价包含邮费"; //body 商品描述 String price = "100"; //price 商品单价 0.01~50000.00 String show_url = "www.alipay.com"; String quantity = "1"; String payment_type = "1"; String logistics_type = "EXPRESS";//logistic为物流信息 String logistics_fee = "2"; String logistics_payment = "SELLER_PAY"; String logistics_type_1 = "EMS"; String logistics_fee_1 = "4"; String logistics_payment_1 = "SELLER_PAY"; String seller_email = ""; //卖家账号(必填) String key = ""; //partner账户的支付宝安全校验码(必填) String notify_url = "http://10.2.17.136:8081/new_jsp/alipay_notify.jsp";//"alipay_notify.jsp"文件的地址
String[] Oristr ={ "service="+service, "partner=" + partner, "subject=" + subject, "body=" + body, "out_trade_no=" + out_trade_no, "price=" + price, "show_url=" + show_url, "quantity=" + quantity, "payment_type=" + payment_type, "logistics_type=" + logistics_type, "logistics_fee=" + logistics_fee, "logistics_payment=" + logistics_payment, "logistics_type_1=" + logistics_type_1, "logistics_fee_1=" + logistics_fee_1, "logistics_payment_1=" + logistics_payment_1, "seller_email=" + seller_email, "notify_url=" + notify_url }; Arrays.sort(Oristr);//Sorts the specified array of objects into ascending order //according to the natural ordering of its elements. String prestr=""; for (int i = 0; i < Oristr.length; i++) { if (i==Oristr.length-1) { prestr = prestr + Oristr[i] ; } else { prestr = prestr + Oristr[i] + "&"; } }
prestr = prestr + key;
//生成Md5摘要; String sign = gateway.md5.Md5Encrypt.md5(prestr); //构造支付Url; String parameter = ""; parameter = parameter + paygateway; for (int i = 0; i < Oristr.length; i++) { parameter = parameter + Oristr[i] + "&"; }
parameter = parameter + "sign=" + sign + "&sign_type=" + sign_type;
//返回支付Url; return parameter;
} }
注意: 包的位置, 参数排序是以字母的排序排的
资料由支付宝转载: 下载地址:http://www.blive.cn/liuz/download/new_jsp_xuni.rar