在线支付功能实现代码_网上支付代码设计,2024年物联网嵌入式开发开发学习路线

25 阅读10分钟
  1. List findOrderItem(String ordernum);

  2. }

接口的实现

[java]  view plain  copy

  1. public class OrderDaoImpl implements OrderDao {

  2. private QueryRunner qr=new QueryRunner(C3P0Util.getDataSource());

  3. //保存订单

  4. @Override

  5. public void save(Order order) {

  6. try {

  7. qr.update("insert into orders (ordernum,price,number,status,customerId) values (?,?,?,?,?)",

  8. order.getOrdernum(),order.getPrice(),order.getNumber(),order.getStatus(),

  9. order.getCustomer()==null?null:order.getCustomer().getId());

  10. List items = order.getItems();

  11. for(OrderItem item:items){

  12. qr.update("insert into orderitems (id,number,price,ordernum,bookid) values (?,?,?,?,?)",

  13. item.getId(),item.getNumber(),item.getPrice(),order.getOrdernum(),item.getBook()==null?null:item.getBook().getId());

  14. }

  15. } catch (SQLException e) {

  16. throw new RuntimeException(e);

  17. }

  18. }

  19. public Order findByNum(String ordernum) {

  20. try {

  21. Order order = qr.query("select * from orders where ordernum=?", new BeanHandler(Order.class), ordernum);

  22. if(order!=null){

  23. Customer customer = qr.query("select * from customers where id=(select customerId from orders where ordernum=?)", new BeanHandler(Customer.class), ordernum);

  24. order.setCustomer(customer);

  25. }

  26. return order;

  27. } catch (SQLException e) {

  28. throw new RuntimeException(e);

  29. }

  30. }

  31. public void update(Order order) {

  32. try {

  33. qr.update("update orders set price=?,number=?,status=? where ordernum=?", order.getPrice(),order.getNumber(),order.getStatus(),order.getOrdernum());

  34. } catch (SQLException e) {

  35. throw new RuntimeException(e);

  36. }

  37. }

  38. @Override

  39. public List findByCustomerId(String customerId) {

  40. try {

  41. List orders=qr.query("select * from orders where customerId=?  order by ordernum desc ", new BeanListHandler(Order.class),customerId);

  42. if(orders!=null){

  43. Customer customer=qr.query("select * from customers where id=? ",new BeanHandler(Customer.class),customerId);

  44. for (Order order : orders) {

  45. order.setCustomer(customer);

  46. }

  47. }

  48. return orders;

  49. } catch (SQLException e) {

  50. throw new RuntimeException(e);

  51. }

  52. }

  53. @Override

  54. public List findOrderItem(String ordernum) {

  55. try {

  56. List items = qr.query("select * from orderitems where ordernum=?", new BeanListHandler(OrderItem.class), ordernum);

  57. if(items!=null){

  58. for(OrderItem o:items){

  59. Book book = qr.query("select * from books where id=(select bookId from orderitems where id=?)", new BeanHandler(Book.class), o.getId());

  60. o.setBook(book);

  61. }

  62. }

  63. return items;

  64. } catch (SQLException e) {

  65. throw new RuntimeException(e);

  66. }

  67. }

  68. }

四、Service的设计

[java]  view plain  copy

  1. //生成订单

  2. void genOrder(Order order);

  3. //根据订单号查找订单

  4. Order findOrderByNum(String ordernum);

  5. //更新订单信息

  6. void updateOrder(Order order);

  7. //更新订单状态

  8. void changeOrderStatus(int status,String ordernum);

  9. //

  10. List findOrdersByCustomerId(String customerId);

  11. List findOrderItemByCustomerId(String ordernum);

实现其接口

[java]  view plain  copy

  1. //生成订单

  2. @Override

  3. public void genOrder(Order order) {

  4. if(order==null)

  5. throw new RuntimeException("订单不能为空");

  6. if(order.getCustomer()==null)

  7. throw new RuntimeException("订单的客户不能为空");

  8. orderDao.save(order);

  9. }

  10. @Override

  11. public Order findOrderByNum(String ordernum) {

  12. return orderDao.findByNum(ordernum);

  13. }

  14. @Override

  15. public void updateOrder(Order order) {

  16. orderDao.update(order);

  17. }

  18. @Override

  19. public void changeOrderStatus(int status, String ordernum) {

  20. Order order=findOrderByNum(ordernum);

  21. order.setStatus(status);

  22. updateOrder(order);

  23. }

  24. @Override

  25. public List findOrdersByCustomerId(String customerId) {

  26. return orderDao.findByCustomerId(customerId);

  27. }

  28. @Override

  29. public List findOrderItemByCustomerId(String ordernum) {

  30. return orderDao.findOrderItem(ordernum);

  31. }

