package com.happy.action; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.happy.Model.Recharge; import com.happy.Model.Users; import com.happy.Model.WeiXinUtil; import com.happy.Model.weixin.PayResult; import com.happy.Model.weixin.WechatUnifiedOrder; import com.happy.Until.HttpUtils; import com.happy.Until.ResUtil; import com.happy.Until.ResponseUtil; 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.service.ConsumeService; import com.happy.service.RechargeService; import com.happy.service.UserService; import com.happy.service.WxMenuService; import com.opensymphony.xwork2.ActionSupport; import net.sf.json.JSONObject; import org.apache.struts2.ServletActionContext; import org.apache.struts2.interceptor.ServletRequestAware; 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.Date; import java.util.HashMap; import java.util.List; import java.util.Map; public class Elec extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; public HttpServletResponse response; public String code; public String stu_number; public String re_time; @Resource public UserService userService; @Resource public ConsumeService consumeService; @Resource public RechargeService rechargeService; @Resource public WxMenuService wxMenuService; 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 Pay() throws Exception { HttpSession session = request.getSession(); Gson gson=new Gson(); JSONObject resultJson = new JSONObject(); 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); w.setOut_trade_no("" + new Date().getTime()); 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); if (session.getAttribute("p_biao") != null) { // 说明时从打转盘页面进来的,支付完成后继续调到转盘页面 json.put("p_biao", 1); session.removeAttribute("p_biao"); } else { json.put("p_biao", 0); } ResUtil.write(json, ServletActionContext.getResponse()); } } } else { // 说明不是会员 JSONObject json = new JSONObject(); json.put("pay", 1); ResUtil.write(json, ServletActionContext.getResponse()); } return null; } // 第五步:支付页面用户输完密码后微信会把支付结果回调到这里,我们根据需要存储支付记录,和执行不同的方法 public String payResulet() throws Exception { // 微信支付结果通知 // System.out.println("进来了"); 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 account = result.getTransaction_id();// 微信支付订单号 System.out.println("支付成功了"); System.out.println("result=" + result.toString()); Recharge pays = rechargeService.findPayByNo(account);// 根据 微信支付订单号 查找支付记录信息 if (pays != 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 { // 交易记录开始记录 // if(openid.equals(result.getOpenid()) && num == result.getTotal_fee() / 100){ //支付成功 // 获得交易支付成功用户的信息 Recharge pay1 = new Recharge(); List u = userService.queryByopenid(result.getOpenid()); // 查找充值的会员信息 pay1.setAccount((double) result.getTotal_fee() / 100); System.out.println("金额:"+ result.getTotal_fee()); pay1.setUser_name(u.get(0).getUser_name()); pay1.setStu_number(u.get(0).getStu_number()); pay1.setCard_number(u.get(0).getCard_number()); pay1.setOrder_num(new String(account.getBytes("utf-8"))); SimpleDateFormat simp = new SimpleDateFormat("yyyyMMddHHmmss"); SimpleDateFormat simp1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = simp.parse(result.getTime_end()); String time = simp1.format(date); pay1.setRe_time(time); // 支付结束时间 System.out.println("金额:"+pay1.getAccount()); rechargeService.insertRecharge2(pay1); // userService.update2((double) result.getTotal_fee() / 10, u.getId()); 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 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; } }