首先是Web.xml
[html]
view plaincopy<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<description>發(fā)起支付請求</description>
<servlet-name>PaymentRequestServlet</servlet-name>
<servlet-class>com.jadyer.servlet.PaymentSendServlet</servlet-class>
</servlet>
<servlet>
<description>響應(yīng)支付結(jié)果</description>
<servlet-name>PaymentResponseServlet</servlet-name>
<servlet-class>com.jadyer.servlet.PaymentResultServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PaymentRequestServlet</servlet-name>
<url-pattern>/servlet/yeepay/PaymentSendServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>PaymentResponseServlet</servlet-name>
<url-pattern>/servlet/yeepay/PaymentResultServlet</url-pattern>
</servlet-mapping>
</web-app>
<!--
*******************************************************************************
網(wǎng)上支付,兩種接入方案:1)直接與銀行對接。2)通過中間公司間接與銀行對接
1)直接與銀行對接
優(yōu)點(diǎn):由于是直接與銀行進(jìn)行財務(wù)結(jié)算,故交易資金比較安全
適合資金流量比較大的(比如每月結(jié)算金額達(dá)到佰萬以上)的企業(yè)
缺點(diǎn):開發(fā)工作量比較大。銀行會不定期升級交易系統(tǒng),故企業(yè)也需要作相應(yīng)改動
而且企業(yè)每年還需要向銀行交納一定數(shù)量的接口應(yīng)用費(fèi)
2)通過中間公司間接與銀行對接
優(yōu)點(diǎn):開發(fā)工作量較少。由于使用的是中間企業(yè)提供的接入規(guī)范,故銀行升級系統(tǒng)時不需要企業(yè)作相應(yīng)修改
除非中間企業(yè)的接入規(guī)范發(fā)生了改變,企業(yè)才作相應(yīng)修改
由于只是與一家中間企業(yè)對接,故其接入費(fèi)用也比較低
適合資金流量比較小的(比如每月結(jié)算金額在幾十萬以下的中小企業(yè))
缺點(diǎn):由于是與中間企業(yè)進(jìn)行資金結(jié)算,而目前所有中間企業(yè)都是私企,故資金安全是個大問題
********************************************************************************
目前國內(nèi)做的比較好的中間支付公司
首信易支付:http://www.beijing.com.cn
每年交納一定的接口使用費(fèi),并從交易金額中扣除1%的手續(xù)費(fèi)。紅孩子、當(dāng)當(dāng)網(wǎng)、京東商城等用之
易寶支付:http://www.yeepay.com
接入免費(fèi),只從交易金額中扣除1%的手續(xù)費(fèi)。盛大、藝龍網(wǎng)、巴巴運(yùn)動網(wǎng)等用之
********************************************************************************
支付流程,大致如下:(可參考//WebRoot//WEB-INF//page//connection.jsp來理解)
通過HTTP的方式向易寶支付網(wǎng)關(guān)發(fā)起支付請求,即向connection.jsp中注釋部分的測試或正式網(wǎng)關(guān)發(fā)起請求
該請求可以是GET或者POST方式,頁面應(yīng)采用GBK或者GB2312編碼
易寶支付網(wǎng)關(guān)對企業(yè)發(fā)來的數(shù)據(jù),使用用戶的密鑰生成HMAC-MD5
然后與企業(yè)發(fā)來的HMAC-MD5(即表單中hmac字段提供的值)比較
若二者相同,則將請求轉(zhuǎn)發(fā)到銀行網(wǎng)關(guān)
當(dāng)用戶支付完成后,銀行網(wǎng)關(guān)會引導(dǎo)用戶的瀏覽器重定向到易寶支付網(wǎng)關(guān)
接著易寶支付網(wǎng)關(guān)再引導(dǎo)瀏覽器重定向到企業(yè)提供的url頁面(即表單中p8_Url提供的值)
********************************************************************************
-->
下面是本W(wǎng)eb應(yīng)用的首頁index.jsp
[html]
view plaincopy<%@ page language="java" pageEncoding="GBK"%>
<title>Java在線支付_第一步_選擇銀行</title>
<form action="${pageContext.request.contextPath}/servlet/yeepay/PaymentSendServlet" method="POST">
<table align="center" width="600" border="6" cellspacing="0" cellpadding="2">
<tr>
<td align="center" colspan="4" bgcolor="#FFD2E9">
<b>訂單號:</b><input type="text" name="orderID">
<b>應(yīng)付金額:¥</b><input type="text" name="amount" size="6"><b>元</b>
</td>
</tr>
<tr>
<td colspan="4"> </td>
</tr>
<tr>
<td colspan="4" bgcolor="#C0C0C0">請選擇在線支付銀行</td>
</tr>
<tr>
<td height="25" width="24%"><input type="radio" name="pd_FrpId" value="ICBC-NET">工商銀行</td>
<td height="25" width="24%"><input type="radio" name="pd_FrpId" value="CMBCHINA-NET">招商銀行</td>
<td height="25" width="24%"><input type="radio" name="pd_FrpId" value="ABC-NET">農(nóng)業(yè)銀行</td>
<td height="25" width="28%"><input type="radio" name="pd_FrpId" value="CCB-NET">建設(shè)銀行</td>
</tr>
<tr>
<td height="25"><input type="radio" name="pd_FrpId" value="CEB-NET" >光大銀行</td>
<td height="25"><input type="radio" name="pd_FrpId" value="BOCO-NET">交通銀行</td>
<td height="25"><input type="radio" name="pd_FrpId" value="CMBC-NET">民生銀行</td>
<td height="25"><input type="radio" name="pd_FrpId" value="SDB-NET">深圳發(fā)展銀行</td>
</tr>
<tr>
<td height="25"><input type="radio" name="pd_FrpId" value="BCCB-NET">北京銀行</td>
<td height="25"><input type="radio" name="pd_FrpId" value="CIB-NET">興業(yè)銀行</td>
<td height="25"><input type="radio" name="pd_FrpId" value="ECITIC-NET">中信銀行</td>
<td height="25"><input type="radio" name="pd_FrpId" value="SPDB-NET">浦東發(fā)展銀行</td>
</tr>
<tr>
<td colspan="4"> </td>
</tr>
<tr>
<td colspan="4" align="center" bgcolor="#FFDAB5"><input type="submit" value=" 確認(rèn)支付 "/></td>
</tr>
</table>
</form>
下面是用于發(fā)起支付請求的PaymentSendServlet.java
[java]
view plaincopypackage com.jadyer.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jadyer.util.PaymentUtil;
/**
* 發(fā)起支付請求
* @see ==============================================================================================
* @see 測試商戶
* @see p1_MerId=10000432521
* @see keyValue=8UPp0KE8sq73zVP370vko7C39403rtK1YwX40Td6irH216036H27Eb12792t
* @see ==============================================================================================
* @see 正式商戶:本人親測,可以直接連到銀行頁面
* @see p1_MerId=10001126856
* @see keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl
* @see ==============================================================================================
* @see accountCallbackURL=http://127.0.0.1:8088/payment/servlet/yeepay/PaymentResultServlet
* @see 此時機(jī)器需聯(lián)網(wǎng)。若使用路由上的網(wǎng),只要把路由的IP寫進(jìn)去,再在路由里配置一個8088端口的轉(zhuǎn)發(fā)規(guī)則,即可
* @see ==============================================================================================
*/
@SuppressWarnings("serial")
public class PaymentSendServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("GBK");
//測試商戶:商戶編號
String accountID = "10000432521";
//測試商戶:密鑰
String keyValue = "8UPp0KE8sq73zVP370vko7C39403rtK1YwX40Td6irH216036H27Eb12792t";
//測試商戶:商戶接收支付成功數(shù)據(jù)的地址
String accountCallbackURL = "http://127.0.0.1:8088/payment/servlet/yeepay/PaymentResultServlet";
String orderID = request.getParameter("orderID"); //獲取訂單號
String amount = request.getParameter("amount"); //獲取支付金額
String accountBankID = request.getParameter("pd_FrpId"); //獲取用戶所選擇的銀行
String businessType = "Buy"; //業(yè)務(wù)類型。Buy為在線支付
String currency = "CNY"; //交易幣種。CNY為人民幣
String productDesc = ""; //商品描述
String productCategory = ""; //商品種類
String productID = ""; //商品ID
String addressFlag = "0"; //送貨地址。0為不需要,1為需要
String accountMoreInfo = ""; //商戶擴(kuò)展信息
String pr_NeedResponse = "0"; //應(yīng)答機(jī)制
String md5hmac = PaymentUtil.buildHmac(
businessType, accountID, orderID, amount, currency, productID, productCategory,
productDesc, accountCallbackURL, addressFlag, accountMoreInfo, accountBankID,
pr_NeedResponse, keyValue);
request.setAttribute("businessType", businessType);
request.setAttribute("accountID", accountID);
request.setAttribute("orderID", orderID);
request.setAttribute("amount", amount);
request.setAttribute("currency", currency);
request.setAttribute("productID", productID);
request.setAttribute("productCategory", productCategory);
request.setAttribute("productDesc", productDesc);
request.setAttribute("accountCallbackURL", accountCallbackURL);
request.setAttribute("addressFlag", addressFlag);
request.setAttribute("accountMoreInfo", accountMoreInfo);
request.setAttribute("accountBankID", accountBankID);
request.setAttribute("needResponse", pr_NeedResponse);
request.setAttribute("md5hmac", md5hmac);
request.getRequestDispatcher("/WEB-INF/page/connection.jsp").forward(request, response);
}
}
下面是用于連接本地支付請求和易寶之間的connection.jsp
[html]
view plaincopy<%@ page language="java" pageEncoding="GBK"%>
<title>Java在線支付_第二步_支付請求</title>
<body onload="javascript:document.forms[0].submit()">
<%-- 易寶的正式網(wǎng)關(guān):https://www.yeepay.com/app-merchant-proxy/node --%>
<%-- 易寶的測試網(wǎng)關(guān):http://tech.yeepay.com:8080/robot/debug.action --%>
<form action="http://tech.yeepay.com:8080/robot/debug.action" method="POST" name="yeepay">
<!-- 以下hidden中的name值為易寶支付規(guī)范的固定命名和順序 -->
<input type='hidden' name='p0_Cmd' value="${businessType}">
<input type='hidden' name='p1_MerId' value="${accountID}">
<input type='hidden' name='p2_Order' value="${orderID}">
<input type='hidden' name='p3_Amt' value="${amount}">
<input type='hidden' name='p4_Cur' value="${currency}">
<input type='hidden' name='p5_Pid' value="${productID}">
<input type='hidden' name='p6_Pcat' value="${productCategory}">
<input type='hidden' name='p7_Pdesc' value="${productDesc}">
<input type='hidden' name='p8_Url' value="${accountCallbackURL}">
<input type='hidden' name='p9_SAF' value="${addressFlag}">
<input type='hidden' name='pa_MP' value="${accountMoreInfo}">
<input type='hidden' name='pd_FrpId' value="${accountBankID}">
<input type="hidden" name='pr_NeedResponse' value="${needResponse}">
<input type='hidden' name='hmac' value="${md5hmac}">
</form>
</body>
下面是用于響應(yīng)支付結(jié)果的PaymentResultServlet.java
[java]
view plaincopypackage com.jadyer.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jadyer.util.PaymentUtil;
/**
* 響應(yīng)銀行支付結(jié)果
* @see ==============================================================================================
* @see 測試商戶
* @see p1_MerId=10000432521
* @see keyValue=8UPp0KE8sq73zVP370vko7C39403rtK1YwX40Td6irH216036H27Eb12792t
* @see ==============================================================================================
* @see 正式商戶:本人親測,可以直接連到銀行頁面
* @see p1_MerId=10001126856
* @see keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl
* @see ==============================================================================================
*/
@SuppressWarnings("serial")
public class PaymentResultServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("GBK");
//測試商戶:商家ID
String p1_MerId = "10000432521";
//測試商戶:商家密鑰
String keyValue = "8UPp0KE8sq73zVP370vko7C39403rtK1YwX40Td6irH216036H27Eb12792t";
String r0_Cmd = request.getParameter("r0_Cmd"); //業(yè)務(wù)類型
String r1_Code = request.getParameter("r1_Code"); //扣款結(jié)果。1:扣款成功
String r2_TrxId = request.getParameter("r2_TrxId"); //易寶交易訂單號
String r3_Amt = request.getParameter("r3_Amt"); //扣款金額。交易結(jié)束后,易寶交易系統(tǒng)將實(shí)際扣款金額返回給商戶
String r4_Cur = request.getParameter("r4_Cur"); //交易幣種。人民幣為CNY
String r5_Pid = request.getParameter("r5_Pid"); //商品ID
String r6_Order = request.getParameter("r6_Order"); //商戶訂單號
String r7_Uid = request.getParameter("r7_Uid"); //易寶會員ID
String r8_MP = request.getParameter("r8_MP"); //商戶擴(kuò)展信息??扇我馓顚?K的字符串,交易返回時將原樣返回
String r9_BType = request.getParameter("r9_BType"); //交易結(jié)果通知類型。1:交易成功回調(diào)(瀏覽器重定向),2:交易成功主動通知(服務(wù)器點(diǎn)對點(diǎn)通訊)
String hmac = request.getParameter("hmac"); //MD5交易簽名
boolean result = PaymentUtil.verifyCallback(
hmac, p1_MerId, r0_Cmd, r1_Code, r2_TrxId, r3_Amt, r4_Cur,
r5_Pid, r6_Order, r7_Uid, r8_MP, r9_BType, keyValue);
if (result) {
if ("1".equals(r1_Code)) {
StringBuffer message = new StringBuffer();
message.append("訂單號為:" + r6_Order + " 的訂單支付成功,"); //此時數(shù)據(jù)庫中訂單支付狀態(tài)應(yīng)為已支付,否則容易出現(xiàn)"無限刷點(diǎn)卡"的BUG
message.append("用戶支付了" + r3_Amt + "元。<br/>");
message.append("交易結(jié)果通知類型:");
if ("1".equals(r9_BType)) {
message.append("瀏覽器重定向。<br/>");
} else if ("2".equals(r9_BType)) {
message.append("易寶支付網(wǎng)關(guān)后臺程序通知。<br/>");
}
message.append("易寶訂單系統(tǒng)中的訂單號為:" + r2_TrxId);
request.setAttribute("message", message);
} else {
request.setAttribute("message", "用戶支付失敗");
}
} else {
request.setAttribute("message", "數(shù)據(jù)來源不合法");
}
request.getRequestDispatcher("/WEB-INF/page/paymentResult.jsp").forward(request, response);
}
}
下面是用于顯示支付結(jié)果的paymentResult.jsp
[html]
view plaincopy<%@ page language="java" pageEncoding="GBK"%>
<title>Java在線支付_第三步_支付結(jié)果</title>
<center>
<h3><font color="red">${message}</font></h3>
</center>
接下來是我們用到的支付工具類PaymentUtil.java
[java]
view plaincopypackage com.jadyer.util;
/**
* 支付工具類
*/
public class PaymentUtil {
/**
* 對支付請求的數(shù)據(jù),加密生成md5-hmac
* @see 以下參數(shù)都是易寶支付規(guī)范要求發(fā)送的,并且它們的順序是固定的
* @see 并且以下所有參數(shù)的值,都不能為null,只能為空字符串,即""
* @param p0_Cmd 業(yè)務(wù)類型
* @param p1_MerId 商戶編號
* @param p2_Order 商戶訂單號
* @param p3_Amt 支付金額
* @param p4_Cur 交易幣種
* @param p5_Pid 商品ID
* @param p6_Pcat 商品種類
* @param p7_Pdesc 商品描述
* @param p8_Url 商戶接收支付成功數(shù)據(jù)的地址
* @param p9_SAF 送貨地址
* @param pa_MP 商戶擴(kuò)展信息
* @param pd_FrpId 銀行編碼
* @param pr_NeedResponse 應(yīng)答機(jī)制
* @param keyValue 商戶密鑰
*/
public static String buildHmac(String p0_Cmd, String p1_MerId,
String p2_Order, String p3_Amt, String p4_Cur, String p5_Pid,
String p6_Pcat, String p7_Pdesc, String p8_Url, String p9_SAF,
String pa_MP, String pd_FrpId, String pr_NeedResponse,
String keyValue) {
StringBuffer sb = new StringBuffer();
sb.append(p0_Cmd); //業(yè)務(wù)類型。目前我們使用的是在線支付的業(yè)務(wù)類型,它的命令是Buy
sb.append(p1_MerId); //商戶編號。使用易寶支付前,須成為其用戶,然后會分配商戶編號和密鑰給我們
sb.append(p2_Order); //商戶訂單號。在我們的系統(tǒng)中,用于跟蹤訂單的號碼
sb.append(p3_Amt); //支付金額
sb.append(p4_Cur); //交易幣種
sb.append(p5_Pid); //商品ID。可選,該信息可以不提供給易寶
sb.append(p6_Pcat); //商品種類??蛇x,該信息可以不提供給易寶
sb.append(p7_Pdesc); //商品描述。可選,該信息可以不提供給易寶
sb.append(p8_Url); //商戶接收支付成功數(shù)據(jù)的地址。也就是交易結(jié)果通知地址
sb.append(p9_SAF); //送貨地址??梢圆惶峁┙o易寶,但要設(shè)其值為空字符串。注意不是null
sb.append(pa_MP); //商戶擴(kuò)展信息。它會發(fā)送給支付網(wǎng)關(guān),在支付處理完成后,它會原樣返回??刹惶峁┙o易寶,但要設(shè)其為空字符串
sb.append(pd_FrpId); //銀行編碼。這是易寶自己制定的,例如工商銀行的編碼為ICBC-NET
sb.append(pr_NeedResponse); //應(yīng)答機(jī)制。默認(rèn)為0和1兩種
//0代表易寶請求p8_Url時得到的頁面狀態(tài)是200,就表示該頁面已成功接收到數(shù)據(jù)
//假設(shè)接收程序出現(xiàn)了例外,并捕獲了例外,那么此時的請求仍是成功的,但實(shí)際上程序并沒有接受到數(shù)據(jù),這種情況下可以使用1應(yīng)答
//1代表易寶請求p8_Url時,頁面返回的代碼中,沒有html代碼,而只有一個success,則表示該頁面已成功接收到數(shù)據(jù)
return DigestUtil.hmacSign(sb.toString(), keyValue);
}
/**
* 返回校驗(yàn)hmac方法
* @see 以下參數(shù)的順序,都是易寶支付規(guī)范規(guī)定的
* @param hmac 支付網(wǎng)關(guān)發(fā)來的加密驗(yàn)證碼
* @param p1_MerId 商戶編號
* @param r0_Cmd 業(yè)務(wù)類型
* @param r1_Code 支付結(jié)果
* @param r2_TrxId 易寶支付交易流水號
* @param r3_Amt 支付金額
* @param r4_Cur 交易幣種
* @param r5_Pid 商品名稱
* @param r6_Order 商戶訂單號
* @param r7_Uid 易寶支付會員ID
* @param r8_MP 商戶擴(kuò)展信息
* @param r9_BType 交易結(jié)果返回類型
* @param keyValue 密鑰
* @return
*/
public static boolean verifyCallback(String hmac, String p1_MerId,
String r0_Cmd, String r1_Code, String r2_TrxId, String r3_Amt,
String r4_Cur, String r5_Pid, String r6_Order, String r7_Uid,
String r8_MP, String r9_BType, String keyValue) {
StringBuffer sb = new StringBuffer();
sb.append(p1_MerId); //商戶編號??梢詾?",但不能為null
sb.append(r0_Cmd); //業(yè)務(wù)類型
sb.append(r1_Code); //支付結(jié)果
sb.append(r2_TrxId); //易寶支付交易流水號。其屬于易寶支付的訂單系統(tǒng)
sb.append(r3_Amt); //支付金額
sb.append(r4_Cur); //交易幣種
sb.append(r5_Pid); //商品名稱
sb.append(r6_Order); //商戶訂單號
sb.append(r7_Uid); //易寶支付會員ID
sb.append(r8_MP); //商戶擴(kuò)展信息
sb.append(r9_BType); //交易結(jié)果返回類型
return hmac.equals(DigestUtil.hmacSign(sb.toString(), keyValue));
}
}
最后是支付工具類中用到的MD5-hmac加密類DigestUtil.java
[java]
view plaincopypackage com.jadyer.util;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
* MD5-hmac加密類
* @see HMAC-MD5是一種秘密的密鑰驗(yàn)證算法。HMAC提供的數(shù)據(jù)完整性和源身份驗(yàn)證完全取決于秘密密鑰分配的范圍
* @see 如果只有發(fā)起者和接收者知道HAMC密鑰,那么這就對兩者間發(fā)送的數(shù)據(jù)提供了源身份驗(yàn)證和完整性保證
*/
public class DigestUtil {
/**
* 加密源數(shù)據(jù)
* @see 這是針對多條字符串(即數(shù)組)進(jìn)行加密的方法。它會把數(shù)組元素拼成新字符串,然后再加密
* @see 本文暫未用到該方法
* @param aValue 加密的原文,即源數(shù)據(jù)
* @param aKey 密鑰
*/
public static String getHmac(String[] args, String key) {
if (args == null || args.length == 0) {
return (null);
}
StringBuffer str = new StringBuffer();
for (int i = 0; i < args.length; i++) {
str.append(args[i]);
}
return (hmacSign(str.toString(), key));
}
/**
* 加密源數(shù)據(jù)
* @see 這是針對一條字符串進(jìn)行加密的方法
* @param aValue 加密的原文,即源數(shù)據(jù)
* @param aKey 密鑰
*/
public static String hmacSign(String aValue, String aKey) {
byte k_ipad[] = new byte[64];
byte k_opad[] = new byte[64];
byte keyb[];
byte value[];
try {
keyb = aKey.getBytes("UTF-8");
value = aValue.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
keyb = aKey.getBytes();
value = aValue.getBytes();
}
Arrays.fill(k_ipad, keyb.length, 64, (byte) 54);
Arrays.fill(k_opad, keyb.length, 64, (byte) 92);
for (int i = 0; i < keyb.length; i++) {
k_ipad[i] = (byte) (keyb[i] ^ 0x36);
k_opad[i] = (byte) (keyb[i] ^ 0x5c);
}
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
return null;
}
md.update(k_ipad);
md.update(value);
byte dg[] = md.digest();
md.reset();
md.update(k_opad);
md.update(dg, 0, 16);
dg = md.digest();
return toHex(dg);
}
public static String toHex(byte input[]) {
if (input == null){
return null;
}
StringBuffer output = new StringBuffer(input.length * 2);
for(int i=0; i<input.length; i++){
int current = input[i] & 0xff;
if (current<16){
output.append("0");
}
output.append(Integer.toString(current, 16));
}
return output.toString();
}
// /**
// * 本文暫未用到該方法
// */
// public static String digest(String aValue) {
// aValue = aValue.trim();
// byte value[];
// try {
// value = aValue.getBytes("UTF-8");
// } catch (UnsupportedEncodingException e) {
// value = aValue.getBytes();
// }
// MessageDigest md = null;
// try {
// md = MessageDigest.getInstance("SHA");
// } catch (NoSuchAlgorithmException e) {
// e.printStackTrace();
// return null;
// }
// return toHex(md.digest(value));
// }
//
// public static void main(String[] args) {
// String value = "adpoga234lkdsngoiuayv1111wekng123123korhjtg";
// String[] values = {"adpoga234lkdsngoiuayv11", "11wekng123123korhjtg"};
// String key = "abcdjadyer";
// System.out.println(hmacSign(value, key));
// System.out.println(getHmac(values, key));
// }
}