生成订单

[java]  view plain  copy

  1. //订单详情

  2. private void showOrders(HttpServletRequest request,

  3. HttpServletResponse response) throws IOException, ServletException {

  4. //检测是否登录;

  5. HttpSession session=request.getSession();

  6. Customer customer=(Customer) session.getAttribute("customer");

  7. if(customer==null){

  8. response.getWriter().write("请先登录");

  9. response.setHeader("Refresh", "2;URL="+request.getContextPath());

  10. return ;

  11. }

  12. List  orders=s.findOrdersByCustomerId(customer.getId());

  13. request.setAttribute("orders", orders);

  14. request.getRequestDispatcher("/listOrders.jsp").forward(request, response);

  15. }

  16. //生成订单

  17. private void genOrder(HttpServletRequest request,

  18. HttpServletResponse response) throws IOException, ServletException  {

  19. //检测是否登录;

  20. HttpSession session=request.getSession();

  21. Customer customer=(Customer) session.getAttribute("customer");

  22. if(customer==null){

  23. response.getWriter().write("请先登录");

  24. response.setHeader("Refresh", "2;URL="+request.getContextPath());

  25. return ;

  26. }

  27. Cart cart=(Cart) request.getSession().getAttribute("cart");

  28. Order order=new Order();

  29. order.setOrdernum(OrderNumUtil.genOrderNum());

  30. order.setPrice(cart.getPrice());

  31. order.setNumber(cart.getNumber());

  32. order.setCustomer(customer);

  33. List  oItems=new ArrayList();

  34. //设置订单项

  35. for(Map.Entry<String, CartItem>  me:cart.getItems().entrySet()){

  36. OrderItem item=new OrderItem();

  37. item.setId(UUID.randomUUID().toString());

  38. item.setNumber(me.getValue().getNumber());

  39. item.setPrice(me.getValue().getPrice());

  40. item.setBook(me.getValue().getBook());

  41. oItems.add(item);

  42. }

  43. //建立和订单的关系

  44. order.setItems(oItems);

  45. s.genOrder(order);

  46. request.setAttribute("order", order);

  47. request.getRequestDispatcher("/pay.jsp").forward(request, response);

  48. }

接下来就是支付功能的实现了。我们要为上面生成的订单来支付。

五、界面设计。

订单生成后腰跳转过去支付,这个支付界面我们可以使用一个表单。pay.jsp。并且将内容提交到PayServlet中。

[java]  view plain  copy

  1. <form action="${pageContext.request.contextPath}/servlet/PayServlet" method="post">

  2. <table width="60%">

  3. <td bgcolor="#F7FEFF" colspan="4">

  4. 订单号:<INPUT TYPE="text" NAME="ordernum" value="order.ordernum{order.ordernum}{param.ordernum}"  readonly="readonly">

  5. 支付金额:<INPUT TYPE="text" NAME="money" size="6" value="${order.price }"  readonly="readonly">元

  6. 请您选择在线支付银行
  7. 招商银行
  8. 工商银行
  9. 农业银行
  10. 建设银行
  11. 中国民生银行总行
  12. 光大银行
  13. 交通银行
  14. 深圳发展银行
  15. 北京银行
  16. 兴业银行
  17. 上海浦东发展银行
  18. 中信银行

六、servletc逻辑处理

对于使用易宝支付我们无需导入jar包,我们直接使用其接口即可。下面这张图片是易宝支付的接口说明。

PayServlet的内容。

这里值得说一下的就是  p8_Url ,也就是支付成功后悔返回的商家界面地址。我这里写的是自己工程的地址。

