package com.happy.action; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.happy.Model.*; import com.happy.Model.weixin.PayResult; import com.happy.Model.weixin.WechatUnifiedOrder; import com.happy.Unitil_nsh.GetHttpParam; import com.happy.Until.HttpUtils; import com.happy.Until.ResUtil; import com.happy.Until.ResponseUtil; import com.happy.Until.Time.OnlineTime; import com.happy.Until.weixin.EndPay; import com.happy.Until.weixin.JaxbUtil; import com.happy.Until.weixin.PayWxUtil; import com.happy.Until.weixin.TongYiReturn; import com.happy.common.http.HttpsClient; import com.happy.common.wx.WxUtil; import com.happy.service.*; import com.opensymphony.xwork2.ActionSupport; import net.sf.json.JSONObject; import org.apache.struts2.ServletActionContext; import org.apache.struts2.interceptor.ServletRequestAware; import testExport.DataClient; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.BufferedReader; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.*; public class Elec extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; public HttpServletResponse response; public String code; public String stu_number; public String re_time; public String roomSelect; public String ord_no; public String out_no; public String status; public String dom; @Resource public UserService userService; @Resource public ConsumeService consumeService; @Resource public RechargeService rechargeService; @Resource public WxMenuService wxMenuService; @Resource public ElecService elecService; public HttpServletRequest getRequest() { return request; } public void setRequest(HttpServletRequest request) { this.request = request; } public void setServletRequest(HttpServletRequest request) { this.request = request; } public HttpServletResponse getResponse() { return response; } public void setResponse(HttpServletResponse response) { this.response = response; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getStu_number() { return stu_number; } public void setStu_number(String stu_number) { this.stu_number = stu_number; } public String getRe_time() { return re_time; } public void setRe_time(String re_time) { this.re_time = re_time; } public String getRoomSelect() { return roomSelect; } public void setRoomSelect(String roomSelect) { this.roomSelect = roomSelect; } public String getOrd_no() { return ord_no; } public void setOrd_no(String ord_no) { this.ord_no = ord_no; } public String getOut_no() { return out_no; } public void setOut_no(String out_no) { this.out_no = out_no; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getDom() { return dom; } public void setDom(String dom) { this.dom = dom; } public String stu_dom() throws Exception { JSONObject resultJson = new JSONObject(); List user = userService.selectByStu(stu_number); if (user == null){ resultJson.put("msg", "未绑定用户信息"); ResUtil.write(resultJson, ServletActionContext.getResponse()); return null; } String school = user.get(0).getCampus(); String room = user.get(0).getDom(); if (school==null || room==null){ resultJson.put("msg", "未绑定宿舍"); ResUtil.write(resultJson, ServletActionContext.getResponse()); return null; } String data = school.concat(room); resultJson.put("msg", "1"); resultJson.put("dom", data); ResUtil.write(resultJson, ServletActionContext.getResponse()); return null; } public String Pay() throws Exception { JSONObject resultJson = new JSONObject(); if (roomSelect==null){ resultJson.put("mess", "请选择房间号!"); ResUtil.write(resultJson, ServletActionContext.getResponse()); return null; } String school = roomSelect.substring(0, 5); String room = roomSelect.substring(5); List spl = elecService.queryUser_id(school, room); if (spl == null){ resultJson.put("mess", "未查询到户号!"); ResUtil.write(resultJson, ServletActionContext.getResponse()); return null; } String user_id = spl.get(0).getUser_id(); HttpSession session = request.getSession(); Gson gson=new Gson(); System.out.println("房间号:"+room); System.out.println("户号:"+user_id); String url = "https://api.weixin.qq.com/sns/jscode2session?" + "appid="+ WeiXinUtil.appid_elc + "&secret="+ WeiXinUtil.screct_elc + "&js_code="+code+ "&grant_type=authorization_code"; if (code==null){ resultJson.put("mess", "code不能为空"); ResUtil.write(resultJson, ServletActionContext.getResponse()); } String jsons = HttpsClient.sendPost(url, ""); HashMap userMap = gson.fromJson(jsons.toString(), new TypeToken>(){}.getType()); String open_id = ""; try{ open_id = userMap.get("openid").toString(); }catch (Exception e){ resultJson.put("mess", "code超时"); ResUtil.write(resultJson, ServletActionContext.getResponse()); return null; } List u = userService.queryByopenid(open_id); // 查找是不是会员,不是会员不能充值 String num = request.getParameter("num"); session.setAttribute("num", num); // 存入金额session中 if (u != null ) { String ip = request.getParameter("ip"); double money = Double.parseDouble(request.getParameter("num")); int a = (int) (money * 100); WechatUnifiedOrder w = new WechatUnifiedOrder(); w.setAppid(WeiXinUtil.appid); w.setAttach("chuanghai"); w.setBody("chuanghai"); w.setMch_id(WeiXinUtil.account_elc); w.setNonce_str(PayWxUtil.getNonceStr());// 随机支付串 w.setNotify_url(WeiXinUtil.ip + "elpayResulet.action");// 支付结果回调地址 w.setOpenid(open_id); String orderNo = WxUtil.mchOrderNo(); w.setOut_trade_no(orderNo); w.setSpbill_create_ip(ip); w.setTotal_fee(a); w.setTrade_type("JSAPI"); Map params = new HashMap(); params.put("attach", w.getAttach()); params.put("appid", w.getAppid()); params.put("mch_id", w.getMch_id()); params.put("nonce_str", w.getNonce_str()); params.put("body", w.getBody()); params.put("out_trade_no", w.getOut_trade_no()); params.put("total_fee", w.getTotal_fee() + ""); params.put("spbill_create_ip", w.getSpbill_create_ip()); params.put("notify_url", w.getNotify_url()); params.put("trade_type", w.getTrade_type()); params.put("openid", w.getOpenid()); w.setSign(PayWxUtil.getSign(params, WeiXinUtil.APIid_elc)); params.put("sign", w.getSign()); String retXml = JaxbUtil.getRequestXml(params); String msg = HttpUtils.post("https://api.mch.weixin.qq.com/pay/unifiedorder", retXml); System.out.println("msg: "+ msg); if (msg.indexOf("FAIL") > -1) { JSONObject json = new JSONObject(); json.put("pay", "error"); ResponseUtil.write(json, ServletActionContext.getResponse()); return null; } else { JaxbUtil requestBinder = new JaxbUtil(TongYiReturn.class, JaxbUtil.CollectionWrapper.class); TongYiReturn to = requestBinder.fromXml(msg); if (to.getReturn_code().equals("SUCCESS") && to.getResult_code().equals("SUCCESS")) { EndPay pay = new EndPay(); pay.setAppId(WeiXinUtil.appid_elc); pay.setSignType("MD5"); pay.setTimeStamp(System.currentTimeMillis() / 1000 + ""); pay.setPrepay_id(to.getPrepay_id()); pay.setNonceStr(PayWxUtil.getNonceStr()); Map requestMap = new HashMap(); requestMap.put("appId", pay.getAppId()); requestMap.put("timeStamp", pay.getTimeStamp()); requestMap.put("nonceStr", pay.getNonceStr()); requestMap.put("package", "prepay_id=" + pay.getPrepay_id()); requestMap.put("signType", "MD5"); pay.setPaySign(PayWxUtil.getSign(requestMap, WeiXinUtil.APIid_elc)); // requestMap.put("sign",pay.getPaySign()); // String ret = JaxbUtil.getRequestXml(requestMap); // System.out.println(ret); JSONObject json = new JSONObject(); json.put("pay", pay); ResUtil.write(json, ServletActionContext.getResponse()); Recharge_elc pay1 = new Recharge_elc(); SimpleDateFormat simp1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = simp1.format(new Date()); pay1.setOrder_num(orderNo); pay1.setStu_number(u.get(0).getStu_number()); pay1.setAccount((double) a / 100); pay1.setUser_name(u.get(0).getUser_name()); pay1.setState(0); pay1.setCard_number(u.get(0).getStu_number()); pay1.setRe_time(time); pay1.setSchool(school); List be = elecService.queryBuildByDom(room); pay1.setRoom(room); pay1.setBuild(be.get(0).getBuild()); rechargeService.insertRecharge2(pay1); System.out.println("保存成功"); } } } else { // 说明不是会员 JSONObject json = new JSONObject(); json.put("pay", 1); ResUtil.write(json, ServletActionContext.getResponse()); } return null; } // 第五步:支付页面用户输完密码后微信会把支付结果回调到这里,我们根据需要存储支付记录,和执行不同的方法 public String payResulet() throws Exception { // 微信支付结果通知 System.out.println("进来了"); Gson gson = new Gson(); BufferedReader reader = null;// BufferedReader 字符输入流 reader = request.getReader(); String line = ""; String xmlString = null; StringBuffer inputString = new StringBuffer(); while ((line = reader.readLine()) != null) { inputString.append(line); } xmlString = inputString.toString(); request.getReader().close(); JaxbUtil requestBinder = new JaxbUtil(PayResult.class, PayResult.class); PayResult result = requestBinder.fromXml(xmlString);// Xml到Java,用fromXML()方法 if (result.getResult_code().equals("SUCCESS")) { // 交易成功,支付结果转换为对象 String orderNo = result.getOut_trade_no();// 微信支付订单号 rechargeService.succRecharge2(orderNo); // 修改支付状态为已支付 System.out.println("支付成功了"); System.out.println("result=" + result.toString()); System.out.println("订单号:"+orderNo); Recharge_elc re = rechargeService.findPayElByNo(orderNo);// 根据 微信支付订单号 查找支付记录信息 System.out.println("订单号二:"+re.getOrder_num()); // 更新宿舍号 System.out.println("房间号:"+re.getSchool()); userService.updateDom(re.getSchool(), re.getBuild(), re.getRoom(), re.getStu_number()); if (re == null) { // 没有交易记录 发送失败消息给商家 String returnMsg = ""; HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println(returnMsg); out.flush(); out.close(); // System.out.println("pay不为空"); } else { // 交易记录开始记录 // 获得交易支付成功用户的信息 List be = elecService.queryUser_id(re.getSchool(), re.getRoom()); System.out.println("金额:"+re.getAccount()); try { // 充值到第三方 DataClient.getToken(); com.alibaba.fastjson.JSONObject mess = DataClient.recharege(be.get(0).getUser_id(), orderNo, String.valueOf(re.getAccount())); HashMap userMap = gson.fromJson(mess.toString(), new TypeToken>() {}.getType()); String msg = userMap.get("msg"); System.out.println("msg: "+msg); if (msg.equals("请求成功")) { System.out.println("请求接口成功。。"); rechargeService.succRecharge3(orderNo); // 修改到账状态 } }catch (Exception e){ return null; } String returnMsg = ""; HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println(returnMsg); out.flush(); out.close(); // 发送成功消息给商家 } } return null; } public String pay_ns() throws Exception { JSONObject resultJson = new JSONObject(); Gson gson = new Gson(); String orderNo = WxUtil.mchOrderNo(); if (roomSelect == null || roomSelect.equals("")){ resultJson.put("msg", "获取宿舍异常"); ResUtil.write(resultJson, ServletActionContext.getResponse()); return null; } String school = roomSelect.substring(0, 5); String room = roomSelect.substring(5); if (stu_number==null || stu_number.equals("")){ resultJson.put("msg", "学号不能为空"); ResUtil.write(resultJson, ServletActionContext.getResponse()); return null; } String mon = request.getParameter("num"); if (mon == null || mon.equals("")){ resultJson.put("msg", "获取金额异常"); ResUtil.write(resultJson, ServletActionContext.getResponse()); return null; } String url = "https://api.weixin.qq.com/sns/jscode2session?" + "appid="+ WeiXinUtil.appid_elcn + "&secret="+ WeiXinUtil.screct_elcn + "&js_code="+code+ "&grant_type=authorization_code"; if (code==null){ resultJson.put("mess", "code不能为空"); ResUtil.write(resultJson, ServletActionContext.getResponse()); } String jsons = HttpsClient.sendPost(url, ""); HashMap userMap = gson.fromJson(jsons.toString(), new TypeToken>(){}.getType()); String open_id = ""; try{ open_id = userMap.get("openid").toString(); }catch (Exception e){ resultJson.put("mess", "code超时"); ResUtil.write(resultJson, ServletActionContext.getResponse()); return null; } double money = Double.parseDouble(mon); int a = (int) (money * 100); com.alibaba.fastjson.JSONObject json = elecService.payOrder(orderNo, "WeixinJXYL", null, "电费充值", a, 0, 0, a, null, null, null, null, null, "附加数据", null, WeiXinUtil.ip + "elpayResuletNs.action", open_id); List u = userService.selectByStu(stu_number); Recharge_elc pay1 = new Recharge_elc(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = sf.format(new Date()); pay1.setOrder_num(orderNo); pay1.setStu_number(stu_number); pay1.setAccount((double) a / 100); pay1.setUser_name(u.get(0).getUser_name()); pay1.setState(0); pay1.setCard_number(stu_number); pay1.setRe_time(time); pay1.setSchool(school); List be = elecService.queryBuildByDom(room); pay1.setRoom(room); pay1.setBuild(be.get(0).getBuild()); pay1.setDay_time(time.substring(0, 10)); pay1.setPointid(be.get(0).getPointid()); rechargeService.insertRecharge2(pay1); json.put("sub_openid", open_id); json.put("sub_appid", WeiXinUtil.appid_elcn); json.put("order", orderNo); json.put("account", money); json.put("stu_number", stu_number); ResUtil.write(json, ServletActionContext.getResponse()); return null; } public String payResuletNs() throws Exception { System.out.println("成功进入农商"); System.out.println("订单号:"+ord_no); System.out.println(status); JSONObject resultJson = new JSONObject(); Gson gson = new Gson(); if (status.equals("4")){ ResUtil.write("notify_success", ServletActionContext.getResponse()); } if (status.equals("1") ){ rechargeService.succRecharge2(ord_no); // 修改支付状态为已支付 Recharge_elc re = rechargeService.findPayElByNo(ord_no);// 根据 微信支付订单号 查找支付记录信息 List be = elecService.queryUser_id(re.getSchool(), re.getRoom()); try { if (re.getState()==2){ ResUtil.write("notify_success", ServletActionContext.getResponse()); return null; } // 充值到第三方 DataClient.getToken(); com.alibaba.fastjson.JSONObject mess = DataClient.recharege(be.get(0).getUser_id().replace("\n", "").replace("\r", ""), ord_no, String.valueOf(re.getAccount())); HashMap userMap = gson.fromJson(mess.toString(), new TypeToken>() {}.getType()); String msg = userMap.get("msg"); System.out.println("msg: "+msg); if (msg.equals("请求成功")) { System.out.println("请求接口成功。。"); rechargeService.succRecharge3(ord_no); // 修改到账状态 } ResUtil.write("notify_success", ServletActionContext.getResponse()); }catch (Exception e){ ResUtil.write("notify_success", ServletActionContext.getResponse()); return null; } } return null; } public String queyRecordEle() throws Exception { JSONObject resultJson = new JSONObject(); if (stu_number!=null && re_time!=null) { List record = rechargeService.queryRecordByStu(stu_number, re_time); if (record!=null) { resultJson.put("mess", "返回成功"); resultJson.put("data", record); ResUtil.write(resultJson, ServletActionContext.getResponse()); } resultJson.put("mess", "未查到记录"); ResUtil.write(resultJson, ServletActionContext.getResponse()); return null; } resultJson.put("mess", "学号不能为空"); ResUtil.write(resultJson, ServletActionContext.getResponse()); return null; } // 查询每天电费使用量 public String queryDayPower() throws Exception { JSONObject resultJson = new JSONObject(); List dateList = new ArrayList<>(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); for (int i=-2; i>-9; i--){ Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_WEEK,i); dateList.add(simpleDateFormat.format(calendar.getTime())); } StringBuilder sqlx = new StringBuilder(" and dataTime in ("); for (int i=0; i lists = elecService.queryDayPower(dom, sqlx.toString()); resultJson.put("code", "200"); resultJson.put("data", lists); ResUtil.write(resultJson, ServletActionContext.getResponse()); return null; } public String time() throws Exception { JSONObject resultJson = new JSONObject(); String time = OnlineTime.time(); resultJson.put("code", "200"); resultJson.put("data", time); ResUtil.write(resultJson, ServletActionContext.getResponse()); return null; } }