JavaWeb-仿小米商场(8) 订单支付[沙箱支付],用户订单列表
1 功能描述
接上篇 JavaWeb - 仿小米商城(7):创建订单
实现点击支付宝支付按钮完成对应支付操作 通过使用支付宝沙箱支付模拟用户支付,沙箱支付的逻辑可
参考博客:https://blog.csdn.net/hhb442/article/details/123304287
支付提示界面:当点击提交页面,此时将订单数据存储到数据表中
支付成功可以通过我的订单查看订单
2 提交订单功能分析
2.1 功能逻辑抽象
商品购物车点击生成订单时,先判断用户是否登录,如果用户没有登录,则需要用户先完成登录 ,获取到用户对象,然后从购物车session中取得购物车数据,根据购物车数据创建订单对象和订单详情列表list集合
商品购物车是面向数据库中的 tb_order表和订单详情表tb_orderDetail,在订单预览界面添加数据到数据库中对应的表,
购物车建立对应的 CartServlet 类、CartService 接口和实现类、CartDao 接口和实现类。
订单建立对应的 OrderServlet 类、OrderService 接口和实现类、OrderDao 接口和实现类。
订单详情对应的 OrderDetailServlet 类、OrderDetailService 接口和实现类、OrderDetailDao 接口和实现类。
提示:好需要创建辅助的vo类
订单列表的显示需要一个vo类,其中包含订单信息和地址信息以及用户信息
OrderView : oid uid orderTime userName telphon address totalMoney ostate
GoodOrdersDetailVo: pid pimg pname star pubdate, price num money
3.1 沙箱支付实现
3.1.1 修改支付宝按钮链接
3.1.2沙箱支付PayServlet代码:
@WebServlet("/pay.do")
public class PayServlet extends BaseServlet {
//appid
private final String APP_ID = "2021000119697423";
//应用私钥
private final String APP_PRIVATE_KEY = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDnSxnNeuFy7ChdPC04Ak3QfqIqyd27nAewaFc6D9dism9wfYlxKovTLQBjaqO+AAwjvo/24+VvpD6Ku5Oj+zG9FG0J6veR7AAMKcuaPimDWO8Yv7y1P12MBCH3cxNhikdgE5JVCVDtU/av+AKVdOs4hFmyOS0httTjaoBIhKTlESLFs6d3sOeCY2bIXiV0l+FRVoJHs5OkXkjALnm+1mdRycZtz8Igjf80hhfVbdnOuhbnEVUN7VoTkd43KLuirDjEx/G8CbolW1yGYhCUJs7nYxzpVlUvIeCwRS6JRFQ7N8OWR7wzsAtdVoElc05Mt1IMECTm4WFzAi+x8VLwX42XAgMBAAECggEAKEAkjGK/Cy3X1GndgKq9+fOfqwyYPsbne6acz2jkVbOxuwTNv1jlHmntcF+lgTIm6q2GBjQgwG33yFLeXaIgRMRiOWCfltBYLcW0PfJlbQs0CL2NTIlrcSti8dof3FChHTIqvAuz/qkm+/aQFIxVRu+ZYG+c0AouQClPi88xlv8wtd9E5ZHk9iWwc2KEfiROk+pOSkaCQxK3TV14qP/WJfMHQmySB8hHeQZ67TdOuJpdbskIDi/g0UrrzPX7DjJMdv+GIggMBOQ3Jf6w/w25TYRxOuXnnYEVBJJMt5NVpE84OCr+6rHzGNp4N+cubY7fSLGLN5QwCrjeRoEQlTnyIQKBgQD33XH2dHXgBF/vEboYXHzFE2fHU+5sxXHqrI5dYC7foPDcFxqC7cz4+D/MXxwATqdKyOwjbKK4i6xAaGrTBBYjW2Nu1BfBi3zLUZUF+GUzLYLOhPKrGyybmO3DGHgIxlQGgCR60oKGbNxxX1MPoh4H5ogn9FQqz+ANDrGeFRqccQKBgQDu4mvIj/k6LM+JMouK5A60LQh4uPzfubU1YTR1M50clPcOWteI2+y+d8IhzwWw1GE5UMvQ+K0rjJ3Uwj6AzSeFUn9mKY07Ihz3jn/7xvMBLYw0o3uaYPpl+5c6YDWEoqNlSlIN09Bk73Q5Vgrp00PF1d+H16bgyD00oZpGe0buhwKBgBHY+S7E3gP+bKX7QcolRrquFgftTDq60OQT/sBMf7OMlCtU4ozQ8LRws69UneCLyVICO7alSOY+8G1G14JQRgPPvc4qKXe/QoIlYrSmWSshOM0EF7EoaMLfdSdaKLKBDWXWbkoFxG5HgmwLcCCtDLqG6ADwf+sBQuHN0A5Q+LSRAoGBALG5dqMSqkNjz0utdS/yGBZoYqMeTdRNH8oE9bg0nDEFiwD9CNnjdTEHfEEW+o7ikyrHN7vTJ1L9HPeLRGEjQMHp7KqfQ1m5OX/cXs985pH7xxHqhy0F9YUmNw7RQT/amGHld0KeUa6mj/uQTjJEYWmwgstX3+ngT9j2WgcR9GXFAoGBAIgjeJQjPbqql3grItUxM+3zPsYywR2U7HDxb/WbWDfgC+FIzTUOVFg4kZmMDvkCvZVrGccY9c8ItN64JC9n5zvUpGFRihAuHOGl5VuzUfhtXsMhAyKdf6NXTdurk35ioX91oJlWN4AdxjGyOxzKr0oSTjs6km3qLjWuKb4tSae4";
private final String CHARSET = "UTF-8";
// 支付宝公钥
private final String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs4aFo85tjgc0Sn/OxeHn0GeiAcxrom1MFAVgK7mTj+gXMzXk1NUg97E/a/UfhOGQ5xWxMAbMQGDKuseRycpo8KxUl6vQKFSrsPM+hM0G80YFgpIf4iaWC1qj4AsfOEBxUQBbdIlF1Ibt2dlIddqVe7Qfge+fI4rxixOhnE2yAlSZajwsHqZL6MagPSMYCnD3qZXGEZQOsH2lDqlH1aoijFI4LzqoEnL1QYBOVOKO8SIcud9f2Aw6t8I/fuBKAyDoOS7MAm8ISRxi6Lal6De95A4dvdWBBQgF9GDNH2UE0MWA0hDDDIFtpvrPMcXkN7qvRWBKqReZbSIkorDo0MM+dwIDAQAB"; //这是沙箱接口路径,正式路径为https://openapi.alipay.com/gateway.do
private final String GATEWAY_URL = "https://openapi.alipaydev.com/gateway.do";
private final String FORMAT = "JSON";
//签名方式
private final String SIGN_TYPE = "RSA2";
//支付宝异步通知路径,付款完毕后会异步调用本项目的方法,必须为公网地址
// private final String NOTIFY_URL = "http://127.0.0.1/notifyUrl";
//支付宝同步通知路径,也就是当付款完毕后跳转本项目的页面,可以不是公网地址
private final String RETURN_URL = "http://localhost:8080/pay.do?action=returnUrl";
/**
* 支付方法
*
* @param req
* @param resp
* @return
*/
public String alipay(HttpServletRequest req, HttpServletResponse resp) {
String dona_id = req.getParameter("oid");
HttpSession session = req.getSession();
String money = req.getParameter("money");
System.out.println(money);
Float dona_money = Float.parseFloat(money);
//把dona_id项目id 放在session中
session.setAttribute("dona_id", dona_id);
//生成订单号(支付宝的要求?)
String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
String user = UUID.randomUUID().toString().replace("-", "").toUpperCase();
String OrderNum = time + user;
//调用封装好的方法(给支付宝接口发送请求)
try {
return sendRequestToAlipay(OrderNum, dona_money, "xiaomi_shop");
} catch (AlipayApiException e) {
e.printStackTrace();
}