[java]  view plain  copy

  1. public void doGet(HttpServletRequest request, HttpServletResponse response)

  2. throws ServletException, IOException {

  3. request.setCharacterEncoding("UTF-8");

  4. String ordernum=request.getParameter("ordernum");

  5. String money=request.getParameter("money");

  6. String pd_FrpId=request.getParameter("pd_FrpId");

  7. String p0_Cmd = "Buy";

  8. String p1_MerId = "10001126856";

  9. String p2_Order = ordernum;

  10. String p3_Amt = money;

  11. String p4_Cur = "CNY";

  12. String p5_Pid = "books";  //商品名称

  13. String p6_Pcat = "unknown";

  14. String p7_Pdesc = "descrition";

  15. String p8_Url = "http://localhost:8080"+request.getContextPath()+"/servlet/ResponsePayServlet";

  16. String p9_SAF = "1";

  17. String pa_MP = "unknown";

  18. String pr_NeedResponse="1";

  19. 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");

  20. request.setAttribute("p0_Cmd",p0_Cmd );

  21. request.setAttribute("p1_MerId",p1_MerId );

  22. request.setAttribute("p2_Order", p2_Order);

  23. request.setAttribute("p3_Amt", p3_Amt);

  24. request.setAttribute("p4_Cur",p4_Cur );

  25. request.setAttribute("p5_Pid",p5_Pid );

  26. request.setAttribute("p6_Pcat",p6_Pcat );

  27. request.setAttribute("p7_Pdesc",p7_Pdesc );

  28. request.setAttribute("p8_Url",p8_Url );

  29. request.setAttribute("pa_MP",pa_MP );

  30. request.setAttribute("pr_NeedResponse",pr_NeedResponse );

  31. request.setAttribute("hmac",hmac );

  32. request.setAttribute("p9_SAF",p9_SAF );

  33. request.setAttribute("pd_FrpId", pd_FrpId);

  34. request.getRequestDispatcher("/sure.jsp").forward(request, response);

  35. }

PayUtil.java是一个工具类,这里我们直接使用官方的即可。

