SSH架构实现的基本功能——在线支付

  在线支付是指卖方与卖方通过因特网上的电子商务网站进行交易时,银行为其提供网上资金结算服务的一种业务,她为企业和个人提供了一个安全、快捷、方便的电子商务应用环境和网上资金结算工具,在线支付不仅帮助企业实现了销售款项的快速归集,缩短收款周期,同时也为个人网上银行客户提供了网上消费支付结算方式,使客户正在做到了足不出户,网上购物,不知道小伙伴们有没有这种感觉,逛街的时候,还能管住自己,少买点,因为钞票是直接通过自己的手给了卖家,但是网购就不一样了,我们直接点击鼠标,一个按钮的操作,钞票就嗖的一下打到第三方支付公司了,但是并没有啥感觉,还想买,因为没有经过自己的手,没有那么心疼,咳咳,以前的时候感觉支付特别的神秘,随着项目的进行,在小便的项目中也遇到这个功能,在线支付,今天这篇博客,小编就来简单的和小伙伴的分享一下如何使用SSH框架实现在线支付功能,希望对有需要的小伙伴有帮助,还请小伙伴们多多指教。

  要想完成在线支付的功能,首先我们来简单的来了解一下在线支付的方式,在线支付方式有两种,第一种支付方式,就是通过网站和各个银行直接进行对接,从而完成支付操作;第二种方式,网站通过和第三方公司进行对接,第三方公司再和各个银行进行对接,完成支付操作,那么两种支付方式有什么优点和缺点呢?如下所示:

  第一种支付方式:(网站直接和各个银行进行对接);

  优点:免费;

  缺点:网站需要了解各个银行的网银系统,才可以完成对接;

  第二种方式:(网站和第三方支付公司对接,第三方公司再和网站进行对接);

  优点:网站不需要了解各个网银的接口,了解第三方支付公司的接口;

  缺点:收费的,一般费用1%,安全,使用方便,支付担保业务可以在很大程度上保证付款人的收益。介绍完了支付的方式,接着结合小编的项目来分析一下在线支付的流程,在小编的项目中采用第二种支付方式,也就是网站和第三方公司对接,第三方公司再和网站进行对接;那么这中方式的流程是什么样子呢?用户访问网站,找到第三方支付公司,那么用户如何才能找到第三方公司呢?通过重定向,才能找到第三方公司,有的小伙伴可能会说,使用转发的方法,转发市过不去的,因为转发只能实现内容的跳转;第三方公司进行付款的操作,肯定要跳转到网银的界面,那么怎么样才能跳转到网银的界面呢?没错还是需要通过重定向的操作,这个时候会重定向到网银系统,网银中进行付款的操作,这个时候需要重定向到第三方支付公司,这个时候,又回到第三方支付公司,第三方支付公司付完款之后通知网站,支付成功,这个过程中都是一系列的重定向操作,这一个过程,会传递很多的数据,那么如何保证数据的安全呢?这个时候,我们需要用到电子签名,所谓的电子签名,就是指数据电文中以电子形式所含、所附用于识别签名人身份并表明签名人认可其中内容的数据。通俗点说,电子签名就是通过密码技术对电子文档的电子形式的签名,并非是书面签名的数字图像化,它类似于手写签名或印章,也可以说它就是电子印章。接着,小编画一张图来简简单的说明一下,在线支付的流程,如下图所示:

  

SSH架构实现的基本功能——在线支付_第1张图片

  ok,接着小编来详细讲解一下,如何使用SSH框架完成支付的功能,首先第一步,我们来编写jsp里面的代码,如下所示:


