銀聯的demo寫的不錯,基本上可以直接使用。
首先是對acp_sdk.properties的內容修改,注意這個文件的文件名不能進行修改。
對於文件內的證書路徑以及證書對應的密碼進行修改。
修改完這個文件後,需要對DemoBase這個類中的frontUrl,backUrl進行修改,這個是銀聯支付後向服務器通知的前臺以及後臺地址。
frontUrl主要處理的前臺界面展示,backUrl主要處理後臺業務邏輯。
注意:這兩個地址需要是外網地址,否則將無法收到回調信息。
然後對於Form_6_2_FrontConsume類中的信息進行相應的修改,直接訪問服務,會返回給你一段html字符串,把這段html直接傳到前臺加到頁面上。這段代碼會自動提交數據,會彈出銀聯支付的界面。
注意:測試環境下,微信瀏覽器無法彈出支付界面,需要換生成環境的證書才能正常的彈出支付界面。
支付成功後,銀聯會向你設置的backUrl發送成功信息,具體接受方法如下:
String encoding = req.getParameter(SDKConstants.param_encoding);
// 獲取銀聯通知服務器發送的後臺通知參數
Map<String, String> reqParam = getAllRequestParam(req);
System.out.println("reqParam----->" + reqParam.toString());
LogUtil.printRequestLog(reqParam);
Map<String, String> valideData = null;
if (null != reqParam && !reqParam.isEmpty())
{
Iterator<Entry<String, String>> it = reqParam.entrySet().iterator();
valideData = new HashMap<String, String>(reqParam.size());
while (it.hasNext())
{
Entry<String, String> e = it.next();
String key = (String) e.getKey();
String value = (String) e.getValue();
value = new String(value.getBytes(encoding), encoding);
valideData.put(key, value);
}
}
//重要!驗證簽名前不要修改reqParam中的鍵值對的內容,否則會驗籤不過
if (!AcpService.validate(valideData, encoding))
{
LogUtil.writeLog("驗證簽名結果[失敗].");
//驗籤失敗,需解決驗籤問題
}
else
{
LogUtil.writeLog("驗證簽名結果[成功].");
}
public static Map<String, String> getAllRequestParam(final HttpServletRequest request)
{
Map<String, String> res = new HashMap<String, String>();
Enumeration<?> temp = request.getParameterNames();
if (null != temp)
{
while (temp.hasMoreElements())
{
String en = (String) temp.nextElement();
String value = request.getParameter(en);
res.put(en, value);
//在報文上送時,如果字段的值爲空,則不上送<下面的處理爲在獲取所有參數數據時,判斷若值爲空,則刪除這個字段>
//System.out.println("ServletUtil類247行 temp數據的鍵=="+en+" 值==="+value);
if (null == res.get(en) || "".equals(res.get(en)))
{
res.remove(en);
}
}
}
return res;
}
支付成功後,界面會有一個返回商戶的按鈕,那個按鈕返回的界面就是在frontUrl設置。獲取回調信息的方法與上面相同,就是在後面需要把界面導向你想要顯示的界面,順便帶上返回的參數。
這樣就順利的完成了銀聯支付的流程。