用Struts2實現在線銀行付款
用Struts2實現在線銀行付款 源代碼:(沒有Struts2空項目下的包)/Files/musiclover/PayOnline.rar
1.方式:通過中間企業再連接到在線銀行(特征:風險大,適合小型的付款,但是維護容易)
這里用的是 易寶 作為中間企業
A.搭建Struts的環境
下載Struts的架包-->添加空項目下的lib中的包到WEB PROJECT 中的lib中
配置 struts.xml 和 xml filter的配置
B.創建Utils工具類
DigestUtil.java 這個類是用 商戶(企業)的 密鑰(易寶分配的)和一些付款的信息加起來產生 驗證字段
2.使用上面的類 加上易寶要求的字段 產生 驗證字段 hmac
package cn.xixi.utils;

public class payOnlineUtil {
/**
* 生成hmac方法
*
* @param p0_Cmd
* 業務類型
* @param p1_MerId
* 商戶編號
* @param p2_Order
* 商戶訂單ID號
* @param p3_Amt
* 支付金額
* @param p4_Cur
* 交易幣種
* @param p5_Pid
* 商品名稱
* @param p6_Pcat
* 商品種類
* @param p7_Pdesc
* 商品描述
* @param p8_Url
* 商戶接受支付成功后的地址
* @param p9_SAF
* 送貨地址
* @param pa_MP
* 商戶擴展信息
* @param pd_FrpId
* 銀行編碼
* @param pr_NeedResponse
* 應答機制
* @param keyValue
* 商戶密鑰
* @return
*/
public static String createHmac(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 sValue = new StringBuffer();
sValue.append(p0_Cmd);
sValue.append(p1_MerId);
sValue.append(p2_Order);
sValue.append(p3_Amt);
sValue.append(p4_Cur);
sValue.append(p5_Pid);
sValue.append(p6_Pcat);
sValue.append(p7_Pdesc);
sValue.append(p8_Url);
sValue.append(p9_SAF);
sValue.append(pa_MP);
sValue.append(pd_FrpId);
sValue.append(pr_NeedResponse);
String resultValue = DigestUtil.hmacSign(sValue.toString(), keyValue);
return resultValue;
}

/**
* 返回校驗hmac方法
*
* @param hmac
* 支付網關發來的加密驗證碼
* @param p1_MerId
* 商戶編號
* @param r0_Cmd
* 業務類型
* @param r1_Code
* 支付結果
* @param r2_TrxId
* 易寶支付交易流水號
* @param r3_Amt
* 支付金額
* @param r4_Cur
* 交易幣種
* @param r5_Pid
* 商品名稱
* @param r6_Order
* 商戶訂單號
* @param r7_Uid
* 易寶支付會員ID
* @param r8_MP
* 商戶擴展信息
* @param r9_BType
* 交易結果返回類型
* @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 sValue = new StringBuffer();
// 商戶編號
sValue.append(p1_MerId);
// 業務類型
sValue.append(r0_Cmd);
// 支付結果
sValue.append(r1_Code);
// 易寶支付交易流水號
sValue.append(r2_TrxId);
// 支付金額
sValue.append(r3_Amt);
// 交易幣種
sValue.append(r4_Cur);
// 商品名稱
sValue.append(r5_Pid);
// 商戶訂單號
sValue.append(r6_Order);
// 易寶支付會員ID
sValue.append(r7_Uid);
// 商戶擴展信息
sValue.append(r8_MP);
// 交易結果返回類型
sValue.append(r9_BType);
String sNewString = DigestUtil.hmacSign(sValue.toString(), keyValue);

if (hmac.equals(sNewString)) {
return true;
}
return false;
}
}
3.開始寫 發送請求之前的驗證類 RayRequest.java 用到Spring的工具,包自己添加
package cn.xixi.actions;

import java.util.Properties;
import java.util.regex.Pattern;

import org.springframework.core.io.support.PropertiesLoaderUtils;

import cn.xixi.utils.payOnlineUtil;

import com.opensymphony.xwork2.ActionSupport;

public class PayRequest extends ActionSupport {
/**
* 生成hmac.Action
*
* @param p0_Cmd
* 業務類型
* @param p1_MerId
* 商戶編號
* @param p2_Order
* 訂單ID號
* @param p3_Amt
* 支付金額
* @param p4_Cur
* 交易幣種
* @param p5_Pid
* 商品ID
* @param p6_Pcat
* 商品種類
* @param p7_Pdesc
* 商品描述
* @param p8_Url
* 商戶接受支付成功后的地址
* @param p9_SAF
* 送貨地址 "0"不需要 "1"為需要
* @param pa_MP
* 商戶擴展信息
* @param pd_FrpId
* 銀行編碼
* @param pr_NeedResponse
* 應答機制
* @param keyValue
* 商戶密鑰
* @return
*/
// 從用戶選擇 或是 數據庫獲得的
private String orderid;// 訂單ID p2_Order
private String amount; // 金額 p3_Amt
private String pd_FrpId; // 銀行號 pd_FrpId

// 商戶申請后得到的信息放在merchantInfo.properties
private String p1_MerId; // 商戶ID p1_MerId
private String keyValue; // 商戶密鑰 keyValue
private String p8_Url; // 接受支付成功后返回的地址 p8_Url

// 一般默認值
private String p0_Cmd = "Buy";// 業務類型默認為"buy"
private String p4_Cur = "CNY";// 默認單位是人民幣
private String p5_Pid = "";// 商品ID 留空
private String p6_Pcat = "";// 商品種類 留空
private String p7_Pdesc = "";// 商品描述 留空
private String p9_SAF = "0"; // 不需要地址
private String pa_Mp = ""; // 不需要商戶擴展信息
private String pr_NeedResponse = "0"; // 不需要應答
private String hmacValue;

public String getOrderid() {
return orderid;
}

public void setOrderid(String orderid) {
this.orderid = orderid;
}

public String getAmount() {
return amount;
}

public void setAmount(String amount) {
this.amount = amount;
}

public String getPd_FrpId() {
return pd_FrpId;
}

public void setPd_FrpId(String pd_FrpId) {
this.pd_FrpId = pd_FrpId;
}

public String getHmacValue() {
return hmacValue;
}

public void setHmacValue(String hmacValue) {
this.hmacValue = hmacValue;
}

public String getP1_MerId() {
return p1_MerId;
}

public String getP8_Url() {
return p8_Url;
}

public String getP0_Cmd() {
return p0_Cmd;
}

public String getP4_Cur() {
return p4_Cur;
}

public String getP5_Pid() {
return p5_Pid;
}

public String getP6_Pcat() {
return p6_Pcat;
}

public String getP7_Pdesc() {
return p7_Pdesc;
}

public String getP9_SAF() {
return p9_SAF;
}

public String getPa_Mp() {
return pa_Mp;
}

public String getPr_NeedResponse() {
return pr_NeedResponse;
}

// 重寫 execute()和validate()方法
public String execute() throws Exception {
Properties props=PropertiesLoaderUtils.loadAllProperties("merchantInfo.properties");
p1_MerId=props.getProperty("p1_MerId");
keyValue=props.getProperty("keyValue");
p8_Url=props.getProperty("merchantCallbackURL");
// 產生hmac碼
hmacValue=payOnlineUtil.createHmac(p0_Cmd, p1_MerId, orderid, amount, p4_Cur, p5_Pid, p6_Pcat, p7_Pdesc, p8_Url, p9_SAF, pa_Mp, pd_FrpId, pr_NeedResponse, keyValue);
return SUCCESS;
}

public void validate() {
// 如果orderid amout不為空并且不在數字中
if(null==orderid||null==amount||"".equals(orderid.trim())||"".equals(amount.trim())||null==pd_FrpId||"".equals(pd_FrpId.trim())){
this.addFieldError("orderid","3項都不能為空!");
}
}

}
struts2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>