[java]  view plain  copy
 print ?
  1. <span style="font-size:18px;">+<%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <%@ taglib uri ="/struts-tags" prefix="s" %>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  5. <!-- saved from url=(0043)http://localhost:8080/mango/cart/list.jhtml -->  
  6. <html xmlns="http://www.w3.org/1999/xhtml">  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>  
  9.   
  10. <title>订单页面</title>  
  11. <link href="${pageContext.request.contextPath}/css/common.css" rel="stylesheet" type="text/css"/>  
  12. <link href="${pageContext.request.contextPath}/css/cart.css" rel="stylesheet" type="text/css"/>  
  13.   
  14. </head>  
  15. <body>  
  16.   
  17. <div class="container header">  
  18.     <div class="span5">  
  19.         <div class="logo">  
  20.             <a href="./网上商城/index.htm">  
  21.                 <img src="${pageContext.request.contextPath}/image/r___________renleipic_01/logo.gif" alt="传智播客"/>  
  22.             </a>  
  23.         </div>  
  24.     </div>  
  25.     <div class="span9">  
  26. <div class="headerAd">  
  27.     <img src="${pageContext.request.contextPath}/image/header.jpg" width="320" height="50" alt="正品保障" title="正品保障"/>  
  28. </div>      
  29. </div>  
  30. <%@ include file="menu.jsp" %>  
  31.       
  32.       
  33. </div>      
  34.   
  35. <div class="container cart">  
  36.   
  37.         <div class="span24">  
  38.           
  39.             <div class="step step1">  
  40.                 <ul>  
  41.                       
  42.                     <li  class="current"></li>  
  43.                     <li  >生成订单成功</li>  
  44.                 </ul>  
  45.             </div>  
  46.       
  47.           
  48.                 <table>  
  49.                     <tbody>  
  50.                     <tr>  
  51.                             <th colspan="5">订单编号:<s:property value="model.oid"/></th>  
  52.                     </tr>  
  53.                     <tr>  
  54.                         <th>图片</th>  
  55.                         <th>商品</th>  
  56.                         <th>价格</th>  
  57.                         <th>数量</th>  
  58.                         <th>小计</th>  
  59.               
  60.                     </tr>  
  61.                     <s:iterator var="orderItem" value="model.orderItems">  
  62.                         <tr>  
  63.                             <td width="60">  
  64.                                 <input type="hidden" name="id" value="22"/>  
  65.                                 <img src="${ pageContext.request.contextPath }/<s:property value="#orderItem.product.image"/>"/>  
  66.                             </td>  
  67.                             <td>  
  68.                                 <a target="_blank"><s:property value="#orderItem.product.pname"/></a>  
  69.                             </td>  
  70.                             <td>  
  71.                                 <s:property value="#orderItem.product.shop_price"/>  
  72.                             </td>  
  73.                             <td class="quantity" width="60">  
  74.                             <s:property value="#orderItem.count"/>  
  75.                                 <input type="text" name="count" value="1" maxlength="4" onpaste="return false;"/>  
  76.                               
  77.                             </td>  
  78.                             <td width="140">  
  79.                                 <span class="subtotal">¥<s:property value="#orderItem.subtotal"/></span>  
  80.                             </td>  
  81.                               
  82.                         </tr>  
  83.                     </s:iterator>  
  84.                 </tbody>  
  85.             </table>  
  86.                 <dl id="giftItems" class="hidden" style="display: none;">  
  87.                 </dl>  
  88.                 <div class="total">  
  89.                     <em id="promotion"></em>  
  90.                     商品金额: <strong id="effectivePrice">¥<s:property value="model.total"/>元</strong>  
  91.                 </div>  
  92.             <form id="orderForm" action="${pageContext.request.contextPath }/order_payOrder.action" method="post">  
  93.                     <input type="hidden" name="oid" value="<s:property value="model.oid"/>"/>  
  94.                 <div class="span24">  
  95.                     <p>  
  96.                             收货地址:<input name="addr" type="text" value="<s:property value="model.user.addr"/>" style="width:350px" />  
  97.                                 <br />  
  98.                             收货人   :<input name="name" type="text" value="<s:property value="model.user.name"/>" style="width:150px" />  
  99.                                 <br />   
  100.                             联系方式:<input name="phone" type="text"value="<s:property value="model.user.phone"/>" style="width:150px" />  
  101.   
  102.   
  103.                         </p>  
  104.                         <hr />  
  105.                         <p>  
  106.                             选择银行:<br/>  
  107.                             <input type="radio" name="pd_FrpId" value="ICBC-NET-B2C" checked="checked"/>工商银行  
  108.                             <img src="${ pageContext.request.contextPath }/bank_img/icbc.bmp" align="middle"/>      
  109.                             <input type="radio" name="pd_FrpId" value="BOC-NET-B2C"/>中国银行  
  110.                             <img src="${ pageContext.request.contextPath }/bank_img/bc.bmp" align="middle"/>      
  111.                             <input type="radio" name="pd_FrpId" value="ABC-NET-B2C"/>农业银行  
  112.                             <img src="${ pageContext.request.contextPath }/bank_img/abc.bmp" align="middle"/>  
  113.                             <br/>  
  114.                             <input type="radio" name="pd_FrpId" value="BOCO-NET-B2C"/>交通银行  
  115.                             <img src="${ pageContext.request.contextPath }/bank_img/bcc.bmp" align="middle"/>      
  116.                             <input type="radio" name="pd_FrpId" value="PINGANBANK-NET"/>平安银行  
  117.                             <img src="${ pageContext.request.contextPath }/bank_img/pingan.bmp" align="middle"/>      
  118.                             <input type="radio" name="pd_FrpId" value="CCB-NET-B2C"/>建设银行  
  119.                             <img src="${ pageContext.request.contextPath }/bank_img/ccb.bmp" align="middle"/>  
  120.                             <br/>  
  121.                             <input type="radio" name="pd_FrpId" value="CEB-NET-B2C"/>光大银行  
  122.                             <img src="${ pageContext.request.contextPath }/bank_img/guangda.bmp" align="middle"/>      
  123.                             <input type="radio" name="pd_FrpId" value="CMBCHINA-NET-B2C"/>招商银行  
  124.                             <img src="${ pageContext.request.contextPath }/bank_img/cmb.bmp" align="middle"/>  
  125.                         </p>  
  126.                         <hr />  
  127.                         <p style="text-align:right">  
  128.                             <a href="javascript:document.getElementById('orderForm').submit();">  
  129.                                 <img src="${pageContext.request.contextPath}/images/finalbutton.gif" width="204" height="51" border="0" />  
  130.                             </a>  
  131.                         </p>  
  132.                 </div>  
  133.             </form>  
  134.         </div>  
  135.           
  136.     </div>  
  137. <div class="container footer">  
  138.     <div class="span24">  
  139.         <div class="footerAd">  
  140.                     <img src="image\r___________renleipic_01/footer.jpg" alt="我们的优势" title="我们的优势" height="52" width="950">  
  141. </div>  
  142. </div>  
  143.     <div class="span24">  
  144.         <ul class="bottomNav">  
  145.                     <li>  
  146.                         <a href="#">关于我们</a>  
  147.                         |  
  148.                     </li>  
  149.                     <li>  
  150.                         <a href="#">联系我们</a>  
  151.                         |  
  152.                     </li>  
  153.                     <li>  
  154.                         <a href="#">诚聘英才</a>  
  155.                         |  
  156.                     </li>  
  157.                     <li>  
  158.                         <a href="#">法律声明</a>  
  159.                         |  
  160.                     </li>  
  161.                     <li>  
  162.                         <a>友情链接</a>  
  163.                         |  
  164.                     </li>  
  165.                     <li>  
  166.                         <a target="_blank">支付方式</a>  
  167.                         |  
  168.                     </li>  
  169.                     <li>  
  170.                         <a target="_blank">配送方式</a>  
  171.                         |  
  172.                     </li>  
  173.                     <li>  
  174.                         <a >SHOP++官网</a>  
  175.                         |  
  176.                     </li>  
  177.                     <li>  
  178.                         <a>SHOP++论坛</a>  
  179.                           
  180.                     </li>  
  181.         </ul>  
  182.     </div>  
  183.     <div class="span24">  
  184.         <div class="copyright">Copyright © 2005-2015 网上商城 版权所有</div>  
  185.     </div>  
  186. </div>  
  187. </body>  
  188. </html></span>  
       

  第二步,我们需要接收支付的通道,编码如下所示:

