java网上图书商城(9)支付模块

本文实例为大家分享了java网上商城支付模块的具体代码,供大家参考,具体内容如下

1.支付准备

public String paymentPre(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException, IOException {
 req.setAttribute("order", orderService.load(req.getParameter("oid")));
 return "f:/jsps/order/pay.jsp";
}

 2.支付方法

public String payment(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException, IOException {
 Properties props = new Properties();
 props.load(this.getClass().getClassLoader().getResourceAsStream("payment.properties"));
 /*
  * 1. 准备13个参数
  */
 String p0_Cmd = "Buy";//业务类型,固定值Buy
 String p1_MerId = props.getProperty("p1_MerId");//商号编码,在易宝的唯一标识
 String p2_Order = req.getParameter("oid");//订单编码
 String p3_Amt = "0.01";//支付金额
 String p4_Cur = "CNY";//交易币种,固定值CNY
 String p5_Pid = "";//商品名称
 String p6_Pcat = "";//商品种类
 String p7_Pdesc = "";//商品描述
 String p8_Url = props.getProperty("p8_Url");//在支付成功后,易宝会访问这个地址。
 String p9_SAF = "";//送货地址
 String pa_MP = "";//扩展信息
 String pd_FrpId = req.getParameter("yh");//支付通道
 String pr_NeedResponse = "1";//应答机制,固定值1

 /*
  * 2. 计算hmac
  * 需要13个参数
  * 需要keyValue
  * 需要加密算法
  */
 String keyValue = props.getProperty("keyValue");
 String hmac = PaymentUtil.buildHmac(p0_Cmd, p1_MerId, p2_Order, p3_Amt,
   p4_Cur, p5_Pid, p6_Pcat, p7_Pdesc, p8_Url, p9_SAF, pa_MP,
   pd_FrpId, pr_NeedResponse, keyValue);

 /*
  * 3. 重定向到易宝的支付网关
  */
 StringBuilder sb = new StringBuilder("https://www.yeepay.com/app-merchant-proxy/node");
 sb.append("?").append("p0_Cmd=").append(p0_Cmd);
 sb.append("&").append("p1_MerId=").append(p1_MerId);
 sb.append("&").append("p2_Order=").append(p2_Order);
 sb.append("&").append("p3_Amt=").append(p3_Amt);
 sb.append("&").append("p4_Cur=").append(p4_Cur);
 sb.append("&").append("p5_Pid=").append(p5_Pid);
 sb.append("&").append("p6_Pcat=").append(p6_Pcat);
 sb.append("&").append("p7_Pdesc=").append(p7_Pdesc);
 sb.append("&").append("p8_Url=").append(p8_Url);
 sb.append("&").append("p9_SAF=").append(p9_SAF);
 sb.append("&").append("pa_MP=").append(pa_MP);
 sb.append("&").append("pd_FrpId=").append(pd_FrpId);
 sb.append("&").append("pr_NeedResponse=").append(pr_NeedResponse);
 sb.append("&").append("hmac=").append(hmac);

 resp.sendRedirect(sb.toString());
 return null;
}

3.回馈方法

当支付成功时,易宝会访问这里
用两种方法访问:
1. 引导用户的浏览器重定向(如果用户关闭了浏览器,就不能访问这里了)
2. 易宝的服务器会使用点对点通讯的方法访问这个方法。(必须回馈success,不然易宝服务器会一直调用这个方法)

public String back(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException, IOException {
 /*
  * 1. 获取12个参数
  */
 String p1_MerId = req.getParameter("p1_MerId");
 String r0_Cmd = req.getParameter("r0_Cmd");
 String r1_Code = req.getParameter("r1_Code");
 String r2_TrxId = req.getParameter("r2_TrxId");
 String r3_Amt = req.getParameter("r3_Amt");
 String r4_Cur = req.getParameter("r4_Cur");
 String r5_Pid = req.getParameter("r5_Pid");
 String r6_Order = req.getParameter("r6_Order");
 String r7_Uid = req.getParameter("r7_Uid");
 String r8_MP = req.getParameter("r8_MP");
 String r9_BType = req.getParameter("r9_BType");
 String hmac = req.getParameter("hmac");
 /*
  * 2. 获取keyValue
  */
 Properties props = new Properties();
 props.load(this.getClass().getClassLoader().getResourceAsStream("payment.properties"));
 String keyValue = props.getProperty("keyValue");
 /*
  * 3. 调用PaymentUtil的校验方法来校验调用者的身份
  * >如果校验失败:保存错误信息,转发到msg.jsp
  * >如果校验通过:
  *  * 判断访问的方法是重定向还是点对点,如果要是重定向
  *  修改订单状态,保存成功信息,转发到msg.jsp
  *  * 如果是点对点:修改订单状态,返回success
  */
 boolean bool = 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(!bool) {
  req.setAttribute("code", "error");
  req.setAttribute("msg", "无效的签名,支付失败!(你不是好人)");
  return "f:/jsps/msg.jsp";
 }
 if(r1_Code.equals("1")) {
  orderService.updateStatus(r6_Order, 2);
  if(r9_BType.equals("1")) {
   req.setAttribute("code", "success");
   req.setAttribute("msg", "恭喜,支付成功!");
   return "f:/jsps/msg.jsp";
  } else if(r9_BType.equals("2")) {
   resp.getWriter().print("success");
  }
 }
 return null;
}

4.pay.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
 <title>pay.jsp</title>

 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css">
 -->
 <link rel="stylesheet" type="text/css" href="<c:url value='/jsps/css/order/pay.css'/>">
 <script type="text/javascript" src="<c:url value='/jquery/jquery-1.5.1.js'/>"></script>

<script type="text/javascript">
$(function() {
 $("img").click(function() {
  $("#" + $(this).attr("name")).attr("checked", true);
 });
});
</script>
 </head>

 <body>
<div class="divContent">
 <span class="spanPrice">支付金额:</span><span class="price_t">¥${order.total }</span>
 <span class="spanOid">编号:${order.oid }</span>
</div>
<form action="<c:url value='/OrderServlet'/>" method="post" id="form1" target="_top">
<input type="hidden" name="method" value="payment"/>
<input type="hidden" name="oid" value="${order.oid }"/>
<div class="divBank">
 <div class="divText">选择网上银行</div>
 <div style="margin-left: 20px;">
  <div style="margin-bottom: 20px;">
  <input id="ICBC-NET-B2C" type="radio" name="yh" value="ICBC-NET-B2C" checked="checked"/>
  <img name="ICBC-NET-B2C" align="middle" src="<c:url value='/bank_img/icbc.bmp'/>"/>

  <input id="CMBCHINA-NET-B2C" type="radio" name="yh" value="CMBCHINA-NET-B2C"/>
  <img name="CMBCHINA-NET-B2C" align="middle" src="<c:url value='/bank_img/cmb.bmp'/>"/>

  <input id="ABC-NET-B2C" type="radio" name="yh" value="ABC-NET-B2C"/>
  <img name="ABC-NET-B2C" align="middle" src="<c:url value='/bank_img/abc.bmp'/>"/>

  <input id="CCB-NET-B2C" type="radio" name="yh" value="CCB-NET-B2C"/>
  <img name="CCB-NET-B2C" align="middle" src="<c:url value='/bank_img/ccb.bmp'/>"/>
  </div>
  <div style="margin-bottom: 20px;">
  <input id="BCCB-NET-B2C" type="radio" name="yh" value="BCCB-NET-B2C"/>
  <img name="BCCB-NET-B2C" align="middle" src="<c:url value='/bank_img/bj.bmp'/>"/>

  <input id="BOCO-NET-B2C" type="radio" name="yh" value="BOCO-NET-B2C"/>
  <img name="BOCO-NET-B2C" align="middle" src="<c:url value='/bank_img/bcc.bmp'/>"/>

  <input id="CIB-NET-B2C" type="radio" name="yh" value="CIB-NET-B2C"/>
  <img name="CIB-NET-B2C" align="middle" src="<c:url value='/bank_img/cib.bmp'/>"/>

  <input id="NJCB-NET-B2C" type="radio" name="yh" value="NJCB-NET-B2C"/>
  <img name="NJCB-NET-B2C" align="middle" src="<c:url value='/bank_img/nanjing.bmp'/>"/>
  </div>
  <div style="margin-bottom: 20px;">
  <input id="CMBC-NET-B2C" type="radio" name="yh" value="CMBC-NET-B2C"/>
  <img name="CMBC-NET-B2C" align="middle" src="<c:url value='/bank_img/cmbc.bmp'/>"/>

  <input id="CEB-NET-B2C" type="radio" name="yh" value="CEB-NET-B2C"/>
  <img name="CEB-NET-B2C" align="middle" src="<c:url value='/bank_img/guangda.bmp'/>"/>

  <input id="BOC-NET-B2C" type="radio" name="yh" value="BOC-NET-B2C"/>
  <img name="BOC-NET-B2C" align="middle" src="<c:url value='/bank_img/bc.bmp'/>"/>

  <input id="PINGANBANK-NET" type="radio" name="yh" value="PINGANBANK-NET"/>
  <img name="PINGANBANK-NET" align="middle" src="<c:url value='/bank_img/pingan.bmp'/>"/>
  </div>
  <div style="margin-bottom: 20px;">
  <input id="CBHB-NET-B2C" type="radio" name="yh" value="CBHB-NET-B2C"/>
  <img name="CBHB-NET-B2C" align="middle" src="<c:url value='/bank_img/bh.bmp'/>"/>

  <input id="HKBEA-NET-B2C" type="radio" name="yh" value="HKBEA-NET-B2C"/>
  <img name="HKBEA-NET-B2C" align="middle" src="<c:url value='/bank_img/dy.bmp'/>"/>

  <input id="NBCB-NET-B2C" type="radio" name="yh" value="NBCB-NET-B2C"/>
  <img name="NBCB-NET-B2C" align="middle" src="<c:url value='/bank_img/ningbo.bmp'/>"/>

  <input id="ECITIC-NET-B2C" type="radio" name="yh" value="ECITIC-NET-B2C"/>
  <img name="ECITIC-NET-B2C" align="middle" src="<c:url value='/bank_img/zx.bmp'/>"/>
  </div>
  <div style="margin-bottom: 20px;">
  <input id="SDB-NET-B2C" type="radio" name="yh" value="SDB-NET-B2C"/>
  <img name="SDB-NET-B2C" align="middle" src="<c:url value='/bank_img/sfz.bmp'/>"/>

  <input id="GDB-NET-B2C" type="radio" name="yh" value="GDB-NET-B2C"/>
  <img name="GDB-NET-B2C" align="middle" src="<c:url value='/bank_img/gf.bmp'/>"/>

  <input id="SHB-NET-B2C" type="radio" name="yh" value="SHB-NET-B2C"/>
  <img name="SHB-NET-B2C" align="middle" src="<c:url value='/bank_img/sh.bmp'/>"/>

  <input id="SPDB-NET-B2C" type="radio" name="yh" value="SPDB-NET-B2C"/>
  <img name="SPDB-NET-B2C" align="middle" src="<c:url value='/bank_img/shpd.bmp'/>"/>
  </div>
  <div style="margin-bottom: 20px;">
  <input id="POST-NET-B2C" type="radio" name="yh" value="POST-NET-B2C"/>
  <img name="POST-NET-B2C" align="middle" src="<c:url value='/bank_img/post.bmp'/>"/>

  <input id="BJRCB-NET-B2C" type="radio" name="yh" value="BJRCB-NET-B2C"/>
  <img name="BJRCB-NET-B2C" align="middle" src="<c:url value='/bank_img/beijingnongshang.bmp'/>"/>

  <input id="HXB-NET-B2C" type="radio" name="yh" value="HXB-NET-B2C"/>
  <img name="HXB-NET-B2C" align="middle" src="<c:url value='/bank_img/hx.bmp'/>"/>

  <input id="CZ-NET-B2C" type="radio" name="yh" value="CZ-NET-B2C"/>
  <img name="CZ-NET-B2C" align="middle" src="<c:url value='/bank_img/zheshang.bmp'/>"/>
  </div>
 </div>
 <div style="margin: 40px;">
  <a href="javascript:void $('#form1').submit();" class="linkNext">下一步</a>
 </div>
</div>
</form>
 </body>
</html>

payment.properties

p1_MerId=10001126856
keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl
p8_Url=http\://localhost\:8080/goods/OrderServlet?method\=back

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SSH框架网上商城项目第26战之订单支付后发送短信提醒

    上一节我们使用了Java mail完成了给买家发送邮件的功能,还遗留一个功能,就是给买家发送短信,告诉他订单已经生成之类的.这一节主要介绍一下如何在用户支付完成后自动给用户发送短信. 1. 申请短信发送功能 很明显,我们自己不能发短信,也没有做短信的功能,所以我们需要去借助第三方的运营商.但是像中国移动,联通,电信这种不会直接给我们提供短信服务,而是先把短信服务提供给一些运营商,然后这些运营商再提供给我们. 有一个运营商叫"中国网建sms短信通"(官网地址).这个运营商可以给我们提供短

  • SSH框架网上商城项目第30战之项目总结(附源码下载地址)

    0. 写在前面 友情提示:下载地址在下面哦. 项目基本完成了,加上这个总结,与这个项目相关的博客也写了30篇了,积少成多,写博客的过程是固化思路的一个过程,对自己很有用,同时也能帮助别人.顺便说个题外话,在学习的过程中肯定会遇到很多异常出现,我们要做的首先是定位这个异常,一般异常的后面都会跟一个或多个Caused by:xxx,这些都是引起异常的原因,一般我们找最下面的一个Caused by,那里往往才是问题的根源.如果自己解决不了,可以去谷歌.百度搜索(搜索的时候别一大堆异常往上一贴,注意搜关

  • SSH框架网上商城项目第22战之银行图标以及支付页面显示

    从上一节的小demo中我们搞清楚了如何跟易宝对接以及易宝的支付流程.这一节我们来做一下支付页面以及在页面中导入银行图标. 1. 存储银行图标 银行图标一般不会总是去加载,因为这些东西是死的,没必要每次进入支付页面就去加载银行图标,这样性能会受到一定的影响.这让我们联想到了之前的加载首页数据了,其实跟那个道理是一样的,我们可以在项目启动的时候就将银行图标资源加载到application中,后面用到了就直接在application域中取就行了.所以跟原来一样,我们在监听器中加载银行图标. 银行图标易

  • SSH框架网上商城项目第21战之详解易宝支付的流程

    这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后,再做实际的开发,因为是一个Demo,所以我没有考虑一些设计模式的东西,就是直接实现支付功能.实现支付功能需要易宝给我们提供的API.那么问题来了,使用第三方支付平台最主要的一件事就是获取该平台的API,我们首先得获取他们的API以及开发文档,然后才可以做进一步的开发. 1. 获取易宝的API 获取API的第一步,要在易宝上注册一个账号,这个账号是商家的账号,后面买家付款后,会将钱款存入该账号中,然后商家自己提取到银行卡,易宝

  • SSH框架网上商城项目第20战之在线支付平台

    之前已经完成了首页的显示,用户添加购物车,确认订单等功能,下面就是支付功能的开发了.用户确认了订单后会直接跳转到支付页面进行在线支付,在线支付需要第三方的接口,这一节主要介绍一些关于第三方支付的内容,从下一节开始,我们真正开发在线支付模块. 1. 在线支付介绍 在线支付是指卖方与买方通过因特网上的电子商务网站进行交易时,银行为其提供网上资金结算服务的一种业务.它为企业和个人提供了一个安全.快捷.方便的电子商务应用环境和网上资金结算工具.在线支付不仅帮助企业实现了销售款项的快速归集,缩短收款周期,

  • java网上图书商城(2)Category模块

    本文实例为大家分享了java网上图书商城Category模块代码,供大家参考,具体内容如下 sql CREATE TABLE `t_category` ( `cid` char(32) NOT NULL, `cname` varchar(50) DEFAULT NULL, `pid` char(32) DEFAULT NULL, `desc` varchar(100) DEFAULT NULL, `orderBy` int(11) NOT NULL AUTO_INCREMENT, PRIMARY

  • php网上商城购物车设计代码分享

    首先,购物车的数据库设计: 1. id 2. goods_id 商品ID 3. session_id 购物车ID 4. goods_sn 商品编码 5. goods_name 商品名称 6. shop_price 商品商城售价 7. goods_price 商品真实售价(与shop_price的区别在于,当打折的时候,shop_price是打折之前商品的售价,而goods_price是打折之后的) 8. goods_number 数量 9. weight 商品重量 10. goods_attr

  • java网上图书商城(7)订单模块2

    本文实例为大家分享了java网上图书商城订单模块的具体代码,供大家参考,具体内容如下 1.我的订单---查 按用户查询订单 分页查询 PageBean<Order> <div class="divMain"> <div class="divTitle"> <span style="margin-left: 150px;margin-right: 280px;">商品信息</span> &

  • java网上图书商城(4)购物车模块1

    本文实例为大家分享了购物车模块的具体代码,供大家参考,具体内容如下 使用的不是session,也不是cookie,而是表 > 添加购物条目 > 修改购物条目的数量 > 删除条目 > 批量删除条目 > 我的购物车,即按用户查询条目 > 查询勾选的条目 1.数据表 复制代码 代码如下: insert  into `t_cartitem`(`cartItemId`,`quantity`,`bid`,`uid`,`orderBy`) values ('B8939FC551314

  • SSH框架网上商城项目第23战之在线支付功能实现

    上一节我们做好了支付页面的显示,从上一节支付页面显示的jsp代码中可以看出,当用户点击确认支付时,会跳到${shop}/pay_goBank.action的action,也就是说,提交后我们得在payAction中的goBank方法中处理一些逻辑(即21节demo中的那个流程图的逻辑),即获得明文,将明文加密成签名(密文)然后再去访问易宝服务器,易宝连接银行,完成支付. 但是考虑到MVC设计模式,我们会将上面这些业务逻辑放到Service层中处理,所以下面我们来实现21节中那个demo的支付逻辑

随机推荐