<package name="default" extends="struts-default">
<action name="payValidate" class="cn.xixi.actions.PayRequest">
<result name="input">/index.jsp</result>
<result name="success">/connect.jsp</result>
</action>
<action name="payResult" class="cn.xixi.actions.PayResult">
<result name="success" >/response.jsp</result>
</action>
</package>
</struts>
index.jsp的代碼:需要輸入訂單號 金額 網上銀行
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>巴巴運動網_支付第一步,選擇支付銀行</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">

</head>
<body>
<H2><s:fielderror></s:fielderror></H2>
<table width="960" border="0" align="center">
<tr>
<td width="536" valign="top">
<form action="payValidate" method="post" name="paymentform">
<table width="100%" border="0">
<tr>
<td height="30" colspan="4"><table width="100%" height="50" border="0" cellpadding="0" cellspacing="1" bgcolor="#A2E0FF">
<tr>
<td align="center" bgcolor="#F7FEFF"><h3>u訂單號:<INPUT TYPE="text" NAME="orderid"> 應付金額:¥<INPUT TYPE="text" NAME="amount" size="6">元</h3></td>
</tr>
</table></td>
</tr>
<tr>
<td colspan="4"> </td>
</tr>
<tr>
<td height="30" colspan="4" bgcolor="#F4F8FF"><span class="STYLE3">請您選擇在線支付銀行</span> </td>
</tr>
<tr>
<td width="26%" height="25"><INPUT TYPE="radio" NAME="pd_FrpId" value="CMBCHINA-NET">招商銀行 </td>
<td width="25%" height="25"><INPUT TYPE="radio" NAME="pd_FrpId" value="ICBC-NET">工商銀行</td>
<td width="25%" height="25"><INPUT TYPE="radio" NAME="pd_FrpId" value="ABC-NET">農業銀行</td>
<td width="24%" height="25"><INPUT TYPE="radio" NAME="pd_FrpId" value="CCB-NET">建設銀行 </td>
</tr>
<tr>
<td height="25"><INPUT TYPE="radio" NAME="pd_FrpId" value="CMBC-NET">中國民生銀行總行</td>
<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="SDB-NET">深圳發展銀行</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">興業銀行 </td>
<td height="25"><INPUT TYPE="radio" NAME="pd_FrpId" value="SPDB-NET">上海浦東發展銀行 </td>
<td ><INPUT TYPE="radio" NAME="pd_FrpId" value="ECITIC-NET">中信銀行</td>
</tr>
<tr>
<td colspan="4"> </td>
</tr>
<tr>
<td colspan="4" align="center"><input type="submit" value=" 確認支付 " /></td>
</tr>
</table>
</form> </td>
<td colspan="2" valign="top"><div class="divts"><table width="400" border="0" align="center" cellpadding="5" cellspacing="0">
<tr>
<td bgcolor="#F4F8FF"><span class="STYLE5"> 溫馨提示</span></td>
</tr>
<tr>
<td><ul><li> 建行客戶需到柜面簽約網上銀行才能支付</li>
<li>請關閉彈出窗口攔截功能</li>
<li>務必使用IE5.0以上瀏覽器</li>
<li>支付出錯時勿按IE“后退”鍵</li>
</ul></td>
</tr>
</table>
</div>
<div id="blankmessage"></div> </td>
</tr>
<tr>
<td> </td>
<td width="290"> </td>
<td width="120"> </td>
</tr>
</table>
<H2><s:fielderror></s:fielderror></H2>
</body>
</html>
轉發到connect.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>連接易寶</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
</head>
<body onload="javascript:document.forms[0].submit()">
測試號的連接:http://tech.yeepay.com:8080/robot/debug.action
真實網址的連接:https://www.yeepay.com/app-merchant-proxy/node
<form name="yeepay" action="https://www.yeepay.com/app-merchant-proxy/node" method='post'>
<input type='hidden' name='p0_Cmd' value="${p0_Cmd}"> <!-- 請求命令,在線支付固定為Buy -->
<input type='hidden' name='p1_MerId' value="${p1_MerId}"> <!-- 商家ID -->
<input type="hidden" name="p2_Order" value="${orderid}"> <!-- 商家的交易定單號 -->
<input type='hidden' name='p3_Amt' value="${amount}"> <!-- 訂單金額 -->
<input type='hidden' name='p4_Cur' value="${p4_Cur}"> <!-- 貨幣單位 -->
<input type='hidden' name='p5_Pid' value="${p5_Pid}"> <!-- 商品ID -->
<input type='hidden' name='p6_Pcat' value="${p6_Pcat}"> <!-- 商品種類 -->
<input type='hidden' name='p7_Pdesc' value="${p7_Pdesc}"> <!-- 商品描述 -->
<input type='hidden' name='p8_Url' value="${p8_Url}"> <!-- 交易結果通知地址 -->
<input type='hidden' name='p9_SAF' value="${P9_SAF}"> <!-- 需要填寫送貨信息 0:不需要 1:需要 -->
<input type='hidden' name='pa_MP' value="${pa_MP}"> <!-- 商家擴展信息 -->
<input type='hidden' name='pd_FrpId' value="${pd_FrpId}"> <!-- 銀行ID -->
<!-- 應答機制 為“1”: 需要應答機制;為“0”: 不需要應答機制 -->
<input type="hidden" name="pr_NeedResponse" value="0">
<input type='hidden' name='hmac' value="${hmacValue}"><!-- MD5-hmac驗證碼 -->
<input type="submit" value="發送"/>
</form>
</body>
</html>
企業私密信息 merchantInfo.properties
p1_MerId=10000365642
keyValue=u278fHbT7JSNtox25S89342UJ3112GwDASn89YZ674445V6a183s6Aa4s3l3
merchantCallbackURL=http\://localhost\:8080/test/payResult
處理易寶返回的信息 PayResult.java
package cn.xixi.actions;