[java]  view plain  copy
 print ?
  1. <span style="font-size:18px;">package cn.itcast.shop.cart.action;  
  2. import org.apache.struts2.ServletActionContext;  
  3. import cn.itcast.shop.cart.vo.Cart;  
  4. import cn.itcast.shop.cart.vo.CartItem;  
  5. import cn.itcast.shop.product.service.ProductService;  
  6. import cn.itcast.shop.product.vo.Product;  
  7. import com.opensymphony.xwork2.ActionSupport;  
  8.   
  9. /** 
  10.  * 购物车Action 
  11.  *  
  12.  * @author 丁国华 
  13.  *  
  14.  */  
  15. public class CartAction extends ActionSupport {  
  16.     // 接收pid  
  17.     private Integer pid;  
  18.     // 接收数量count  
  19.     private Integer count;  
  20.     // 注入商品的Service  
  21.     private ProductService productService;  
  22.   
  23.     public void setProductService(ProductService productService) {  
  24.         this.productService = productService;  
  25.     }  
  26.   
  27.     public void setPid(Integer pid) {  
  28.         this.pid = pid;  
  29.     }  
  30.   
  31.     public void setCount(Integer count) {  
  32.         this.count = count;  
  33.     }  
  34.   
  35.     // 将购物项添加到购物车:执行的方法  
  36.     public String addCart() {  
  37.         // 封装一个CartItem对象.  
  38.         CartItem cartItem = new CartItem();  
  39.         // 设置数量:  
  40.         cartItem.setCount(count);  
  41.         // 根据pid进行查询商品:  
  42.         Product product = productService.findByPid(pid);  
  43.         // 设置商品:  
  44.         cartItem.setProduct(product);  
  45.         // 将购物项添加到购物车.  
  46.         // 购物车应该存在session中.  
  47.         Cart cart = getCart();  
  48.         cart.addCart(cartItem);  
  49.         return "addCart";  
  50.     }  
  51.   
  52.     // 清空购物车的执行的方法:  
  53.     public String clearCart(){  
  54.         // 获得购物车对象.  
  55.         Cart cart = getCart();  
  56.         // 调用购物车中清空方法.  
  57.         cart.clearCart();  
  58.         return "clearCart";  
  59.     }  
  60.       
  61.     // 从购物车中移除购物项的方法:  
  62.     public String removeCart(){  
  63.         // 获得购物车对象  
  64.         Cart cart = getCart();  
  65.         // 调用购物车中移除的方法:  
  66.         cart.removeCart(pid);  
  67.         // 返回页面:  
  68.         return "removeCart";  
  69.     }  
  70.       
  71.     // 我的购物车:执行的方法  
  72.     public String myCart(){  
  73.         return "myCart";  
  74.     }  
  75.       
  76.     /** 
  77.      * 获得购物车的方法:从session中获得购物车. 
  78.      * @return 
  79.      */  
  80.     private Cart getCart() {  
  81.         Cart cart = (Cart) ServletActionContext.getRequest().getSession()  
  82.                 .getAttribute("cart");  
  83.         if (cart == null) {  
  84.             cart = new Cart();  
  85.             ServletActionContext.getRequest().getSession()  
  86.                     .setAttribute("cart", cart);  
  87.         }  
  88.         return cart;  
  89.     }  
  90. }  
  91. </span>  
       第三步,编写orderService里面的代码如下所示:

[java]  view plain  copy
 print ?
  1. <span style="font-size:18px;">package cn.itcast.shop.order.service;  
  2. import java.util.List;  
  3. import org.springframework.transaction.annotation.Transactional;  
  4. import cn.itcast.shop.order.dao.OrderDao;  
  5. import cn.itcast.shop.order.vo.Order;  
  6. import cn.itcast.shop.utils.PageBean;  
  7.   
  8. /** 
  9.  * 订单模块,业务层代码 
  10.  * @author丁国华 
  11.  * 
  12.  */  
  13. @Transactional  
  14. public class OrderService {  
  15.     private OrderDao orderDao;  
  16.       
  17.     public void setOrderDao(OrderDao orderDao) {  
  18.         this.orderDao = orderDao;  
  19.     }  
  20.       
  21.     //保存订单的业务层代码  
  22.     public void save(Order order) {  
  23.         orderDao.save(order);     
  24.     }  
  25.     //我的订单业务层的代码  
  26.     public PageBean<Order> findByPageUid(Integer uid, Integer page) {  
  27.         PageBean<Order> pageBean = new PageBean<Order>();  
  28.         //设置当前页数  
  29.         pageBean.setPage(page);  
  30.         //设置当前显示的记录数;  
  31.         Integer limit = 5;  
  32.         pageBean.setLimit(limit);  
  33.         //设置总记录数  
  34.         Integer totalCount = null;  
  35.         totalCount=orderDao.findByCountUid(uid);  
  36.         pageBean.setTotalCount(totalCount);  
  37.         //设置总页数  
  38.         Integer totalPage = null;  
  39.         if(totalCount % limit==0){  
  40.             totalPage = totalCount/limit;  
  41.         }else{  
  42.             totalPage = totalCount/limit+1;  
  43.               
  44.         }  
  45.         pageBean.setTotalPage(totalPage);  
  46.         //设置每页显示数据集合  
  47.         Integer begin = (page -1) * limit;  
  48.         List<Order> list = orderDao.findByPageUid(uid,begin,limit);  
  49.         pageBean.setList(list);  
  50.         return pageBean;  
  51.     }  
  52.     //业务层:根据订单id查询订单  
  53.     public Order findByOid(Integer oid) {  
  54.       
  55.         return orderDao.findByOid(oid);  
  56.     }  
  57.     //业务层修改订单的操作  
  58.     public void update(Order currOrder) {  
  59.         orderDao.update(currOrder);  
  60.           
  61.           
  62.     }  
  63.       
  64.   
  65. }</span>  

       第四步,编写orderDao里面的代码,如下所示:

