今天困擾我許久的支付寶即時到賬終於再項目中調試通了。
趕快記錄一下...
先分析一下支付寶官方給的demo
網上也有一些教程是自己寫的,我覺得有些麻煩,我大部分都直接用的官方給的demo裏的文件.
支付請求
index.jsp(需要提供的部分參數)
<form name=alipayment action=alipayapi.jsp method=post target="_blank"> <!--將表單裏的數據提交到了alipay.jsp(只列出了必填) -->
<div id="body" style="clear: left">
<dl class="content">
<dt>賣家支付寶帳戶:</dt>
<dd>
<span class="null-star">*</span> <input size="30"
name="WIDseller_email" /> <span>必填 </span>
</dd>
<dt>商戶訂單號:</dt>
<dd>
<span class="null-star">*</span> <input size="30"
name="WIDout_trade_no" /> <span>商戶網站訂單系統中唯一訂單號,必填 </span>
</dd>
<dt>訂單名稱:</dt>
<dd>
<span class="null-star">*</span> <input size="30"
name="WIDsubject" /> <span>必填 </span>
</dd>
<dt>付款金額:</dt>
<dd>
<span class="null-star">*</span> <input size="30"
name="WIDtotal_fee" /> <span>必填 </span>
</dd>
<dd>
<span class="new-btn-login-sp">
<button class="new-btn-login" type="submit"
style="text-align: center;">確 認</button>
</span>
</dd>
</dl>
</div>
</form>
alipay.jsp(一些不變的數據)
<%
//支付類型
String payment_type = "1";
//必填,不能修改
//服務器異步通知頁面路徑
String notify_url = "http://127.0.0.1:8080/create_direct_pay_by_user-JAVA-UTF-8/notify_url.jsp";
//需http://格式的完整路徑,不能加?id=123這類自定義參數
//頁面跳轉同步通知頁面路徑
String return_url = "http://127.0.0.1:8080/create_direct_pay_by_user-JAVA-UTF-8/return_url.jsp";
//需http://格式的完整路徑,不能加?id=123這類自定義參數,不能寫成http://localhost/
//賣家支付寶帳戶(這裏也可以用seller_email,把seller_id換成seller_email就行了,當然下面sParaTemp.put也要換)
String seller_id = new String(request.getParameter("WIDseller_email").getBytes("ISO-8859-1"),"UTF-8");
//必填
//商戶訂單號
String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//商戶網站訂單系統中唯一訂單號,必填
//訂單名稱
String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8");
//必填
//付款金額
String total_fee = new String(request.getParameter("WIDtotal_fee").getBytes("ISO-8859-1"),"UTF-8");
//必填
//把請求參數打包成數組
Map<String, String> sParaTemp = new HashMap<String, String>();
sParaTemp.put("service", "create_direct_pay_by_user");
sParaTemp.put("partner", AlipayConfig.partner);
sParaTemp.put("_input_charset", AlipayConfig.input_charset);
sParaTemp.put("payment_type", payment_type);
sParaTemp.put("notify_url", notify_url);
sParaTemp.put("return_url", return_url);
sParaTemp.put("seller_id", seller_id);
sParaTemp.put("out_trade_no", out_trade_no);
sParaTemp.put("subject", subject);
sParaTemp.put("total_fee", total_fee);
sParaTemp.put("body", body);
sParaTemp.put("show_url", show_url);
sParaTemp.put("anti_phishing_key", anti_phishing_key);
sParaTemp.put("exter_invoke_ip", exter_invoke_ip);
//建立請求
String sHtmlText = AlipaySubmit.buildRequest(sParaTemp,"get","確認");//這裏將上面的數據通過buildRequest生成了Html代碼
out.println(sHtmlText);
%>
alipayConfig.java(基礎配置類)
public class AlipayConfig {
// 合作身份者ID,以2088開頭由16位純數字組成的字符串
public static String partner = "20xxxxxxxxx3";
// 商戶的私鑰
public static String key = "7rd4xxxxxxxxxxxxxxxxxpb";
// 調試用,創建TXT日誌文件夾路徑
public static String log_path = "/home/zemo/alipay/";
// 字符編碼格式 目前支持 gbk 或 utf-8
public static String input_charset = "utf-8";
// 簽名方式 不需修改
public static String sign_type = "MD5";
}
以上三部分基本就可以完成支付了,當然還有一些輔助加密之類的方法,不用去懂只需要會調用就行了
回調與跳轉:
notify_url.jsp(異步請求頁面)
<%
//獲取支付寶POST過來反饋信息
Map<String,String> params = new HashMap<String,String>();
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] + ",";
}
//亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
}
//獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以下僅供參考)//
//商戶訂單號
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//支付寶交易號
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
//交易狀態
String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
//獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)//
if(AlipayNotify.verify(params)){//驗證成功
if(trade_status.equals("TRADE_FINISHED")){
/*邏輯代碼*/
} else if (trade_status.equals("TRADE_SUCCESS")){
/*邏輯代碼*/
}
out.println("success"); //在頁面上輸出success,注意頁面上只能有success異步通知是通過這個判斷的,只有監測到success才停止發送請求
}else{//驗證失敗
out.println("fail");
}
%>
return_url.jsp(同步通知頁面)
其實這個也可以寫在後臺驗證,只要按照下面的代碼一樣把參數獲取過來,然後驗證跳轉到你想要的頁面就行了
<%
//獲取支付寶GET過來反饋信息
Map<String,String> params = new HashMap<String,String>();
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] + ",";
}
//亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以下僅供參考)//
//商戶訂單號
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//支付寶交易號
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
//交易狀態
String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
//獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)//
//計算得出通知驗證結果
boolean verify_result = AlipayNotify.verify(params);
if(verify_result){//驗證成功
if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){
}
out.println("驗證成功<br />");
}else{
out.println("驗證失敗");
}
%>
至此,一次完整的支付寶即時到賬交易就完成了
下一篇博客會介紹如何用j2ee在spring mvc項目中完成
Zemo手打,轉載請標明出處:http://blog.csdn.net/zemochen/article/details/19175733
支付寶即時到賬demo下載:http://download.alipay.com/public/api/base/alipaydirect.zip