AppBookingAction.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945
  1. package com.happy.action;
  2. import com.happy.Model.AdminManager;
  3. import com.happy.Model.Booking;
  4. import com.happy.Model.BookingLog;
  5. import com.happy.Model.weixin.PayResult;
  6. import com.happy.Model.weixin.Users;
  7. import com.happy.Model.weixin.WechatUnifiedOrder;
  8. import com.happy.Model.weixin.WeiXinUtil;
  9. import com.happy.Until.*;
  10. import com.happy.Until.Enum.B;
  11. import com.happy.Until.Enum.OrderEnum;
  12. import com.happy.Until.Enum.PayEnum;
  13. import com.happy.Until.weixin.EndPay;
  14. import com.happy.Until.weixin.JaxbUtil;
  15. import com.happy.Until.weixin.PayWxUtil;
  16. import com.happy.Until.weixin.TongYiReturn;
  17. import com.happy.common.http.Message;
  18. import com.happy.common.http.Message2;
  19. import com.happy.common.wx.WxUtil;
  20. import com.happy.constant.ResultStatusCode;
  21. import com.happy.service.*;
  22. import com.opensymphony.xwork2.ActionSupport;
  23. import net.sf.json.JSONObject;
  24. import org.apache.struts2.ServletActionContext;
  25. import org.apache.struts2.interceptor.ServletRequestAware;
  26. import javax.annotation.Resource;
  27. import javax.servlet.http.HttpServletRequest;
  28. import javax.servlet.http.HttpServletResponse;
  29. import java.io.BufferedReader;
  30. import java.io.PrintWriter;
  31. import java.math.BigDecimal;
  32. import java.text.ParseException;
  33. import java.time.LocalDateTime;
  34. import java.time.format.DateTimeFormatter;
  35. import java.util.*;
  36. /**
  37. * 订单进去Action请求交互
  38. */
  39. public class AppBookingAction extends ActionSupport implements ServletRequestAware {
  40. private HttpServletRequest request;
  41. public HttpServletResponse response;
  42. @Resource
  43. public BookService bookService;
  44. @Resource
  45. public BookinglogService bookinglogService;
  46. @Resource
  47. public UserService userService;
  48. @Resource
  49. public AppBookService appBookService;
  50. @Resource
  51. public AdminManagerService adminManagerService;
  52. @Resource
  53. public HotelCoupomService hotelCoupomService;
  54. @Resource
  55. public HotelCoupomStatusService hotelCoupomStatusService;
  56. public int page; // 当前页
  57. public int rows;// 每页显示的行数rows
  58. public Integer id;
  59. public String status;
  60. public String hotelId; // 酒店id
  61. public String houseId; // 房型id
  62. public String startTime; // 订房开始时间
  63. public String endTime; // 订房结束时间
  64. public String houseOrderNumber; // 订房数量
  65. public String userName; // 住客姓名
  66. public String userPhone; // 住客联系电话
  67. public String userId; // 下单人id
  68. public String getBookingId() {
  69. return bookingId;
  70. }
  71. public void setBookingId(String bookingId) {
  72. this.bookingId = bookingId;
  73. }
  74. private String bookingId; // 订单Id
  75. private String open_id; // 用户open_Id
  76. public HttpServletRequest getRequest() {
  77. return request;
  78. }
  79. public void setRequest(HttpServletRequest request) {
  80. this.request = request;
  81. }
  82. @Override
  83. public void setServletRequest(HttpServletRequest request) {
  84. this.request = request;
  85. }
  86. public HttpServletResponse getResponse() {
  87. return response;
  88. }
  89. public void setResponse(HttpServletResponse response) {
  90. this.response = response;
  91. }
  92. public int getPage() {
  93. return page;
  94. }
  95. public void setPage(int page) {
  96. this.page = page;
  97. }
  98. public int getRows() {
  99. return rows;
  100. }
  101. public void setRows(int rows) {
  102. this.rows = rows;
  103. }
  104. public Integer getId() {
  105. return id;
  106. }
  107. public void setId(Integer id) {
  108. this.id = id;
  109. }
  110. public String getStatus() {
  111. return status;
  112. }
  113. public void setStatus(String status) {
  114. this.status = status;
  115. }
  116. public String complaintId;
  117. public String useId;
  118. public String getComplaintId() {
  119. return complaintId;
  120. }
  121. public void setComplaintId(String complaintId) {
  122. this.complaintId = complaintId;
  123. }
  124. public String getUseId() {
  125. return useId;
  126. }
  127. public void setUseId(String useId) {
  128. this.useId = useId;
  129. }
  130. /**
  131. * 定时任务
  132. * @return
  133. */
  134. public String scheduledTasks()
  135. {
  136. // 获取所有的订单待支付状态
  137. StringBuffer strSqlBook = new StringBuffer();
  138. strSqlBook.append(" and order_status = '").append(PayEnum.待支付.getNum()).append("' ");
  139. List<Booking> bookingList = bookService.queryList(strSqlBook.toString());
  140. if (bookingList == null || bookingList.size() <= 0){
  141. return null;
  142. }
  143. try {
  144. for (Booking booking: bookingList) {
  145. if (booking == null || Func.checkNull(booking.getCreateTime()) || Func.checkNull(booking.getLockTime()))
  146. continue;
  147. Date createTime = DateUtil.parseDate(booking.getCreateTime(),DateUtil.Time_Formatter_Second);
  148. // 对订单时间进行累加
  149. String lockTime = TimeExchange.TimeRangeM(DateUtil.getFormatPaternDate(createTime),Func.parseInt(booking.getLockTime()));
  150. // 当前时间 大于 锁定时间 为true 且支付状态
  151. boolean flag = TimeExchange.CompareDate(lockTime, TimeExchange.getDate());
  152. if (flag)
  153. {
  154. // 如果超时,则将订单状态修改为已超时
  155. booking.setOrderStatus(Func.parseStr(PayEnum.支付超时.getNum()));
  156. booking.setUpdateTime(TimeExchange.getDate());
  157. bookService.updateBooking(booking);
  158. // 将状态修改为已超时订单时,写入数据操作
  159. bookinglogService.addBooklog(OrderEnum.将订单设置为已超时.toString(), booking);
  160. System.out.println("已将订单"+booking.getOrderNum()+"标识为支付超时");
  161. }
  162. }
  163. } catch (ParseException e) {
  164. e.printStackTrace();
  165. }
  166. return null;
  167. }
  168. /**
  169. * 进行更新数据将订单状态修改为已超时。
  170. * @return
  171. */
  172. public String updateOrderStatus()
  173. {
  174. JSONObject jsonObject = new JSONObject();
  175. if (Func.checkNull(bookingId))
  176. {
  177. jsonObject.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  178. jsonObject.put(B.message, "未传入bookingId---updateOrderStatus");
  179. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  180. return null;
  181. }
  182. try {
  183. Booking booking = bookService.getById(Func.parseInt(bookingId));
  184. Date createTime = DateUtil.parseDate(booking.getCreateTime(),DateUtil.Time_Formatter_Second);
  185. // 对订单时间进行累加
  186. String lockTime = TimeExchange.TimeRangeM(DateUtil.getFormatPaternDate(createTime), Func.parseInt(booking.getLockTime()));
  187. // 当前时间 大于 锁定时间 为true 且支付状态
  188. boolean flag = TimeExchange.CompareDate(lockTime, TimeExchange.getDate());
  189. if (flag)
  190. {
  191. // 如果超时,则将订单状态修改为已超时
  192. booking.setOrderStatus(Func.parseStr(PayEnum.支付超时.getNum()));
  193. booking.setUpdateTime(TimeExchange.getDate());
  194. bookService.updateBooking(booking);
  195. // 将状态修改为已超时订单时,写入数据操作
  196. bookinglogService.addBooklog(OrderEnum.将订单设置为已超时.toString(),booking);
  197. System.out.println("已将订单"+booking.getOrderNum()+"标识为支付超时");
  198. jsonObject.put(B.code, ResultStatusCode.OK.getStatus());
  199. jsonObject.put(B.message, "已将订单"+booking.getOrderNum()+"标识为支付超时");
  200. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  201. }
  202. } catch (ParseException e) {
  203. throw new RuntimeException(e);
  204. }
  205. return null;
  206. }
  207. /**
  208. * houseId; // 房型id
  209. * startTime; // 订房开始时间 2023/08/04
  210. * endTime; // 订房结束时间 2023/08/05
  211. * houseOrderNumber; // 订房数量
  212. * userName; // 住客姓名
  213. * userPhone; // 住客联系电话
  214. * userId; // 下单人id
  215. * 用户点击订房操作,生成订单
  216. */
  217. public String createOrder() {
  218. // 插入订单数据到表中
  219. JSONObject jsonObject = new JSONObject();
  220. if (Func.checkNull(houseId) || Func.checkNull(startTime) || Func.checkNull(endTime)
  221. || Func.checkNull(houseOrderNumber) || Func.checkNull(userName) || Func.checkNull(userPhone) || Func.checkNull(userId)) {
  222. jsonObject.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  223. jsonObject.put(B.message, ResultStatusCode.BAD_REQUEST.getMsg());
  224. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  225. return null;
  226. }
  227. // 将时间统一转化为 yyyy/MM/dd
  228. String startDate = DateUtil.parseDateToStr((Func.parseDate(startTime)), DateUtil.Time_Formatter_Day);
  229. String endDate = DateUtil.parseDateToStr((Func.parseDate(endTime)), DateUtil.Time_Formatter_Day);
  230. // 创建订单之前,先验证是否有房间
  231. String backMessage = appBookService.varificationHouse(houseId, startDate, endDate,houseOrderNumber);
  232. if (!Func.checkNull(backMessage)) {
  233. jsonObject.put(B.code, ResultStatusCode.CANNTBOOKING.getStatus());
  234. jsonObject.put(B.message, backMessage);
  235. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  236. return null;
  237. }
  238. String bookingId = Func.parseStr(UUIDUtil.generateID());
  239. String mess = appBookService.createOrder(bookingId, houseId, startDate, endDate, houseOrderNumber, userName, userPhone, userId, complaintId, useId);
  240. if (!Func.checkNull(mess)) {
  241. jsonObject.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  242. jsonObject.put(B.message, mess);
  243. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  244. return null;
  245. }
  246. jsonObject.put(B.code, ResultStatusCode.OK.getStatus());
  247. jsonObject.put(B.message, ResultStatusCode.OK.getMsg());
  248. jsonObject.put(B.data, bookingId);
  249. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  250. return null;
  251. }
  252. /**
  253. * bookingId 订单id
  254. * 商家在已支付,待入住时点退单 ,进入退款流程后退单
  255. * 在已入住,时点退单,进入退款流程后退款
  256. * @return
  257. */
  258. public String chargeback() throws Exception {
  259. if (Func.checkNull(bookingId))
  260. return null;
  261. JSONObject jsonObject = new JSONObject();
  262. Booking book = bookService.getById(Func.parseInt(bookingId));
  263. Users users = userService.queryByUserId(book.getCreateUserid());
  264. if (book == null || users == null)
  265. return null;
  266. //1待支付,2已支付,3待入住,4已入住,5已消费,6支付超时,7已取消,8已退单,9已退款,10退款中
  267. int status = Func.parseInt(book.getOrderStatus());
  268. if (status == PayEnum.待支付.getNum())
  269. {
  270. book.setOrderStatus(Func.parseStr(PayEnum.已取消.getNum())); // 如果在1待支付情况,用户点击取消订单按钮,后台直接修改取消订单操作
  271. book.setUpdateTime(DateUtil.getFormatPaternDate(new Date()));
  272. bookService.updateBooking(book);
  273. // 用户在待支付状态下取消了订单时,写入数据操作
  274. bookinglogService.addBooklog("用户在待支付状态下,取消了订单",book);
  275. jsonObject.put(B.code, ResultStatusCode.OK.getStatus());
  276. jsonObject.put(B.message, ResultStatusCode.OK.getMsg());
  277. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  278. return null;
  279. }else if (status == PayEnum.已支付.getNum() || status == PayEnum.待入住.getNum())
  280. {
  281. book.setOrderStatus(Func.parseStr(PayEnum.退款中.getNum())); // 如果在2已支付,3待入住 情况,商家点击取消订单按钮,后台先修改状态为退款中,然后走退款流程
  282. book.setRemake(Func.parseStr(PayEnum.已退单.getPayStatus()));
  283. }else if(status == PayEnum.已入住.getNum())
  284. {
  285. book.setOrderStatus(Func.parseStr(PayEnum.退款中.getNum())); // 如果在2已支付,3待入住 情况,商家点击取消订单按钮,后台先修改状态为退款中,然后走退款流程
  286. book.setRemake(Func.parseStr(PayEnum.已退款.getPayStatus()));
  287. }
  288. if (book.getPayAccount() > 0)
  289. {
  290. // 注明如果支付金额大于0,则需要退款: (标识走退款操作)
  291. book.setRefundWay(OrderEnum.微信退款.toString());
  292. }
  293. jsonObject = refundMethod(book,users.getOpenid());
  294. ResUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  295. return null;
  296. }
  297. /**
  298. * bookingId 订单id
  299. * open_id
  300. * 取消订单功能: 用户点击
  301. * //1待支付,2已支付,3待入住,4已入住,5已消费,6支付超时,7已取消,8已退单,9已退款,10退款中
  302. *
  303. * @return
  304. */
  305. public String cancelBooking() throws Exception {
  306. JSONObject jsonObject = new JSONObject();
  307. if (Func.checkNull(this.bookingId)) {
  308. jsonObject.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  309. jsonObject.put(B.message, "未传入bookingId");
  310. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  311. return null;
  312. }
  313. // 取消订单,修改订单的支付状态
  314. Booking book = bookService.getById(Func.parseInt(bookingId));
  315. if (book == null ) {
  316. jsonObject.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  317. jsonObject.put(B.message, "未获取到订单信息,请重新查询");
  318. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  319. return null;
  320. }
  321. // 查询用户信息
  322. Users users = userService.queryByUserId(book.getCreateUserid());
  323. if (users == null) {
  324. jsonObject.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  325. jsonObject.put(B.message, "未查询到当前用户数据users,请先授权");
  326. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  327. return null;
  328. }
  329. //是否能取消订单(1是 2否)
  330. if (Func.parseInt(book.getHotelIsCanorder()) == 2) {
  331. jsonObject.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  332. jsonObject.put(B.message, "商家设置不可取消订单,请联系商家");
  333. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  334. return null;
  335. }
  336. //1待支付,2已支付,3待入住,4已入住,5已消费,6支付超时,7已取消,8已退单,9已退款,10退款中
  337. int status = Func.parseInt(book.getOrderStatus());
  338. if (status == PayEnum.待支付.getNum() || status == PayEnum.支付超时.getNum()) {
  339. book.setOrderStatus(Func.parseStr(PayEnum.已取消.getNum())); // 如果在1待支付情况,用户点击取消订单按钮,后台直接修改取消订单操作
  340. book.setUpdateTime(DateUtil.getFormatPaternDate(new Date()));
  341. book.setRemake(Func.parseStr(PayEnum.已取消.getPayStatus()));
  342. bookService.updateBooking(book);
  343. jsonObject.put(B.code, ResultStatusCode.OK.getStatus());
  344. jsonObject.put(B.message, "已取消");
  345. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  346. return null;
  347. }
  348. if (status == PayEnum.已入住.getNum()) {
  349. jsonObject.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  350. jsonObject.put(B.message, "已入住,请前往前台办理退款");
  351. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  352. return null;
  353. }
  354. if (status == PayEnum.已消费.getNum() || status == PayEnum.已取消.getNum() || status == PayEnum.已退单.getNum() || status == PayEnum.已退款.getNum()) {
  355. jsonObject.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  356. jsonObject.put(B.message, "订单已完成,不可进行操作");
  357. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  358. return null;
  359. }
  360. if (status == PayEnum.退款中.getNum()) {
  361. jsonObject.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  362. jsonObject.put(B.message, "退款中,请勿重复操作");
  363. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  364. return null;
  365. }
  366. // 退款操作
  367. book.setRemake(Func.parseStr(PayEnum.已取消.getPayStatus()));
  368. book.setRefundWay(OrderEnum.微信退款.toString());
  369. jsonObject = refundMethod(book,users.getOpenid());
  370. jsonObject.put(B.data, book);
  371. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  372. return null;
  373. }
  374. /**
  375. * 退款方法
  376. * @param book
  377. * @param open_id
  378. * @return
  379. * @throws Exception
  380. */
  381. public JSONObject refundMethod(Booking book,String open_id) throws Exception {
  382. JSONObject jsonObject = new JSONObject();
  383. if (book == null || Func.checkNull(open_id)) {
  384. jsonObject.put("code", 400);
  385. jsonObject.put("message", "未传入book和open_id数据---refundMethod");
  386. return jsonObject;
  387. }
  388. // 进行判断如果订单是退款中,并且标识字段微信退款,则进入退款流程
  389. String ip = WeiXinUtil.ip;
  390. double money = book.getPayAccount();
  391. int a = (int) (money * 100);
  392. WechatUnifiedOrder w = new WechatUnifiedOrder();
  393. w.setAppid(WeiXinUtil.appid_c);
  394. w.setAttach("chuanghai");
  395. w.setBody("chuanghai");
  396. w.setMch_id(WeiXinUtil.account);
  397. w.setNonce_str(PayWxUtil.getNonceStr());// 随机支付串
  398. w.setNotify_url(WeiXinUtil.ip_h + "/abkquery_refund.action");// 支付结果回调地址
  399. w.setOpenid(open_id);
  400. w.setOut_trade_no(book.getOrderNum());
  401. String refund_order = WxUtil.mchOrderNo();
  402. w.setOut_refund_no(refund_order); // 退款单号
  403. w.setSpbill_create_ip(ip);
  404. w.setTotal_fee(a);
  405. w.setRefund_fee(a); // 退款金额
  406. w.setTrade_type("JSAPI");
  407. SortedMap<String, String> params = new TreeMap<>();
  408. params.put("appid", w.getAppid());
  409. params.put("mch_id", w.getMch_id());
  410. params.put("nonce_str", w.getNonce_str());
  411. params.put("notify_url", w.getNotify_url());
  412. params.put("out_refund_no", w.getOut_refund_no()); // 退款单号
  413. params.put("out_trade_no", w.getOut_trade_no());
  414. params.put("refund_fee",w.getRefund_fee()+""); // 退款金额
  415. params.put("total_fee", w.getTotal_fee() + "");
  416. w.setSign(PayWxUtil.getSign(params, WeiXinUtil.key));
  417. params.put("sign", w.getSign());
  418. //String retXml = JaxbUtil.getRequestXml(params);
  419. String xml = "<xml>" +
  420. "<appid>" + w.getAppid() + "</appid>" +
  421. "<mch_id>" + w.getMch_id() + "</mch_id>" +
  422. "<nonce_str>" + w.getNonce_str() + "</nonce_str>" +
  423. "<notify_url>" + w.getNotify_url() + "</notify_url>" +
  424. "<out_refund_no>" + w.getOut_refund_no() + "</out_refund_no>" +
  425. "<out_trade_no>" + w.getOut_trade_no() + "</out_trade_no>" +
  426. "<refund_fee>" + w.getRefund_fee()+"" + "</refund_fee>" +
  427. "<total_fee>" + w.getTotal_fee() + "" + "</total_fee>" +
  428. "<sign>" + w.getSign() + "</sign>" +
  429. "</xml>";
  430. //String msg = HttpsClient.sendPost2("https://api.mch.weixin.qq.com/secapi/pay/refund", retXml);
  431. String msg = HttpUtils.post2("https://api.mch.weixin.qq.com/secapi/pay/refund", xml);
  432. if (msg.indexOf("FAIL") > -1) {
  433. jsonObject.put("code", 507);
  434. jsonObject.put("message", "退款失败");
  435. ResUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  436. return null;
  437. }
  438. // 设置订单状态为退款中
  439. book.setOrderStatus(Func.parseStr(PayEnum.退款中.getNum()));
  440. book.setUpdateTime(DateUtil.parseDateToStr(new Date(),DateUtil.Time_Formatter_Second));
  441. bookService.updateBooking(book); // 退款中
  442. // 用户在待支付状态下取消了订单时,写入数据操作
  443. bookinglogService.addBooklog("用户在取消了订单,正进入退款流程",book);
  444. jsonObject.put("code", 200);
  445. jsonObject.put("message", "申请已提交,请稍候查询");
  446. return jsonObject;
  447. }
  448. // /**
  449. // * open_id
  450. // * bookingId
  451. // * 微信退款功能
  452. // */
  453. // public String refundBooking() throws Exception {
  454. // JSONObject resultJson = new JSONObject();
  455. // if (Func.checkNull(this.open_id) || Func.checkNull(this.bookingId)) {
  456. // resultJson.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  457. // resultJson.put(B.message, "未传入open_id和bookingId");
  458. // ResponseUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString());
  459. // return null;
  460. // }
  461. //
  462. // Users users = userService.queryByOpenid(open_id); // 用户信息
  463. // Booking booking = bookService.getById(Func.parseInt(bookingId)); // 订单信息
  464. // if (users == null || booking == null) {
  465. // resultJson.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  466. // resultJson.put(B.message, "未查询到当前用户数据users,请先授权");
  467. // ResponseUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString());
  468. // return null;
  469. // }
  470. //
  471. // String ip = WeiXinUtil.ip;
  472. // double money = booking.getPayAccount();
  473. // int a = (int) (money * 100);
  474. // WechatUnifiedOrder w = new WechatUnifiedOrder();
  475. // w.setAppid(WeiXinUtil.appid_c);
  476. // w.setAttach("chuanghai");
  477. // w.setBody("chuanghai");
  478. // w.setMch_id(WeiXinUtil.account);
  479. // w.setNonce_str(PayWxUtil.getNonceStr());// 随机支付串
  480. // w.setNotify_url(WeiXinUtil.ip_h + "/abkquery_refund.action");// 支付结果回调地址
  481. // w.setOpenid(open_id);
  482. // w.setOut_trade_no(booking.getOrderNum());
  483. // String refund_order = WxUtil.mchOrderNo();
  484. // w.setOut_refund_no(refund_order); // 退款单号
  485. // w.setSpbill_create_ip(ip);
  486. // w.setTotal_fee(a);
  487. // w.setRefund_fee(a); // 退款金额
  488. // w.setTrade_type("JSAPI");
  489. // SortedMap<String, String> params = new TreeMap<>();
  490. // params.put("appid", w.getAppid());
  491. // params.put("mch_id", w.getMch_id());
  492. // params.put("nonce_str", w.getNonce_str());
  493. // params.put("notify_url", w.getNotify_url());
  494. // params.put("out_refund_no", w.getOut_refund_no()); // 退款单号
  495. // params.put("out_trade_no", w.getOut_trade_no());
  496. // params.put("refund_fee",w.getRefund_fee()+""); // 退款金额
  497. // params.put("total_fee", w.getTotal_fee() + "");
  498. //
  499. // w.setSign(PayWxUtil.getSign(params, WeiXinUtil.key));
  500. // params.put("sign", w.getSign());
  501. // //String retXml = JaxbUtil.getRequestXml(params);
  502. // String xml = "<xml>" +
  503. // "<appid>" + w.getAppid() + "</appid>" +
  504. // "<mch_id>" + w.getMch_id() + "</mch_id>" +
  505. // "<nonce_str>" + w.getNonce_str() + "</nonce_str>" +
  506. // "<notify_url>" + w.getNotify_url() + "</notify_url>" +
  507. // "<out_refund_no>" + w.getOut_refund_no() + "</out_refund_no>" +
  508. // "<out_trade_no>" + w.getOut_trade_no() + "</out_trade_no>" +
  509. // "<refund_fee>" + w.getRefund_fee()+"" + "</refund_fee>" +
  510. // "<total_fee>" + w.getTotal_fee() + "" + "</total_fee>" +
  511. // "<sign>" + w.getSign() + "</sign>" +
  512. // "</xml>";
  513. // //String msg = HttpsClient.sendPost2("https://api.mch.weixin.qq.com/secapi/pay/refund", retXml);
  514. // String msg = HttpUtils.post2("https://api.mch.weixin.qq.com/secapi/pay/refund", xml);
  515. // if (msg.indexOf("FAIL") > -1) {
  516. // resultJson.put("code", 507);
  517. // resultJson.put("message", "退款失败");
  518. // ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString());
  519. // return null;
  520. // }
  521. //
  522. // // 设置订单状态为退款中
  523. // booking.setOrderStatus(Func.parseStr(PayEnum.TEN.getNum()));
  524. // booking.setUpdateTime(DateUtil.parseDateToStr(new Date(),DateUtil.Time_Formatter_Second));
  525. // bookService.updateBooking(booking); // 退款中
  526. //
  527. // resultJson.put("code", 200);
  528. // resultJson.put("message", "退款申请已提交,请稍候查询");
  529. // ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString());
  530. // return null;
  531. // }
  532. /* 退款回调 */
  533. public String query_refund() throws Exception {
  534. // 查询本地数据库中,正在退款中
  535. StringBuffer strSqlBook = new StringBuffer();
  536. strSqlBook.append(" and order_status = '").append(PayEnum.退款中.getNum()).append("' ");
  537. List<Booking> booking = bookService.queryList(strSqlBook.toString());
  538. if (booking==null){
  539. return null;
  540. }
  541. WechatUnifiedOrder w = new WechatUnifiedOrder();
  542. Map<String, String> params = new HashMap<String, String>();
  543. Booking book = new Booking();
  544. for (int i = 0; i < booking.size(); i++) {
  545. if (booking.get(i) == null)
  546. continue;
  547. book = booking.get(i);
  548. w = new WechatUnifiedOrder();
  549. w.setAppid(WeiXinUtil.appid_c);
  550. w.setAttach("chuanghai");
  551. w.setBody("chuanghai");
  552. w.setMch_id(WeiXinUtil.account);
  553. w.setNonce_str(PayWxUtil.getNonceStr());// 随机支付串
  554. w.setOut_trade_no(book.getOrderNum());
  555. w.setTrade_type("JSAPI");
  556. params = new HashMap<String, String>();
  557. params.put("appid", w.getAppid());
  558. params.put("mch_id", w.getMch_id());
  559. params.put("out_trade_no", w.getOut_trade_no());
  560. params.put("nonce_str", w.getNonce_str());
  561. w.setSign(PayWxUtil.getSign(params, WeiXinUtil.key));
  562. params.put("sign", w.getSign());
  563. String retXml = JaxbUtil.getRequestXml(params);
  564. String msg = HttpUtils.post("https://api.mch.weixin.qq.com/pay/refundquery", retXml);
  565. if (msg.indexOf("<refund_status_0><![CDATA[SUCCESS]]></refund_status_0>")>0) {
  566. // 退款成功,将数据写入本地数据库
  567. book.setRefundTime(DateUtil.parseDateToStr(new Date(),DateUtil.Time_Formatter_Second));
  568. book.setRefundAmount(book.getHouseTotalPrice());
  569. book.setUpdateTime(DateUtil.parseDateToStr(new Date(),DateUtil.Time_Formatter_Second));
  570. book.setOrderStatus(Func.parseStr(PayEnum.getKeyByValue(book.getRemake()))); // 将走微信前的标识,写入回调函数
  571. bookService.updateBooking(book);
  572. // 退款成功后,写入数据操作
  573. bookinglogService.addBooklog("用户在取消了订单,已退款成功,退款金额是" + book.getRefundAmount() ,book);
  574. // 发送成功消息给商家和用户
  575. AdminManager adminManager = adminManagerService.getById(Func.parseInt(book.getHotelManagerId()));
  576. Users users = userService.queryByUserId(book.getCreateUserid());
  577. String sendMsg = book.getRemake();
  578. // 推给用户(需求确定,用户点取消退款以后[标识订单状态已取消]只发商家,不发用户。 商家点拒单以后[标识订单状态已退单]只发用户不发商家)
  579. int status = Func.parseInt(book.getOrderStatus());
  580. if (status == PayEnum.已退单.getNum()){
  581. Message.send(users.getOpenid(),book.getHotelName(),book.getOrderStatus(), book.getOrderStartTime(),book.getOrderEndTime(), book.getHouseName());
  582. }
  583. // 推给商家
  584. String live_end = book.getOrderStartTime().substring(0,10) +"~"+ book.getOrderEndTime().substring(0,10);
  585. String hotelName = Func.checkNull(book.getHotelName()) ? book.getHotelName() : book.getHouseName();
  586. if (status == PayEnum.已取消.getNum()) {
  587. Message2.send(adminManager.getOpenid(), book.getHotelType(), book.getHouseName(), live_end, book.getUserName(), hotelName, Func.parseStr(book.getId()));
  588. }
  589. }
  590. }
  591. String returnMsg = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  592. HttpServletResponse response = ServletActionContext.getResponse();
  593. response.setContentType("text/html;charset=utf-8");
  594. PrintWriter out = response.getWriter();
  595. out.println(returnMsg);
  596. out.flush();
  597. out.close();
  598. return null;
  599. }
  600. /**
  601. * bookingId 订单id
  602. * 删除订单功能(假删除)
  603. *
  604. * @return
  605. */
  606. public String delBooking() {
  607. if (Func.checkNull(getBookingId()))
  608. return null;
  609. JSONObject jsonObject = new JSONObject();
  610. String mess = bookService.delBooking(getBookingId());
  611. if (!Func.checkNull(mess)) {
  612. jsonObject.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  613. jsonObject.put(B.message, mess);
  614. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  615. return null;
  616. }
  617. jsonObject.put(B.code, ResultStatusCode.OK.getStatus());
  618. jsonObject.put(B.message, ResultStatusCode.OK.getMsg());
  619. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  620. return null;
  621. }
  622. /**
  623. * 验证是否有房间
  624. * houseId, 房型id
  625. * startTime, 开始时间
  626. * endTime 结束时间
  627. *
  628. * @return
  629. */
  630. public String varificationHouse() {
  631. JSONObject jsonObject = new JSONObject();
  632. if (Func.checkNull(houseId) || Func.checkNull(startTime) || Func.checkNull(endTime)) {
  633. jsonObject.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  634. jsonObject.put(B.message, ResultStatusCode.BAD_REQUEST.getMsg());
  635. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  636. return null;
  637. }
  638. String backMessage = appBookService.varificationHouse(houseId, startTime, endTime,houseOrderNumber);
  639. if (!Func.checkNull(backMessage)) {
  640. jsonObject.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  641. jsonObject.put(B.message, backMessage);
  642. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  643. return null;
  644. }
  645. jsonObject.put(B.code, ResultStatusCode.OK.getStatus());
  646. jsonObject.put(B.message, OrderEnum.有空房.toString());
  647. ResponseUtil.writeJson(ServletActionContext.getResponse(), jsonObject.toString());
  648. return null;
  649. }
  650. /**
  651. * open_id
  652. * bookingId
  653. * 用户支付操作
  654. *
  655. * @return
  656. */
  657. public String pay() {
  658. JSONObject resultjson = new JSONObject();
  659. if (Func.checkNull(this.open_id) || Func.checkNull(this.bookingId)) {
  660. resultjson.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  661. resultjson.put(B.message, ResultStatusCode.BAD_REQUEST.getMsg());
  662. ResponseUtil.writeJson(ServletActionContext.getResponse(), resultjson.toString());
  663. return null;
  664. }
  665. Users users = userService.queryByOpenid(open_id); // 用户信息
  666. Booking booking = bookService.getById(Func.parseInt(bookingId)); // 订单信息
  667. if (users == null || booking == null || booking.getOrderStatus().equals(Func.parseStr(PayEnum.支付超时.getNum()))) {
  668. resultjson.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  669. resultjson.put(B.message, ResultStatusCode.BAD_REQUEST.getMsg());
  670. ResponseUtil.writeJson(ServletActionContext.getResponse(), resultjson.toString());
  671. return null;
  672. }
  673. try {
  674. // 支付费用
  675. double totalPrice = booking.getHouseTotalPrice() ;
  676. int totalfee = Func.parseInt(totalPrice * 100);
  677. WechatUnifiedOrder w = new WechatUnifiedOrder();
  678. w.setAppid(WeiXinUtil.appid_c);
  679. w.setAttach("chuanghai");
  680. w.setBody("chuanghai");
  681. w.setMch_id(WeiXinUtil.account);
  682. w.setNonce_str(PayWxUtil.getNonceStr());// 随机支付串
  683. w.setNotify_url(WeiXinUtil.ip_h + "/abkpayResulet.action");// 支付结果回调地址
  684. w.setOpenid(this.open_id);
  685. String orderNo = booking.getOrderNum(); // 订单编号
  686. w.setOut_trade_no(orderNo);
  687. w.setSpbill_create_ip(WeiXinUtil.ip);
  688. w.setTotal_fee(totalfee);
  689. w.setTrade_type("JSAPI");
  690. Map<String, String> params = new HashMap<String, String>();
  691. params.put("attach", w.getAttach());
  692. params.put("appid", w.getAppid());
  693. params.put("mch_id", w.getMch_id());
  694. params.put("nonce_str", w.getNonce_str());
  695. params.put("body", w.getBody());
  696. params.put("out_trade_no", w.getOut_trade_no());
  697. params.put("total_fee", Func.parseStr(w.getTotal_fee()));
  698. params.put("spbill_create_ip", w.getSpbill_create_ip());
  699. params.put("notify_url", w.getNotify_url());
  700. params.put("trade_type", w.getTrade_type());
  701. params.put("openid", w.getOpenid());
  702. w.setSign(PayWxUtil.getSign(params, WeiXinUtil.key));
  703. params.put("sign", w.getSign());
  704. String retXml = JaxbUtil.getRequestXml(params);
  705. String msg = HttpUtils.post("https://api.mch.weixin.qq.com/pay/unifiedorder", retXml);
  706. System.out.println(msg);
  707. // 支付失败
  708. if (msg.indexOf("FAIL") > -1) {
  709. resultjson.put("code", "205");
  710. resultjson.put("message", "支付异常205");
  711. ResUtil.write(resultjson, ServletActionContext.getResponse());
  712. return null;
  713. }
  714. JaxbUtil requestBinder = new JaxbUtil(TongYiReturn.class, JaxbUtil.CollectionWrapper.class);
  715. TongYiReturn to = requestBinder.fromXml(msg);
  716. // 支付成功
  717. if (to.getReturn_code().equals("SUCCESS") && to.getResult_code().equals("SUCCESS")) {
  718. EndPay pay = new EndPay();
  719. pay.setAppId(WeiXinUtil.appid_c);
  720. pay.setSignType("MD5");
  721. pay.setTimeStamp(System.currentTimeMillis() / 1000 + "");
  722. pay.setPrepay_id(to.getPrepay_id());
  723. pay.setNonceStr(PayWxUtil.getNonceStr());
  724. Map<String, String> requestMap = new HashMap<String, String>();
  725. requestMap.put("appId", pay.getAppId());
  726. requestMap.put("timeStamp", pay.getTimeStamp());
  727. requestMap.put("nonceStr", pay.getNonceStr());
  728. requestMap.put("package", "prepay_id=" + pay.getPrepay_id());
  729. requestMap.put("signType", "MD5");
  730. pay.setPaySign(PayWxUtil.getSign(requestMap, WeiXinUtil.key));
  731. // 保存支付信息
  732. booking.setUpdateTime(DateUtil.getFormatPaternDate(new Date()));
  733. booking.setOrderStatus(Func.parseStr(PayEnum.待支付.getNum()));
  734. booking.setPayAccount(totalPrice);
  735. booking.setPayWay(OrderEnum.微信支付.toString());
  736. bookService.updateBooking(booking);
  737. //用户开启支付,写入数据操作
  738. bookinglogService.addBooklog("用户点击订单,进行支付" ,booking);
  739. //通过订单id找到所属优惠券
  740. List<HotelCouponStatus> hotelCouponStatusList = hotelCoupomStatusService.getBookingId(bookingId);
  741. if (hotelCouponStatusList != null && hotelCouponStatusList.size() > 0) {
  742. for (HotelCouponStatus hotelCouponStatus : hotelCouponStatusList) {
  743. String complaintId = hotelCouponStatus.getComplaintId();
  744. HotelCoupon hotelCoupon = hotelCoupomService.getById(complaintId);
  745. if (hotelCoupon!=null) {
  746. Integer reversedNumber = hotelCoupon.getReversedNumber();
  747. if (reversedNumber==null) {
  748. reversedNumber=0;
  749. }
  750. hotelCoupon.setReversedNumber(reversedNumber+1);
  751. hotelCoupon.setModifyDate(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
  752. hotelCoupomService.update(hotelCoupon);
  753. }
  754. }
  755. }
  756. resultjson.put(B.code, ResultStatusCode.OK.getStatus());
  757. resultjson.put(B.message, "返回成功");
  758. resultjson.put(B.data, pay);
  759. ResponseUtil.writeJson(ServletActionContext.getResponse(), resultjson.toString());
  760. }
  761. } catch (Exception e) {
  762. resultjson.put(B.code, ResultStatusCode.BAD_REQUEST.getStatus());
  763. resultjson.put(B.message, e.getMessage());
  764. ResponseUtil.writeJson(ServletActionContext.getResponse(), resultjson.toString());
  765. }
  766. return null;
  767. }
  768. /**
  769. * 支付成功后回调,推送消息给商家
  770. *
  771. */
  772. public String payResulet(){
  773. System.out.println("进入支付回调====");
  774. JSONObject resultjson = new JSONObject();
  775. try{
  776. BufferedReader reader = null;// BufferedReader 字符输入流
  777. reader = request.getReader();
  778. String line = "";
  779. String xmlString = null;
  780. StringBuilder inputString = new StringBuilder();
  781. while ((line = reader.readLine()) != null) {
  782. inputString.append(line);
  783. }
  784. xmlString = inputString.toString();
  785. request.getReader().close();
  786. JaxbUtil requestBinder = new JaxbUtil(PayResult.class, PayResult.class);
  787. PayResult result = requestBinder.fromXml(xmlString);// Xml到Java,用fromXML()方法
  788. String order_num = result.getOut_trade_no();
  789. System.out.println("支付成功回调,订单号:"+order_num);
  790. Booking book = bookService.queryByOrder(order_num);
  791. // 支付成功
  792. if (result.getResult_code().equals("SUCCESS") && book!=null && ("1").equals(book.getOrderStatus())) {
  793. // 保存支付信息
  794. book.setUpdateTime(DateUtil.getFormatPaternDate(new Date()));
  795. book.setOrderStatus(Func.parseStr(PayEnum.已支付.getNum()));
  796. book.setPayTime(DateUtil.getFormatPaternDate(new Date()));
  797. book.setPayWay(OrderEnum.微信支付.toString());
  798. // 进行业务判断,如果是商家设定了自动接单,则支付状态直接变为待入住 接单设置(1自动接单 2手动接单)
  799. if ("1".equals(book.getHotelIsOrder()))
  800. {
  801. // 自动接单,订单状态修改为待入住
  802. book.setOrderStatus(Func.parseStr(PayEnum.待入住.getNum()));
  803. String userId = book.getCreateUserid();
  804. Users users = userService.queryByUserId(userId);
  805. String mess = "您已成功订房,订单号:"+order_num;
  806. Message.send(users.getOpenid(),book.getHotelName(),book.getOrderStatus(), book.getOrderStartTime(),book.getOrderEndTime(), book.getHouseName());
  807. }
  808. // 手动接单,发消息给商家
  809. AdminManager adminManager = adminManagerService.getById(Func.parseInt(book.getHotelManagerId()));
  810. String live_end = book.getOrderStartTime().substring(0,10) +"~"+ book.getOrderEndTime().substring(0,10);
  811. String hotelName = book.getHotelName();
  812. if (Func.checkNull(book.getHotelName()))
  813. {
  814. hotelName = book.getHouseName();
  815. }
  816. Message2.send(adminManager.getOpenid(),order_num,book.getHouseName(),live_end,book.getUserName(),hotelName, Func.parseStr(book.getId()));
  817. int m = bookService.updateBooking(book);
  818. //用户支付,写入数据操作
  819. bookinglogService.addBooklog("用户支付成功" ,book);
  820. if (m>0){
  821. String returnMsg = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  822. HttpServletResponse response = ServletActionContext.getResponse();
  823. response.setContentType("text/html;charset=utf-8");
  824. PrintWriter out = response.getWriter();
  825. out.println(returnMsg);
  826. out.flush();
  827. out.close(); // 发送成功消息给商家
  828. }
  829. return null;
  830. }
  831. } catch (Exception e){
  832. resultjson.put("message", "支付失败");
  833. resultjson.put("code", 205);
  834. ResUtil.writeJson(ServletActionContext.getResponse(), resultjson.toString());
  835. return null;
  836. }
  837. resultjson.put("message", "支付失败");
  838. resultjson.put("code", 205);
  839. ResUtil.writeJson(ServletActionContext.getResponse(), resultjson.toString());
  840. return null;
  841. }
  842. public String getOpen_id() {
  843. return open_id;
  844. }
  845. public void setOpen_id(String open_id) {
  846. this.open_id = open_id;
  847. }
  848. }