[java]  view plain  copy
 print ?
  1. <span style="font-size:18px;">package cn.itcast.shop.order.dao;  
  2. import java.util.List;  
  3. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
  4. import cn.itcast.shop.order.vo.Order;  
  5. import cn.itcast.shop.utils.PageHibernateCallback;  
  6. /** 
  7.  * 订单模块Dao层的代码 
  8.  *  
  9.  * @author 丁国华 
  10.  * 
  11.  */  
  12. public class OrderDao extends HibernateDaoSupport {  
  13.     //保存订单的业务层代码  
  14.     public void save(Order order) {  
  15.         this.getHibernateTemplate().save(order);  
  16.     }  
  17.     //DAO层的我的订单的个数的统计  
  18.     public Integer findByCountUid(Integer uid) {  
  19.         String hql ="select count(*) from Order o where o.user.uid=? ";  
  20.         List<Long> list = this.getHibernateTemplate().find(hql,uid);  
  21.         if(list != null && list.size()>0){  
  22.             return list.get(0).intValue();  
  23.         }  
  24.         return null;  
  25.     }  
  26.     //DAO层的我的订单的查询  
  27.     public List<Order> findByPageUid(Integer uid, Integer begin, Integer limit) {  
  28.         String hql ="from Order o where o.user.uid=? order by ordertime desc";  
  29.         List<Order> list=this.getHibernateTemplate().execute(new PageHibernateCallback<Order>(hql,new Object[]{uid},begin,limit));  
  30.         return list;  
  31.     }  
  32.       
  33.     public Order findByOid(Integer oid) {  
  34.         return this.getHibernateTemplate().get(Order.class,oid);  
  35.     }  
  36.     //DAO层的修改订单的操作  
  37.     public void update(Order currOrder) {  
  38.         this.getHibernateTemplate().update(currOrder);  
  39.           
  40.     }     
  41.   
  42. }</span>  

       第五步,获取hmac,由一个算法和密钥来获得,代码如下所示:

