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 的對應(yīng)交易安全校驗(yàn)碼(必須填寫)
???String alipayNotifyURL = "?????+ "&partner="
?????+ partner
?????+ "¬ify_id="
?????+ request.getParameter("notify_id");
???//獲取支付寶ATN返回結(jié)果,true是正確的訂單信息,false 是無效的
???//如果你的服務(wù)器不支持https訪問的話,需要用老的接口查詢地址了,論壇上會(huì)公布
???String responseTxt = gateway.checkURL.checkURL
?????.check(alipayNotifyURL);
???Map params = new HashMap();
???//獲得POST 過來參數(shù)設(shè)置到新的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 的對應(yīng)交易安全校驗(yàn)碼(必須填寫)
??//?String alipayNotifyURL = "???//??+ "&partner="
???//??+ partner
???//??+ "¬ify_id="
???//??+ request.getParameter("notify_id");
???//獲取支付寶ATN返回結(jié)果,true是正確的訂單信息,false 是無效的
???//String responseTxt = gateway.checkURL.checkURL
???//??.check(alipayNotifyURL);
??????????? //由于return url的返回通知,notifyid為空,無法到服務(wù)器查詢真假,所以只要比對簽名就好
???
???
???Map params = new HashMap();
???//獲得POST 過來參數(shù)設(shè)置到新的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")){
??????????? //?可以做重定向,也可以用來虛擬物品發(fā)貨
????}
????
??}
??%>
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 {
??? /**
???? * 對字符串進(jìn)行MD5加密
? * @param myUrl
???? *
???? * @param url
???? *
???? * @return 獲取url內(nèi)容
???? */
? 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 {
??? /**
???? * 對字符串進(jìn)行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????=?"??? String service = "create_direct_pay_by_user";
??? String partner???=?"";??//partner合作伙伴ID(必填)
??? String sign_type?????? =?? "MD5";
??? String subject = "訂單號:" + out_trade_no;??//subject??商品名稱
??? String body = "交易地點(diǎn)總價(jià)包含郵費(fèi)";??//body???商品描述
??? String price????? =?"100";????//price???商品單價(jià)???0.01~50000.00
??? String show_url??????? =?? "??? 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賬戶的支付寶安全校驗(yàn)碼(必填)
??? String notify_url????? =??? "
???
??
??? 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);
????????????
???????????? //構(gòu)造支付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;
???
?
????? }
}
注意:
包的位置,
參數(shù)排序是以字母的排序排的
資料由支付寶轉(zhuǎn)載:
下載地址:http://www.blive.cn/liuz/download/new_jsp_xuni.rar