j界面调用支付ajax 通过xml格式向微信调起支付密码窗
// 微信支付 $.ajax({ type: "POST", url: path + "/wxpay/getPrepayId.do", dataType: "json", data: { totalFee : payCost, out_trade_no : orderNum, }, success: function(data) { wx.chooseWXPay({ appId: data.appId, timestamp: data.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 nonceStr: data.nonceStr, // 支付签名随机串,不长于 32 位 package: data.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***) signType: data.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: data.paySign, // 支付签名 success: function (res) { if (res.err_msg == "get_brand_wcpay_request:ok") { myLoading(); queryOrder(0); return; } if (res.errMsg == "chooseWXPay:ok") { myLoading(); queryOrder(0); return; }; }, error: function(res) { myAlert("请求超时,请重试"); }, complete: function() { myLoadingClose(); } }); } });
getPrepayId 方法:
@Action(value = "getPrepayId")
public String getPrepayId() throws Exception {
ProjSession ps = this.getSession();
//判断
// 商品描述,根据提交上来的ID来获取商品名称
String body = "服务";
String totalFeeStr = this.getRequest().getParameter("totalFee");
String out_trade_no = this.getRequest().getParameter("out_trade_no");
// 本次订单的金额,单位为分
Double d = Double.parseDouble(totalFeeStr) * 100;
int totalFee = Integer.parseInt(new java.text.DecimalFormat("0").format(d));
// 向微信发送的内容
UnifiedorderReqData xmlObj = new UnifiedorderReqData(body, out_trade_no, totalFee, this.getRequest().getRemoteAddr(), ps.getOpenid());
// 向微信发送接口数据
String result = WeixinUtil.weixinPostXml(Configure.UNIFIEDORDER, xmlObj);
// 微信返回的数据
UnifiedorderRespData retModel = (UnifiedorderRespData) Util.getObjectFromXML(result, UnifiedorderRespData.class);
Map<String, Object> returnMap = new HashMap<String, Object>();
if (ObjUtil.isNullOrEmpty(retModel)) {
// 支付请求失败
returnMap.put("success", false);
returnMap.put("msg", "支付请求失败");
this.doResponseWithJson(returnMap);
return NONE;
}
if (!"SUCCESS".equals(retModel.getReturn_code().toUpperCase())) {
// 支付请求失败
returnMap.put("success", false);
returnMap.put("msg", retModel.getReturn_msg());
this.doResponseWithJson(returnMap);
return NONE;
}
if (!retModel.getResult_code().toUpperCase().equals("SUCCESS")) {
returnMap.put("success", false);
returnMap.put("msg", retModel.getErr_code_des());
this.doResponseWithJson(returnMap);
return NONE;
}
//判断是否有预支付订单
OrderModel smodel=new OrderModel();
smodel.setOpenId(model.getOpenId());
smodel.setOrderStatus(Constants.ORDER_STATUS_2);
List<OrderModel> olist =this.getDao().selectForList("order.getOpenIdStatus", smodel);
if(ObjUtil.isNullOrEmpty(olist)){
// 插入dd_order表
//预支付
model.setOrderStatus(Constants.ORDER_STATUS_2);
model.setOrderWebStatus(Constants.ORDER_STATUS_2);
this.getDao().insertSql("order.add_order", model);
}else{
model.setId(olist.get(0).getId());
model.setOrderStatus(Constants.ORDER_STATUS_2);
model.setOrderWebStatus(Constants.ORDER_STATUS_2);
this.getDao().updateSql("order.upt_order_openId", model);
}
returnMap.put("appId", Constants.APPID);
returnMap.put("timeStamp", Long.toString(System.currentTimeMillis() / 1000));
returnMap.put("nonceStr", RandomStringGenerator.getRandomStringByLength(32));
returnMap.put("package", "prepay_id="+retModel.getPrepay_id());
returnMap.put("signType", "MD5");
returnMap.put("paySign", Signature.getSign(returnMap));
this.doResponseWithJson(returnMap);
return NONE;
}
如果调用支付窗口成功,输入密码成功。
先调用WxNotifyAction.java
@Namespace("/notify") public class WxNotifyAction extends BaseAction { private static final long serialVersionUID = 1L; private TradeService tradeService = new TradeServiceImpl(); @Action(value = "notify") public String notification() throws Exception { System.out.println("!!!!!!!!!!!into notify"); HttpServletRequest req = this.getRequest(); HttpServletResponse resp = this.getResponse(); req.setCharacterEncoding("utf-8"); InputStream reqBody = req.getInputStream(); resp.setCharacterEncoding("utf-8"); resp.setContentType("text/xml; charset=utf-8"); String receiveXml = Util.inputStreamToString(reqBody); System.out.println(receiveXml); Notice retModel = (Notice) Util.getObjectFromXML(receiveXml, Notice.class); PrintWriter out = resp.getWriter(); if (ObjUtil.isNullOrEmpty(retModel)) { out.print("<xml><return_code>FAIL</return_code><return_msg>NO_HANDLER_REPORTED</return_msg></xml>"); return NONE; } if (!"SUCCESS".equals(retModel.getReturn_code().toUpperCase())) { out.print("<xml><return_code>FAIL</return_code><return_msg>NO_HANDLER_REPORTED</return_msg></xml>"); return NONE; } if (!"SUCCESS".equals(retModel.getResult_code().toUpperCase())) { out.print("<xml><return_code>FAIL</return_code><return_msg>NO_HANDLER_REPORTED</return_msg></xml>"); return NONE; } // 调用成功,插入数据库 boolean flag = tradeService.wxPayTrade(retModel); System.out.println("--------------"+flag+"---------------"); // if (flag) { out.print("<xml><return_code>SUCCESS</return_code></xml>"); // } else { // out.print("<xml><return_code>FAIL</return_code><return_msg>NO_HANDLER_REPORTED</return_msg></xml>"); // } return NONE; } }
然后调用js判断是否支付成功,wxpay表是否有数据插入
function queryOrder(requestTimes) { $.ajax({ type : "POST", url : path + "/wxpay/orderQuery.do", data : { orderNum : orderNum}, dataType : "json", success : function(data) { if (!data.success) { if (requestTimes < 3) { requestTimes = requestTimes + 1; setTimeout(function(){queryOrder(requestTimes);}, 1000); } else { myAlert("请求超时,请核对订单列表,确定是否成功下单"); } } else { myLoadingClose(); successPng(); } } }); }
orderQuery
@Action(value = "orderQuery") public String orderQuery() throws Exception { Map<String, Object> returnMap = new HashMap<String, Object>(); ProjSession ps = this.getSession(); OrderModel o = new OrderModel(); // 页面需要把订单编号告诉我 String orderNum = this.getRequest().getParameter("orderNum"); o.setOrderNum(orderNum); o.setPayType(Constants.wxpay); o.setOpenId(ps.getOpenid()); o.setOrderStatus(Constants.ORDER_STATUS_1); List<OrderModel> list = this.getDao().selectForList("wxpay.checkStatus", o); if (!ObjUtil.isNullOrEmpty(list)) { // 交易已经成功 System.out.println("++++++交易已经成功"); returnMap.put("success", true); this.doResponseWithJson(returnMap); } else { // 交易未完成 // 向微信服务器查询订单是否完成 System.out.println("++++++交易未成功"); OrderqueryReqData xmlObj = new OrderqueryReqData(orderNum); String result = WeixinUtil.weixinPostXml(Configure.ORDERQUERY, xmlObj); OrderqueryRespData retModel = (OrderqueryRespData)Util.getObjectFromXML(result, OrderqueryRespData.class); if (ObjUtil.isNullOrEmpty(retModel)) { // 支付请求失败 returnMap.put("success", false); this.doResponseWithJson(returnMap); } if (!"SUCCESS".equals(retModel.getReturn_code().toUpperCase())) { // 支付请求失败 returnMap.put("success", false); this.doResponseWithJson(returnMap); } if (!"SUCCESS".equals(retModel.getResult_code().toUpperCase())) { returnMap.put("success", false); this.doResponseWithJson(returnMap); } Notice n = new Notice(); BeanUtils.copyProperties(n, retModel); boolean flag = tradeService.wxPayTrade(n); returnMap.put("success", flag); this.doResponseWithJson(returnMap); } return NONE; }