[java]  view plain  copy
 print ?
  1. <span style="font-size:18px;">package cn.itcast.shop.utils;  
  2. import java.io.UnsupportedEncodingException;  
  3. import java.security.MessageDigest;  
  4. import java.security.NoSuchAlgorithmException;  
  5. import java.util.Arrays;  
  6. public class PaymentUtil {  
  7.   
  8.     private static String encodingCharset = "UTF-8";  
  9.       
  10.     /** 
  11.      * 生成hmac方法 
  12.      *  
  13.      * @param p0_Cmd 业务类型 
  14.      * @param p1_MerId 商户编号 
  15.      * @param p2_Order 商户订单号 
  16.      * @param p3_Amt 支付金额 
  17.      * @param p4_Cur 交易币种 
  18.      * @param p5_Pid 商品名称 
  19.      * @param p6_Pcat 商品种类 
  20.      * @param p7_Pdesc 商品描述 
  21.      * @param p8_Url 商户接收支付成功数据的地址 
  22.      * @param p9_SAF 送货地址 
  23.      * @param pa_MP 商户扩展信息 
  24.      * @param pd_FrpId 银行编码 
  25.      * @param pr_NeedResponse 应答机制 
  26.      * @param keyValue 商户密钥 
  27.      * @return 
  28.      */  
  29.     public static String buildHmac(String p0_Cmd,String p1_MerId,  
  30.             String p2_Order, String p3_Amt, String p4_Cur,String p5_Pid, String p6_Pcat,  
  31.             String p7_Pdesc,String p8_Url, String p9_SAF,String pa_MP,String pd_FrpId,  
  32.             String pr_NeedResponse,String keyValue) {  
  33.         StringBuilder sValue = new StringBuilder();  
  34.         // 业务类型  
  35.         sValue.append(p0_Cmd);  
  36.         // 商户编号  
  37.         sValue.append(p1_MerId);  
  38.         // 商户订单号  
  39.         sValue.append(p2_Order);  
  40.         // 支付金额  
  41.         sValue.append(p3_Amt);  
  42.         // 交易币种  
  43.         sValue.append(p4_Cur);  
  44.         // 商品名称  
  45.         sValue.append(p5_Pid);  
  46.         // 商品种类  
  47.         sValue.append(p6_Pcat);  
  48.         // 商品描述  
  49.         sValue.append(p7_Pdesc);  
  50.         // 商户接收支付成功数据的地址  
  51.         sValue.append(p8_Url);  
  52.         // 送货地址  
  53.         sValue.append(p9_SAF);  
  54.         // 商户扩展信息  
  55.         sValue.append(pa_MP);  
  56.         // 银行编码  
  57.         sValue.append(pd_FrpId);  
  58.         // 应答机制  
  59.         sValue.append(pr_NeedResponse);  
  60.           
  61.         return PaymentUtil.hmacSign(sValue.toString(), keyValue);  
  62.     }  
  63.       
  64.     /** 
  65.      * 返回校验hmac方法 
  66.      *  
  67.      * @param hmac 支付网关发来的加密验证码 
  68.      * @param p1_MerId 商户编号 
  69.      * @param r0_Cmd 业务类型 
  70.      * @param r1_Code 支付结果 
  71.      * @param r2_TrxId 易宝支付交易流水号 
  72.      * @param r3_Amt 支付金额 
  73.      * @param r4_Cur 交易币种 
  74.      * @param r5_Pid 商品名称 
  75.      * @param r6_Order 商户订单号 
  76.      * @param r7_Uid 易宝支付会员ID 
  77.      * @param r8_MP 商户扩展信息 
  78.      * @param r9_BType 交易结果返回类型 
  79.      * @param keyValue 密钥 
  80.      * @return 
  81.      */  
  82.     public static boolean verifyCallback(String hmac, String p1_MerId,  
  83.             String r0_Cmd, String r1_Code, String r2_TrxId, String r3_Amt,  
  84.             String r4_Cur, String r5_Pid, String r6_Order, String r7_Uid,  
  85.             String r8_MP, String r9_BType, String keyValue) {  
  86.         StringBuilder sValue = new StringBuilder();  
  87.         // 商户编号  
  88.         sValue.append(p1_MerId);  
  89.         // 业务类型  
  90.         sValue.append(r0_Cmd);  
  91.         // 支付结果  
  92.         sValue.append(r1_Code);  
  93.         // 易宝支付交易流水号  
  94.         sValue.append(r2_TrxId);  
  95.         // 支付金额  
  96.         sValue.append(r3_Amt);  
  97.         // 交易币种  
  98.         sValue.append(r4_Cur);  
  99.         // 商品名称  
  100.         sValue.append(r5_Pid);  
  101.         // 商户订单号  
  102.         sValue.append(r6_Order);  
  103.         // 易宝支付会员ID  
  104.         sValue.append(r7_Uid);  
  105.         // 商户扩展信息  
  106.         sValue.append(r8_MP);  
  107.         // 交易结果返回类型  
  108.         sValue.append(r9_BType);  
  109.         String sNewString = PaymentUtil.hmacSign(sValue.toString(), keyValue);  
  110.         return sNewString.equals(hmac);  
  111.     }  
  112.       
  113.     /** 
  114.      * @param aValue 
  115.      * @param aKey 
  116.      * @return 
  117.      */  
  118.     public static String hmacSign(String aValue, String aKey) {  
  119.         byte k_ipad[] = new byte[64];  
  120.         byte k_opad[] = new byte[64];  
  121.         byte keyb[];  
  122.         byte value[];  
  123.         try {  
  124.             keyb = aKey.getBytes(encodingCharset);  
  125.             value = aValue.getBytes(encodingCharset);  
  126.         } catch (UnsupportedEncodingException e) {  
  127.             keyb = aKey.getBytes();  
  128.             value = aValue.getBytes();  
  129.         }  
  130.   
  131.         Arrays.fill(k_ipad, keyb.length, 64, (byte54);  
  132.         Arrays.fill(k_opad, keyb.length, 64, (byte92);  
  133.         for (int i = 0; i < keyb.length; i++) {  
  134.             k_ipad[i] = (byte) (keyb[i] ^ 0x36);  
  135.             k_opad[i] = (byte) (keyb[i] ^ 0x5c);  
  136.         }  
  137.   
  138.         MessageDigest md = null;  
  139.         try {  
  140.             md = MessageDigest.getInstance("MD5");  
  141.         } catch (NoSuchAlgorithmException e) {  
  142.   
  143.             return null;  
  144.         }  
  145.         md.update(k_ipad);  
  146.         md.update(value);  
  147.         byte dg[] = md.digest();  
  148.         md.reset();  
  149.         md.update(k_opad);  
  150.         md.update(dg, 016);  
  151.         dg = md.digest();  
  152.         return toHex(dg);  
  153.     }  
  154.   
  155.     public static String toHex(byte input[]) {  
  156.         if (input == null)  
  157.             return null;  
  158.         StringBuffer output = new StringBuffer(input.length * 2);  
  159.         for (int i = 0; i < input.length; i++) {  
  160.             int current = input[i] & 0xff;  
  161.             if (current < 16)  
  162.                 output.append("0");  
  163.             output.append(Integer.toString(current, 16));  
  164.         }  
  165.   
  166.         return output.toString();  
  167.     }  
  168.   
  169.     /** 
  170.      *  
  171.      * @param args 
  172.      * @param key 
  173.      * @return 
  174.      */  
  175.     public static String getHmac(String[] args, String key) {  
  176.         if (args == null || args.length == 0) {  
  177.             return (null);  
  178.         }  
  179.         StringBuffer str = new StringBuffer();  
  180.         for (int i = 0; i < args.length; i++) {  
  181.             str.append(args[i]);  
  182.         }  
  183.         return (hmacSign(str.toString(), key));  
  184.     }  
  185.   
  186.     /** 
  187.      * @param aValue 
  188.      * @return 
  189.      */  
  190.     public static String digest(String aValue) {  
  191.         aValue = aValue.trim();  
  192.         byte value[];  
  193.         try {  
  194.             value = aValue.getBytes(encodingCharset);  
  195.         } catch (UnsupportedEncodingException e) {  
  196.             value = aValue.getBytes();  
  197.         }  
  198.         MessageDigest md = null;  
  199.         try {  
  200.             md = MessageDigest.getInstance("SHA");  
  201.         } catch (NoSuchAlgorithmException e) {  
  202.             e.printStackTrace();  
  203.             return null;  
  204.         }  
  205.         return toHex(md.digest(value));  
  206.   
  207.     }  
  208.       
  209. }  
  210. </span>  

你可能感兴趣的:(SSH架构实现的基本功能——在线支付)