import java.util.Properties;

import org.springframework.core.io.support.PropertiesLoaderUtils;

import cn.xixi.utils.payOnlineUtil;

import com.opensymphony.xwork2.ActionSupport;

public class PayResult extends ActionSupport {
/**
* 返回校驗hmac方法
*
* @param hmac
* 支付網關發來的加密驗證碼
* @param p1_MerId
* 商戶編號
* @param r0_Cmd
* 業務類型
* @param r1_Code
* 支付結果
* @param r2_TrxId
* 易寶支付交易流水號
* @param r3_Amt
* 支付金額
* @param r4_Cur
* 交易幣種
* @param r5_Pid
* 商品名稱
* @param r6_Order
* 商戶訂單號
* @param r7_Uid
* 易寶支付會員ID
* @param r8_MP
* 商戶擴展信息
* @param r9_BType
* 交易結果返回類型
* @param keyValue
* 密鑰
* @param message
* 返回給用戶的消息
* @return
*/
private String p1_MerId; //商號
private String r0_Cmd; //業務類型
private String r1_Code; //支付結果
private String r2_TrxId; //易寶支付交易訂單號
private String r3_Amt; //支付金額
private String r4_Cur; //交易幣種
private String r5_Pid; //商品名稱
private String r6_Order; //商戶訂單號
private String r7_Uid; //易寶支付會員ID
private String r8_MP; //商戶擴展信息
private String r9_BType; //交易結果返回類型 "1"為通過用戶游覽器 "2"為服務器點對點
private String rb_BankId; //交易的銀行ID
private String ro_BankOrderId; //銀行產生的訂單ID
private String rp_PayDate; //付款ID
private String rq_CardNo; // 屬性不是很重要
private String ru_Trxtime; // 屬性不是很重要
private String hmac;
private String keyValue; //商戶自己的密鑰

private String message;//返回到游覽器提示消息
public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

public String getR0_Cmd() {
return r0_Cmd;
}

public void setR0_Cmd(String cmd) {
r0_Cmd = cmd;
}

public String getR1_Code() {
return r1_Code;
}

public void setR1_Code(String code) {
r1_Code = code;
}

public String getR2_TrxId() {
return r2_TrxId;
}

public void setR2_TrxId(String trxId) {
r2_TrxId = trxId;
}

public String getR3_Amt() {
return r3_Amt;
}

public void setR3_Amt(String amt) {
r3_Amt = amt;
}

public String getR4_Cur() {
return r4_Cur;
}

public void setR4_Cur(String cur) {
r4_Cur = cur;
}

public String getR5_Pid() {
return r5_Pid;
}

public void setR5_Pid(String pid) {
r5_Pid = pid;
}

public String getR6_Order() {
return r6_Order;
}

public void setR6_Order(String order) {
r6_Order = order;
}

public String getR7_Uid() {
return r7_Uid;
}

public void setR7_Uid(String uid) {
r7_Uid = uid;
}

public String getR8_MP() {
return r8_MP;
}

public void setR8_MP(String r8_mp) {
r8_MP = r8_mp;
}

public String getR9_BType() {
return r9_BType;
}

public void setR9_BType(String type) {
r9_BType = type;
}

public void setRb_BankId(String rb_BankId) {
this.rb_BankId = rb_BankId;
}

public void setRo_BankOrderId(String ro_BankOrderId) {
this.ro_BankOrderId = ro_BankOrderId;
}

public void setRp_PayDate(String rp_PayDate) {
this.rp_PayDate = rp_PayDate;
}

public void setRq_CardNo(String rq_CardNo) {
this.rq_CardNo = rq_CardNo;
}

public void setRu_Trxtime(String ru_Trxtime) {
this.ru_Trxtime = ru_Trxtime;
}

public void setHmac(String hmac) {
this.hmac = hmac;
}

public String execute() throws Exception {
//獲取商號和keyValue(密鑰)
Properties props=PropertiesLoaderUtils.loadAllProperties("merchantInfo.properties");
p1_MerId=props.getProperty("p1_MerId");
keyValue=props.getProperty("keyValue");
boolean isLegal=payOnlineUtil.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(isLegal){
//查看是否用戶付錢成功 r1_Code為1表示成功
if("1".equals(r1_Code)){
message="訂單號:"+r6_Order+"訂單支付成功!";
//對數據庫修改
message+="金額:"+r3_Amt+" M";
if("1".equals(r9_BType)){
message+="游覽器重定向";
}else if("2".equals(r9_BType)){
message+="支付網關后臺程序通知";
}
message+="易寶訂單中自身生成的訂單號:"+r2_TrxId;
}
}else{
message="數據來源不合法";
}
return SUCCESS;
}
}
結果顯示:result.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>連接結果</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
</head>
<body>
${message}
</body>
</html>
1.方式:通過中間企業再連接到在線銀行(特征:風險大,適合小型的付款,但是維護容易)
這里用的是 易寶 作為中間企業
A.搭建Struts的環境
下載Struts的架包-->添加空項目下的lib中的包到WEB PROJECT 中的lib中
配置 struts.xml 和 xml filter的配置
B.創建Utils工具類
DigestUtil.java 這個類是用 商戶(企業)的 密鑰(易寶分配的)和一些付款的信息加起來產生 驗證字段
package cn.xixi.utils;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class DigestUtil {
private static String encodingCharset = "UTF-8";
/**
* @param aValue
* @param aKey
* @return
*/
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(encodingCharset);
value = aValue.getBytes(encodingCharset);
} 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();
}
/**
*
* @param args
* @param key
* @return
*/
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));
}
/**
* @param aValue
* @return
*/
public static String digest(String aValue) {
aValue = aValue.trim();
byte value[];
try {
value = aValue.getBytes(encodingCharset);
} 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));
}
}
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class DigestUtil {
private static String encodingCharset = "UTF-8";
/**
* @param aValue
* @param aKey
* @return
*/
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(encodingCharset);
value = aValue.getBytes(encodingCharset);
} 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();
}
/**
*
* @param args
* @param key
* @return
*/
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));
}
/**
* @param aValue
* @return
*/
public static String digest(String aValue) {
aValue = aValue.trim();
byte value[];
try {
value = aValue.getBytes(encodingCharset);
} 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));
}
}
2.使用上面的類 加上易寶要求的字段 產生 驗證字段 hmac








































































































































































































































































































































































































轉發到connect.jsp



































企業私密信息 merchantInfo.properties























































































































































































































結果顯示:result.jsp















