-
List findOrderItem(String ordernum);
-
}
接口的实现
[java] view plain copy
-
public class OrderDaoImpl implements OrderDao {
-
private QueryRunner qr=new QueryRunner(C3P0Util.getDataSource());
-
//保存订单
-
@Override
-
public void save(Order order) {
-
try {
-
qr.update("insert into orders (ordernum,price,number,status,customerId) values (?,?,?,?,?)",
-
order.getOrdernum(),order.getPrice(),order.getNumber(),order.getStatus(),
-
order.getCustomer()==null?null:order.getCustomer().getId());
-
List items = order.getItems();
-
for(OrderItem item:items){
-
qr.update("insert into orderitems (id,number,price,ordernum,bookid) values (?,?,?,?,?)",
-
item.getId(),item.getNumber(),item.getPrice(),order.getOrdernum(),item.getBook()==null?null:item.getBook().getId());
-
}
-
} catch (SQLException e) {
-
throw new RuntimeException(e);
-
}
-
}
-
public Order findByNum(String ordernum) {
-
try {
-
Order order = qr.query("select * from orders where ordernum=?", new BeanHandler(Order.class), ordernum);
-
if(order!=null){
-
Customer customer = qr.query("select * from customers where id=(select customerId from orders where ordernum=?)", new BeanHandler(Customer.class), ordernum);
-
order.setCustomer(customer);
-
}
-
return order;
-
} catch (SQLException e) {
-
throw new RuntimeException(e);
-
}
-
}
-
public void update(Order order) {
-
try {
-
qr.update("update orders set price=?,number=?,status=? where ordernum=?", order.getPrice(),order.getNumber(),order.getStatus(),order.getOrdernum());
-
} catch (SQLException e) {
-
throw new RuntimeException(e);
-
}
-
}
-
@Override
-
public List findByCustomerId(String customerId) {
-
try {
-
List orders=qr.query("select * from orders where customerId=? order by ordernum desc ", new BeanListHandler(Order.class),customerId);
-
if(orders!=null){
-
Customer customer=qr.query("select * from customers where id=? ",new BeanHandler(Customer.class),customerId);
-
for (Order order : orders) {
-
order.setCustomer(customer);
-
}
-
}
-
return orders;
-
} catch (SQLException e) {
-
throw new RuntimeException(e);
-
}
-
}
-
@Override
-
public List findOrderItem(String ordernum) {
-
try {
-
List items = qr.query("select * from orderitems where ordernum=?", new BeanListHandler(OrderItem.class), ordernum);
-
if(items!=null){
-
for(OrderItem o:items){
-
Book book = qr.query("select * from books where id=(select bookId from orderitems where id=?)", new BeanHandler(Book.class), o.getId());
-
o.setBook(book);
-
}
-
}
-
return items;
-
} catch (SQLException e) {
-
throw new RuntimeException(e);
-
}
-
}
-
}
四、Service的设计
[java] view plain copy
-
//生成订单
-
void genOrder(Order order);
-
//根据订单号查找订单
-
Order findOrderByNum(String ordernum);
-
//更新订单信息
-
void updateOrder(Order order);
-
//更新订单状态
-
void changeOrderStatus(int status,String ordernum);
-
//
-
List findOrdersByCustomerId(String customerId);
-
List findOrderItemByCustomerId(String ordernum);
实现其接口
[java] view plain copy
-
//生成订单
-
@Override
-
public void genOrder(Order order) {
-
if(order==null)
-
throw new RuntimeException("订单不能为空");
-
if(order.getCustomer()==null)
-
throw new RuntimeException("订单的客户不能为空");
-
orderDao.save(order);
-
}
-
@Override
-
public Order findOrderByNum(String ordernum) {
-
return orderDao.findByNum(ordernum);
-
}
-
@Override
-
public void updateOrder(Order order) {
-
orderDao.update(order);
-
}
-
@Override
-
public void changeOrderStatus(int status, String ordernum) {
-
Order order=findOrderByNum(ordernum);
-
order.setStatus(status);
-
updateOrder(order);
-
}
-
@Override
-
public List findOrdersByCustomerId(String customerId) {
-
return orderDao.findByCustomerId(customerId);
-
}
-
@Override
-
public List findOrderItemByCustomerId(String ordernum) {
-
return orderDao.findOrderItem(ordernum);
-
}
生成订单
[java] view plain copy
-
//订单详情
-
private void showOrders(HttpServletRequest request,
-
HttpServletResponse response) throws IOException, ServletException {
-
//检测是否登录;
-
HttpSession session=request.getSession();
-
Customer customer=(Customer) session.getAttribute("customer");
-
if(customer==null){
-
response.getWriter().write("请先登录");
-
response.setHeader("Refresh", "2;URL="+request.getContextPath());
-
return ;
-
}
-
List orders=s.findOrdersByCustomerId(customer.getId());
-
request.setAttribute("orders", orders);
-
request.getRequestDispatcher("/listOrders.jsp").forward(request, response);
-
}
-
//生成订单
-
private void genOrder(HttpServletRequest request,
-
HttpServletResponse response) throws IOException, ServletException {
-
//检测是否登录;
-
HttpSession session=request.getSession();
-
Customer customer=(Customer) session.getAttribute("customer");
-
if(customer==null){
-
response.getWriter().write("请先登录");
-
response.setHeader("Refresh", "2;URL="+request.getContextPath());
-
return ;
-
}
-
Cart cart=(Cart) request.getSession().getAttribute("cart");
-
Order order=new Order();
-
order.setOrdernum(OrderNumUtil.genOrderNum());
-
order.setPrice(cart.getPrice());
-
order.setNumber(cart.getNumber());
-
order.setCustomer(customer);
-
List oItems=new ArrayList();
-
//设置订单项
-
for(Map.Entry<String, CartItem> me:cart.getItems().entrySet()){
-
OrderItem item=new OrderItem();
-
item.setId(UUID.randomUUID().toString());
-
item.setNumber(me.getValue().getNumber());
-
item.setPrice(me.getValue().getPrice());
-
item.setBook(me.getValue().getBook());
-
oItems.add(item);
-
}
-
//建立和订单的关系
-
order.setItems(oItems);
-
s.genOrder(order);
-
request.setAttribute("order", order);
-
request.getRequestDispatcher("/pay.jsp").forward(request, response);
-
}
接下来就是支付功能的实现了。我们要为上面生成的订单来支付。
五、界面设计。
订单生成后腰跳转过去支付,这个支付界面我们可以使用一个表单。pay.jsp。并且将内容提交到PayServlet中。
[java] view plain copy
-
<form action="${pageContext.request.contextPath}/servlet/PayServlet" method="post">
-
<table width="60%">
-
<td bgcolor="#F7FEFF" colspan="4">
-
订单号:<INPUT TYPE="text" NAME="ordernum" value="{param.ordernum}" readonly="readonly">
-
支付金额:<INPUT TYPE="text" NAME="money" size="6" value="${order.price }" readonly="readonly">元
- 请您选择在线支付银行
- 招商银行
- 工商银行
- 农业银行
- 建设银行
- 中国民生银行总行
- 光大银行
- 交通银行
- 深圳发展银行
- 北京银行
- 兴业银行
- 上海浦东发展银行
- 中信银行
六、servletc逻辑处理
对于使用易宝支付我们无需导入jar包,我们直接使用其接口即可。下面这张图片是易宝支付的接口说明。
PayServlet的内容。
这里值得说一下的就是 p8_Url ,也就是支付成功后悔返回的商家界面地址。我这里写的是自己工程的地址。
[java] view plain copy
-
public void doGet(HttpServletRequest request, HttpServletResponse response)
-
throws ServletException, IOException {
-
request.setCharacterEncoding("UTF-8");
-
String ordernum=request.getParameter("ordernum");
-
String money=request.getParameter("money");
-
String pd_FrpId=request.getParameter("pd_FrpId");
-
String p0_Cmd = "Buy";
-
String p1_MerId = "10001126856";
-
String p2_Order = ordernum;
-
String p3_Amt = money;
-
String p4_Cur = "CNY";
-
String p5_Pid = "books"; //商品名称
-
String p6_Pcat = "unknown";
-
String p7_Pdesc = "descrition";
-
String p8_Url = "http://localhost:8080"+request.getContextPath()+"/servlet/ResponsePayServlet";
-
String p9_SAF = "1";
-
String pa_MP = "unknown";
-
String pr_NeedResponse="1";
-
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, "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl");
-
request.setAttribute("p0_Cmd",p0_Cmd );
-
request.setAttribute("p1_MerId",p1_MerId );
-
request.setAttribute("p2_Order", p2_Order);
-
request.setAttribute("p3_Amt", p3_Amt);
-
request.setAttribute("p4_Cur",p4_Cur );
-
request.setAttribute("p5_Pid",p5_Pid );
-
request.setAttribute("p6_Pcat",p6_Pcat );
-
request.setAttribute("p7_Pdesc",p7_Pdesc );
-
request.setAttribute("p8_Url",p8_Url );
-
request.setAttribute("pa_MP",pa_MP );
-
request.setAttribute("pr_NeedResponse",pr_NeedResponse );
-
request.setAttribute("hmac",hmac );
-
request.setAttribute("p9_SAF",p9_SAF );
-
request.setAttribute("pd_FrpId", pd_FrpId);
-
request.getRequestDispatcher("/sure.jsp").forward(request, response);
-
}
PayUtil.java是一个工具类,这里我们直接使用官方的即可。
[java] view plain copy
-
public class PaymentUtil {
-
private static String encodingCharset = "UTF-8";
-
/**
-
* 生成hmac方法
-
*
-
* @param p0_Cmd 业务类型
-
* @param p1_MerId 商户编号
-
* @param p2_Order 商户订单号
-
* @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 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) {
-
StringBuilder sValue = new StringBuilder();
-
// 业务类型
-
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);
-
return PaymentUtil.hmacSign(sValue.toString(), keyValue);
-
}
-
/**
-
* 返回校验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) {
-
StringBuilder sValue = new StringBuilder();
-
// 商户编号
-
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 = PaymentUtil.hmacSign(sValue.toString(), keyValue);
-
return sNewString.equals(hmac);
-
}
-
/**
-
* @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));
-
}
-
}
对于支付成功之后,我们需要修改我们的订单状态,改为已付款,所以我们需要一个响应的servlet
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!