[java]  view plain  copy

  1. public class PaymentUtil {

  2. private static String encodingCharset = "UTF-8";

  3. /**

  4. * 生成hmac方法

  5. *

  6. * @param p0_Cmd 业务类型

  7. * @param p1_MerId 商户编号

  8. * @param p2_Order 商户订单号

  9. * @param p3_Amt 支付金额

  10. * @param p4_Cur 交易币种

  11. * @param p5_Pid 商品名称

  12. * @param p6_Pcat 商品种类

  13. * @param p7_Pdesc 商品描述

  14. * @param p8_Url 商户接收支付成功数据的地址

  15. * @param p9_SAF 送货地址

  16. * @param pa_MP 商户扩展信息

  17. * @param pd_FrpId 银行编码

  18. * @param pr_NeedResponse 应答机制

  19. * @param keyValue 商户密钥

  20. * @return

  21. */

  22. public static String buildHmac(String p0_Cmd,String p1_MerId,

  23. String p2_Order, String p3_Amt, String p4_Cur,String p5_Pid, String p6_Pcat,

  24. String p7_Pdesc,String p8_Url, String p9_SAF,String pa_MP,String pd_FrpId,

  25. String pr_NeedResponse,String keyValue) {

  26. StringBuilder sValue = new StringBuilder();

  27. // 业务类型

  28. sValue.append(p0_Cmd);

  29. // 商户编号

  30. sValue.append(p1_MerId);

  31. // 商户订单号

  32. sValue.append(p2_Order);

  33. // 支付金额

  34. sValue.append(p3_Amt);

  35. // 交易币种

  36. sValue.append(p4_Cur);

  37. // 商品名称

  38. sValue.append(p5_Pid);

  39. // 商品种类

  40. sValue.append(p6_Pcat);

  41. // 商品描述

  42. sValue.append(p7_Pdesc);

  43. // 商户接收支付成功数据的地址

  44. sValue.append(p8_Url);

  45. // 送货地址

  46. sValue.append(p9_SAF);

  47. // 商户扩展信息

  48. sValue.append(pa_MP);

  49. // 银行编码

  50. sValue.append(pd_FrpId);

  51. // 应答机制

  52. sValue.append(pr_NeedResponse);

  53. return PaymentUtil.hmacSign(sValue.toString(), keyValue);

  54. }

  55. /**

  56. * 返回校验hmac方法

  57. *

  58. * @param hmac 支付网关发来的加密验证码

  59. * @param p1_MerId 商户编号

  60. * @param r0_Cmd 业务类型

  61. * @param r1_Code 支付结果

  62. * @param r2_TrxId 易宝支付交易流水号

  63. * @param r3_Amt 支付金额

  64. * @param r4_Cur 交易币种

  65. * @param r5_Pid 商品名称

  66. * @param r6_Order 商户订单号

  67. * @param r7_Uid 易宝支付会员ID

  68. * @param r8_MP 商户扩展信息

  69. * @param r9_BType 交易结果返回类型

  70. * @param keyValue 密钥

  71. * @return

  72. */

  73. public static boolean verifyCallback(String hmac, String p1_MerId,

  74. String r0_Cmd, String r1_Code, String r2_TrxId, String r3_Amt,

  75. String r4_Cur, String r5_Pid, String r6_Order, String r7_Uid,

  76. String r8_MP, String r9_BType, String keyValue) {

  77. StringBuilder sValue = new StringBuilder();

  78. // 商户编号

  79. sValue.append(p1_MerId);

  80. // 业务类型

  81. sValue.append(r0_Cmd);

  82. // 支付结果

  83. sValue.append(r1_Code);

  84. // 易宝支付交易流水号

  85. sValue.append(r2_TrxId);

  86. // 支付金额

  87. sValue.append(r3_Amt);

  88. // 交易币种

  89. sValue.append(r4_Cur);

  90. // 商品名称

  91. sValue.append(r5_Pid);

  92. // 商户订单号

  93. sValue.append(r6_Order);

  94. // 易宝支付会员ID

  95. sValue.append(r7_Uid);

  96. // 商户扩展信息

  97. sValue.append(r8_MP);

  98. // 交易结果返回类型

  99. sValue.append(r9_BType);

  100. String sNewString = PaymentUtil.hmacSign(sValue.toString(), keyValue);

  101. return sNewString.equals(hmac);

  102. }

  103. /**

  104. * @param aValue

  105. * @param aKey

  106. * @return

  107. */

  108. public static String hmacSign(String aValue, String aKey) {

  109. byte k_ipad[] = new byte[64];

  110. byte k_opad[] = new byte[64];

  111. byte keyb[];

  112. byte value[];

  113. try {

  114. keyb = aKey.getBytes(encodingCharset);

  115. value = aValue.getBytes(encodingCharset);

  116. } catch (UnsupportedEncodingException e) {

  117. keyb = aKey.getBytes();

  118. value = aValue.getBytes();

  119. }

  120. Arrays.fill(k_ipad, keyb.length, 64, (byte) 54);

  121. Arrays.fill(k_opad, keyb.length, 64, (byte) 92);

  122. for (int i = 0; i < keyb.length; i++) {

  123. k_ipad[i] = (byte) (keyb[i] ^ 0x36);

  124. k_opad[i] = (byte) (keyb[i] ^ 0x5c);

  125. }

  126. MessageDigest md = null;

  127. try {

  128. md = MessageDigest.getInstance("MD5");

  129. } catch (NoSuchAlgorithmException e) {

  130. return null;

  131. }

  132. md.update(k_ipad);

  133. md.update(value);

  134. byte dg[] = md.digest();

  135. md.reset();

  136. md.update(k_opad);

  137. md.update(dg, 0, 16);

  138. dg = md.digest();

  139. return toHex(dg);

  140. }

  141. public static String toHex(byte input[]) {

  142. if (input == null)

  143. return null;

  144. StringBuffer output = new StringBuffer(input.length * 2);

  145. for (int i = 0; i < input.length; i++) {

  146. int current = input[i] & 0xff;

  147. if (current < 16)

  148. output.append("0");

  149. output.append(Integer.toString(current, 16));

  150. }

  151. return output.toString();

  152. }

  153. /**

  154. *

  155. * @param args

  156. * @param key

  157. * @return

  158. */

  159. public static String getHmac(String[] args, String key) {

  160. if (args == null || args.length == 0) {

  161. return (null);

  162. }

  163. StringBuffer str = new StringBuffer();

  164. for (int i = 0; i < args.length; i++) {

  165. str.append(args[i]);

  166. }

  167. return (hmacSign(str.toString(), key));

  168. }

  169. /**

  170. * @param aValue

  171. * @return

  172. */

  173. public static String digest(String aValue) {

  174. aValue = aValue.trim();

  175. byte value[];

  176. try {

  177. value = aValue.getBytes(encodingCharset);

  178. } catch (UnsupportedEncodingException e) {

  179. value = aValue.getBytes();

  180. }

  181. MessageDigest md = null;

  182. try {

  183. md = MessageDigest.getInstance("SHA");

  184. } catch (NoSuchAlgorithmException e) {

  185. e.printStackTrace();

  186. return null;

  187. }

  188. return toHex(md.digest(value));

  189. }

  190. }

对于支付成功之后,我们需要修改我们的订单状态,改为已付款,所以我们需要一个响应的servlet

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。 img img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!