package com.cweb.controller.pay; import com.alibaba.fastjson.JSONObject; import com.cweb.config.SysConst; import com.cweb.config.WxMsgConfig; import com.google.gson.JsonObject; import com.hai.common.exception.ErrorCode; import com.hai.common.exception.ErrorHelp; import com.hai.common.exception.SysCode; import com.hai.common.pay.WechatPayUtil; import com.hai.common.pay.entity.WeChatPayReqInfo; import com.hai.common.pay.util.MD5Util; import com.hai.common.security.AESEncodeUtil; import com.hai.common.security.SessionObject; import com.hai.common.security.UserCenter; import com.hai.common.utils.*; import com.hai.config.CommonSysConst; import com.hai.config.UnionPayConfig; import com.hai.dao.HighGasOrderPushMapper; import com.hai.dao.HighGasOrderRefundMapper; import com.hai.entity.*; import com.hai.enum_type.OrderPushType; import com.hai.enum_type.RechargePayType; import com.hai.model.HighUserModel; import com.hai.model.ResponseData; import com.hai.service.*; import com.hai.service.pay.impl.GoodsOrderServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; import java.math.BigDecimal; import java.util.*; import java.util.concurrent.ThreadLocalRandom; @Controller @RequestMapping(value = "/czOrder") @Api(value = "充值回调") public class CzOrderController { private static Logger log = LoggerFactory.getLogger(TuanYouController.class); @Resource private UserCenter userCenter; @Resource private OutRechargeOrderService outRechargeOrderService; @Resource private OutRechargeChildOrderService outRechargeChildOrderService; @Resource private BsRequestRecordService bsRequestRecordService; @Resource private HighUserService highUserService; @Resource private UnionPayConfig unionPayConfig; @Resource private HighUserPayPasswordService highUserPayPasswordService; @Resource private HighUserCardService highUserCardService; @Resource private HighGasOrderPushMapper highGasOrderPushMapper; @Resource private WechatPayUtil wechatPayUtil; @Resource private ApiOrderRecordService apiOrderRecordService; @Resource private BsIntegralRebateService bsIntegralRebateService; @Resource private HighGoldRecService highGoldRecService; @RequestMapping(value = "/rechargeCallbackByJj", method = RequestMethod.POST) @ApiOperation(value = "尖椒充值回调") @ResponseBody public void rechargeCallbackByJj(@RequestBody String reqBodyStr, HttpServletRequest request, HttpServletResponse response) { try { JSONObject dataObject = JSONObject.parseObject(reqBodyStr, JSONObject.class); // 推送记录 HighGasOrderPush highGasOrderPush = new HighGasOrderPush(); highGasOrderPush.setType(OrderPushType.type2.getType()); highGasOrderPush.setOrderNo(dataObject.getString("out_order_id")); highGasOrderPush.setCreateTime(new Date()); highGasOrderPush.setCode(dataObject.getString("status")); highGasOrderPush.setRequestContent(JSONObject.toJSONString(dataObject)); highGasOrderPush.setReturnContent(dataObject.toJSONString()); highGasOrderPushMapper.insert(highGasOrderPush); // 1 尖椒 2 龙阅 dataObject.put("orderNo" , dataObject.getString("out_order_id")); OutRechargeChildOrder childOrder = outRechargeChildOrderService.findByOrderNo(dataObject.getString("out_order_id")); OutRechargeOrder rechargeOrder = outRechargeOrderService.findByOrderId(childOrder.getParentOrderId()); BsRequestRecord bsRequestRecord = bsRequestRecordService.findRequestRecordByOrderNo(childOrder.getOrderNo()); bsRequestRecord.setReturnContent(String.valueOf(dataObject)); bsRequestRecord.setUpdateTime(new Date()); bsRequestRecordService.updateRequestRecord(bsRequestRecord); // 判断是否充值成功 if (dataObject.getInteger("status") == 3) { new Thread(() -> { HighUser highUser = highUserService.findByUserId(rechargeOrder.getUserId()); WxMsgConfig.rechargedSuccess( rechargeOrder.getRechargeContent() + "充值成功", String.valueOf(rechargeOrder.getPayRealPrice()), rechargeOrder.getOrderNo(), rechargeOrder.getFinishTime(), RechargePayType.getNameByType(rechargeOrder.getPayType()), highUser.getOpenId()); }).start(); childOrder.setStatus(101); rechargeOrder.setRechargeStatus(202); rechargeOrder.setPayStatus(100); outRechargeOrderService.updateOrder(rechargeOrder); outRechargeChildOrderService.updateOrder(childOrder); if (rechargeOrder.getPayType() == 6) { apiOrderRecord(rechargeOrder); } } else { callbackResult(childOrder , rechargeOrder); } response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter writer= response.getWriter(); writer.write("SUCCESS"); } catch (Exception e) { log.error("WechatPayController --> wechatNotify() error!", e); } } @RequestMapping(value = "/rechargeCallbackByLy", method = RequestMethod.POST) @ApiOperation(value = "龙阅充值回调") @ResponseBody public void rechargeCallbackByLy( @RequestParam(name = "out_trade_num", required = true) String out_trade_num, @RequestParam(name = "userid", required = true) Long userid, @RequestParam(name = "state", required = true) Long state, @RequestBody String reqBodyStr , HttpServletRequest request, HttpServletResponse response) { try { // 推送记录 HighGasOrderPush highGasOrderPush = new HighGasOrderPush(); highGasOrderPush.setType(OrderPushType.type2.getType()); highGasOrderPush.setOrderNo(out_trade_num); highGasOrderPush.setCreateTime(new Date()); highGasOrderPush.setCode(state.toString()); highGasOrderPush.setReturnContent(reqBodyStr); highGasOrderPushMapper.insert(highGasOrderPush); OutRechargeChildOrder childOrder = outRechargeChildOrderService.findByOrderNo(out_trade_num); OutRechargeOrder rechargeOrder = outRechargeOrderService.findByOrderId(childOrder.getParentOrderId()); BsRequestRecord bsRequestRecord = bsRequestRecordService.findRequestRecordByOrderNo(childOrder.getOrderNo()); bsRequestRecord.setReturnContent(reqBodyStr); bsRequestRecord.setUpdateTime(new Date()); bsRequestRecordService.updateRequestRecord(bsRequestRecord); // 判断是否充值成功 if (state == 1) { new Thread(() -> { HighUser highUser = highUserService.findByUserId(rechargeOrder.getUserId()); WxMsgConfig.rechargedSuccess( rechargeOrder.getRechargeContent() + "充值成功", String.valueOf(rechargeOrder.getPayRealPrice()), rechargeOrder.getOrderNo(), rechargeOrder.getFinishTime(), RechargePayType.getNameByType(rechargeOrder.getPayType()), highUser.getOpenId()); }).start(); childOrder.setStatus(101); rechargeOrder.setRechargeStatus(202); rechargeOrder.setPayStatus(100); rechargeOrder.setFinishTime(new Date()); outRechargeOrderService.updateOrder(rechargeOrder); outRechargeChildOrderService.updateOrder(childOrder); if (rechargeOrder.getPayType() == 6) { apiOrderRecord(rechargeOrder); } } else { callbackResult(childOrder , rechargeOrder); } response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter writer= response.getWriter(); writer.write("SUCCESS"); } catch (Exception e) { log.error("WechatPayController --> wechatNotify() error!", e); } } @RequestMapping(value = "/rechargeCallbackByCy", method = RequestMethod.POST) @ApiOperation(value = "城宇充值回调") @ResponseBody public void rechargeCallbackByCy(@RequestBody String reqBodyStr, HttpServletRequest request, HttpServletResponse response) { try { JSONObject dataObject = JSONObject.parseObject(reqBodyStr, JSONObject.class); // 推送记录 HighGasOrderPush highGasOrderPush = new HighGasOrderPush(); highGasOrderPush.setType(OrderPushType.type2.getType()); highGasOrderPush.setOrderNo(dataObject.getString("out_order_id")); highGasOrderPush.setCreateTime(new Date()); highGasOrderPush.setCode(dataObject.getString("status")); highGasOrderPush.setRequestContent(JSONObject.toJSONString(dataObject)); highGasOrderPush.setReturnContent(dataObject.toJSONString()); highGasOrderPushMapper.insert(highGasOrderPush); // // // // 1 尖椒 2 龙阅 // dataObject.put("orderNo" , dataObject.getString("out_order_id")); // // OutRechargeChildOrder childOrder = outRechargeChildOrderService.findByOrderNo(dataObject.getString("out_order_id")); // // OutRechargeOrder rechargeOrder = outRechargeOrderService.findByOrderId(childOrder.getParentOrderId()); // // BsRequestRecord bsRequestRecord = bsRequestRecordService.findRequestRecordByOrderNo(childOrder.getOrderNo()); // // bsRequestRecord.setReturnContent(String.valueOf(dataObject)); // bsRequestRecord.setUpdateTime(new Date()); // bsRequestRecordService.updateRequestRecord(bsRequestRecord); // // // 判断是否充值成功 // if (dataObject.getInteger("status") == 3) { // new Thread(() -> { // HighUser highUser = highUserService.findByUserId(rechargeOrder.getUserId()); // WxMsgConfig.rechargedSuccess( // rechargeOrder.getRechargeContent() + "充值成功", // String.valueOf(rechargeOrder.getPayRealPrice()), // rechargeOrder.getOrderNo(), // rechargeOrder.getFinishTime(), // RechargePayType.getNameByType(rechargeOrder.getPayType()), // highUser.getOpenId()); // }).start(); // childOrder.setStatus(101); // rechargeOrder.setRechargeStatus(202); // rechargeOrder.setPayStatus(100); // // outRechargeOrderService.updateOrder(rechargeOrder); // outRechargeChildOrderService.updateOrder(childOrder); // if (rechargeOrder.getPayType() == 6) { // apiOrderRecord(rechargeOrder); // } // // } else { // callbackResult(childOrder , rechargeOrder); // } response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter writer= response.getWriter(); writer.write("SUCCESS"); } catch (Exception e) { log.error("WechatPayController --> wechatNotify() error!", e); } } // 回调结果处理 private void callbackResult(OutRechargeChildOrder childOrder , OutRechargeOrder rechargeOrder) throws Exception { // 101:充值成功 102: 充值中 103:充值失败 104 未充值 // 订单支付状态 : 101.待支付 102.已支付 100.已完成 104.已取消 105.已退款 if (childOrder.getStatus() == 102 && rechargeOrder.getPayStatus() == 102) { Date rechargeTime = rechargeOrder.getCreateTimed(); Date currentTime = new Date(); // 当前时间减去充值时间 int hours = (int) ((currentTime.getTime() - rechargeTime.getTime()) / (1000 * 60 * 60)); // // 判断快充 并且 充值时间小于6 // if (rechargeOrder.getRechargeType() == 1 && hours < 6) { // outRechargeOrderService.pollRequest(rechargeOrder); // return; // } // 判断慢充 并且 充值时间小于72 if (hours < 72) { outRechargeOrderService.pollRequest(rechargeOrder); return; } rechargeOrder.setRechargeStatus(203); childOrder.setStatus(103); outRechargeOrderService.updateOrder(rechargeOrder); outRechargeChildOrderService.updateOrder(childOrder); outRechargeOrderService.rechargeOrderToRefund(rechargeOrder.getId()); new Thread(() -> { HighUser highUser = highUserService.findByUserId(rechargeOrder.getUserId()); WxMsgConfig.rechargedFail( rechargeOrder.getRechargeContent() + "充值失败", String.valueOf(rechargeOrder.getPayRealPrice()), highUser.getOpenId()); }).start(); } } @RequestMapping(value="/apiCallBack",method = RequestMethod.POST) @ResponseBody @ApiOperation(value = "apiCallBack") public String test(@RequestBody String reqBodyStr) { try { if (StringUtils.isBlank(reqBodyStr)) { log.error("orderToPay error!", "参数错误"); throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, ""); } System.out.println("reqBodyStr"); return "SUCCESS"; } catch (Exception e) { throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, ""); } } @RequestMapping(value="/orderToPayByWx",method = RequestMethod.POST) @ResponseBody @ApiOperation(value = "微信订单支付发起支付") public ResponseData orderToPayByWx(@RequestBody String reqBodyStr) { try { if (StringUtils.isBlank(reqBodyStr)) { log.error("orderToPay error!", "参数错误"); throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, ""); } JSONObject jsonObject = JSONObject.parseObject(reqBodyStr); Long orderId = jsonObject.getLong("orderId"); Integer openIdType = jsonObject.getInteger("openIdType"); // openId类型 1:小程序 2:公众号 String openId = jsonObject.getString("openId"); // openId if (orderId == null || StringUtils.isBlank(openId)) { log.error("orderToPay error!", "参数错误"); throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, ""); } // 订单 OutRechargeOrder order = outRechargeOrderService.findByOrderId(orderId); if (order == null) { log.error("orderToPay error!", "未找到订单信息"); throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到订单信息"); } // 订单状态 : 订单支付状态 : 101.待支付 102.已支付 100.已完成 104.已取消 105.已退款 if (order.getPayStatus() != 101) { log.error("orderToPayByWx error!", "无法支付,订单不处于待支付状态"); throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "无法支付,订单不处于待支付状态"); } Map map = new HashMap<>(); map.put("orderNo", order.getOrderNo()); map.put("payPrice", order.getPayRealPrice()); map.put("orderScene", "RECHARGE_ORDER"); map.put("body","充值话费"); map.put("subject","充值话费"); //微信支付 String nonce_str = MD5Util.MD5Encode(String.valueOf(ThreadLocalRandom.current().nextInt(10000)), "UTF-8"); int total_fee = MathUtils.objectConvertBigDecimal(map.get("payPrice")).multiply(new BigDecimal("100")).intValue(); WeChatPayReqInfo weChatPayReqInfo = new WeChatPayReqInfo(); weChatPayReqInfo.setAppid(SysConst.getSysConfig().getWxMchAppId()); //公众号id weChatPayReqInfo.setMch_id(SysConst.getSysConfig().getWxMchId()); //商户号 if (openIdType != null && openIdType.equals(2)) { weChatPayReqInfo.setSub_appid("wxa075e8509802f826"); //商户号公众号 } else { weChatPayReqInfo.setSub_appid(SysConst.getSysConfig().getWxSubAppId());//小程序 } weChatPayReqInfo.setSub_mch_id("1614670195"); weChatPayReqInfo.setSub_openid(openId); weChatPayReqInfo.setNonce_str(nonce_str); //随机字符串 weChatPayReqInfo.setBody(map.get("body").toString()); //商品描述 weChatPayReqInfo.setOut_trade_no(map.get("orderNo").toString()); //商户订单号 weChatPayReqInfo.setTotal_fee(total_fee); //总金额 weChatPayReqInfo.setSpbill_create_ip("139.159.177.244"); //终端ip weChatPayReqInfo.setNotify_url(SysConst.getSysConfig().getNotifyUrl()); //通知url weChatPayReqInfo.setTrade_type("JSAPI"); //交易类型 weChatPayReqInfo.setAttach(map.get("orderScene").toString()); weChatPayReqInfo.setProfit_sharing("N"); //附加数据,区分订单类型 Map payMap = new HashMap<>(); payMap.put("app_id", weChatPayReqInfo.getSub_appid()); payMap.put("api_key",SysConst.getSysConfig().getWxApiKey()); payMap.put("unified_order_url",SysConst.getSysConfig().getWxUnifiedOrderUrl()); SortedMap sortedMap = wechatPayUtil.goWechatPay(weChatPayReqInfo,payMap); return ResponseMsgUtil.success(sortedMap); } catch (Exception e) { log.error("orderToPay error!", e); return ResponseMsgUtil.exception(e); } } @RequestMapping(value="/hltUnionCardPay",method = RequestMethod.POST) @ResponseBody @ApiOperation(value = "工会卡支付") public ResponseData hltUnionCardPay(@RequestBody JSONObject body,HttpServletRequest request) { try { // 用户 SessionObject sessionObject = userCenter.getSessionObject(request); HighUserModel userInfoModel = (HighUserModel) sessionObject.getObject(); if (body == null || body.getLong("orderId") == null || StringUtils.isBlank(body.getString("password")) || StringUtils.isBlank(body.getString("cardNo")) ) { log.error("orderToPay error!", "参数错误"); throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, ""); } // 订单 OutRechargeOrder order = outRechargeOrderService.findByOrderId(body.getLong("orderId")); if (order == null) { log.error("hltUnionCardPay error!", "未找到订单信息"); throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到订单信息"); } // 订单状态 : 订单支付状态 : 101.待支付 102.已支付 100.已完成 104.已取消 105.已退款 if (order.getPayStatus() != 101) { log.error("hltUnionCardPay error!", "无法支付,订单不处于待支付状态"); throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "无法支付,订单不处于待支付状态"); } // 查询用户支付密码 HighUserPayPassword userPayPassword = highUserPayPasswordService.getDetailByUser(order.getUserId()); if (userPayPassword == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_SET_USER_PAY_PWD, ""); } if (StringUtils.isBlank(body.getString("password"))) { throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_ENTER_USER_PAY_PWD, ""); } // 校验支付密码 if (!AESEncodeUtil.aesEncrypt(body.getString("password")).equals(userPayPassword.getPassword())) { throw ErrorHelp.genException(SysCode.System, ErrorCode.USER_PAY_PWD_ERROR, ""); } // 查询用户与卡号的关系 HighUserCard userCard = highUserCardService.getDetailByUserCardNo(userInfoModel.getHighUser().getId(), body.getString("cardNo")); if (userCard == null) { log.error("hltUnionCardPay() ERROR", "未绑定卡号"); throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未绑定卡号"); } outRechargeOrderService.hltUnionCardPay(userCard, order); return ResponseMsgUtil.success(outRechargeOrderService.findByOrderId(body.getLong("orderId"))); } catch (Exception e) { log.error("hltUnionCardPay error!", e); return ResponseMsgUtil.exception(e); } } @RequestMapping(value="/orderToUnionPay",method = RequestMethod.POST) @ResponseBody @ApiOperation(value = "订单支付发起银联支付") public ResponseData orderToUnionPay(@RequestBody String reqBodyStr,HttpServletRequest request) { try { // 用户 SessionObject sessionObject = userCenter.getSessionObject(request); HighUserModel userInfoModel = (HighUserModel) sessionObject.getObject(); if (StringUtils.isBlank(reqBodyStr)) { log.error("orderToPay error!", "参数错误"); throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, ""); } JSONObject jsonObject = JSONObject.parseObject(reqBodyStr); Long orderId = jsonObject.getLong("orderId"); if (orderId == null) { log.error("orderToPay error!", "参数错误"); throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, ""); } // 订单 OutRechargeOrder order = outRechargeOrderService.findByOrderId(orderId); if (order == null) { log.error("hltUnionCardPay error!", "未找到订单信息"); throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到订单信息"); } // 订单状态 : 订单支付状态 : 101.待支付 102.已支付 100.已完成 104.已取消 105.已退款 if (order.getPayStatus() != 101) { log.error("hltUnionCardPay error!", "无法支付,订单不处于待支付状态"); throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "无法支付,订单不处于待支付状态"); } return ResponseMsgUtil.success(unionPayConfig.upPreOrder(UnionPayConfig.MER_ID2, UnionPayConfig.TERM_ID2, order.getOrderNo(), order.getPayRealPrice(), "话费充值", CommonSysConst.getSysConfig().getUnionPayTelNotifyUrl(), request)); } catch (Exception e) { log.error("orderToPay error!", e); return ResponseMsgUtil.exception(e); } } private void apiOrderRecord(OutRechargeOrder rechargeOrder) { Map orderMap = new HashMap<>(); orderMap.put("orderId" , rechargeOrder.getId()); // 查询是否用重复订单 ApiOrderRecord apiOrderRecord = apiOrderRecordService.queryOrderResult(orderMap); apiOrderRecord.setStatus(100); apiOrderRecord.setRequestTime(new Date()); apiOrderRecordService.updateOrderRecord(apiOrderRecord); } }