package com.stylefeng.guns.modular.crossCity.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.huifu.bspay.sdk.opps.core.utils.RsaUtils; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.account.model.TEnterpriseWithdrawal; import com.stylefeng.guns.modular.account.service.ITEnterpriseWithdrawalService; import com.stylefeng.guns.modular.account.service.UserWithdrawalService; import com.stylefeng.guns.modular.account.util.Base64Util; import com.stylefeng.guns.modular.cloudPayment.example.AllocationExample; import com.stylefeng.guns.modular.cloudPayment.req.AllocationReq; import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService; import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityInfoWrapper; import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper; import com.stylefeng.guns.modular.crossCity.warpper.OrderWarpper; import com.stylefeng.guns.modular.system.model.Company; import com.stylefeng.guns.modular.system.model.Driver; import com.stylefeng.guns.modular.system.model.Reassign; import com.stylefeng.guns.modular.system.model.UserWithdrawal; import com.stylefeng.guns.modular.system.service.ICompanyService; import com.stylefeng.guns.modular.system.service.IDriverService; import com.stylefeng.guns.modular.system.service.IReassignService; import com.stylefeng.guns.modular.system.util.PayMoneyUtil; import com.stylefeng.guns.modular.system.util.ResultUtil; import com.stylefeng.guns.modular.system.util.SystemException; import com.stylefeng.guns.modular.system.warpper.BaseWarpper; import com.unionpay.upyzt.resp.AllocationResp; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; import java.math.BigDecimal; import java.util.Map; import java.util.Objects; @Api @RestController @RequestMapping("") public class OrderCrossCityController { @Autowired private IOrderCrossCityService orderCrossCityService; @Autowired private IDriverService driverService; @Autowired private IReassignService reassignService; @Autowired private UserWithdrawalService userWithdrawalService; @Autowired private PayMoneyUtil payMoneyUtil; @Autowired private ICompanyService companyService; @Autowired private ITEnterpriseWithdrawalService enterpriseWithdrawalService; /** * 获取服务中页面订单详情 * @param orderId * @return */ @ResponseBody @PostMapping("/api/orderCrossCity/queryOrderInfo") @ApiOperation(value = "获取跨城订单服务中详情", tags = {"司机端-服务中"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil queryOrderInfo(Integer orderId){ try { Map map = orderCrossCityService.queryOrderInfo(orderId); return ResultUtil.success(OrderWarpper.getOrderWarpper(map)); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } /** * 提交改派申请 * @param reassign * @param orderIds * @param request * @return */ @ResponseBody @PostMapping("/api/orderCrossCity/reassignOrderCrossCityReassign") @ApiOperation(value = "提交改派申请(跨城)", tags = {"司机端-服务中"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "订单id(多个以逗号分隔)", name = "orderIds", required = true, dataType = "string"), @ApiImplicitParam(value = "改派支付方式(1=微信,2=支付宝,3=余额)", name = "payType", required = false, dataType = "int"), @ApiImplicitParam(value = "改派原因", name = "reason", required = true, dataType = "string"), @ApiImplicitParam(value = "备注", name = "remark", required = false, dataType = "string"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil reassignOrderCrossCityReassign(Reassign reassign, String orderIds, HttpServletRequest request){ try { Integer uid = driverService.getUserIdFormRedis(request); if(null == uid){ return ResultUtil.tokenErr(); } return reassignService.saveData_(reassign, orderIds, uid, null); }catch (SystemException s){ return ResultUtil.error(s.getMsg()); } catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } /** * 获取已完成订单明细 * @param orderId * @return */ @ResponseBody @PostMapping("/api/orderCrossCity/queryOrderCrossCityInfo") @ApiOperation(value = "获取已完成的订单明细(跨城)", tags = {"司机端-服务中"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "跨城订单id", name = "orderId", required = true, dataType = "int"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil queryOrderCrossCityInfo(Integer orderId){ try { Map map = orderCrossCityService.queryOrderCrossCityInfo(orderId); return ResultUtil.success(OrderCrossCityInfoWrapper.getOrderInfoWarpper(map)); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } /** * 修改订单顺序 * @param orderId * @return */ @ResponseBody @PostMapping("/api/orderCrossCity/setOrderCrossCitySort") @ApiOperation(value = "修改订单顺序(跨城)", tags = {"司机端-服务中"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "跨城订单id", name = "orderId", required = true, dataType = "int"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil setOrderCrossCitySort(Integer orderId){ try { orderCrossCityService.setOrderCrossCitySort(orderId); return ResultUtil.success(); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } /** * 跨城出行下单操作 * @param orderCrossCityWarpper * @param request * @return */ @ResponseBody @RequestMapping(value = "/api/order/orderCrossCity", method = RequestMethod.POST) @ApiOperation(value = "跨城出行下单操作", tags = {"司机端-首页"}, notes = "先进行下单操作,再根据返回数据生成收款二维码") @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, HttpServletRequest request){ try { Integer uid = driverService.getUserIdFormRedis(request); if(null == uid){ return ResultUtil.tokenErr(); } return orderCrossCityService.orderCrossCity(orderCrossCityWarpper, uid); }catch (SystemException se){ return ResultUtil.error(se.getMessage()); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } /** * 扫码支付成功回调处理 * @param request * @param response */ @ResponseBody @PostMapping("/base/order/generatePay") public void generatePay(HttpServletRequest request, HttpServletResponse response){ try { // Map map = icbcPayUtil.generatePayCallback(request); // if(null != map){ // String out_trade_no = map.get("out_trade_no"); // String order_id = map.get("order_id"); // String s = icbcPayUtil.queryGeneratePayState("", order_id); // if(s.equals("1")){ // icbcPayUtil.answer(response);//回调应答 // } // if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id) && s.equals("1")){ // String[] split = out_trade_no.split(","); // Integer id = Integer.valueOf(split[0]); // Integer type = Integer.valueOf(split[1]); // switch (type){ // case 1: // break; // case 2: // break; // case 3: // orderCrossCityService.generatePayCallback(id, order_id); // break; // } // } // } }catch (Exception e){ e.printStackTrace(); } } /** * 订单完成支付订单操作 * @param payType * @param orderId * @param request * @return */ @ResponseBody @PostMapping("/api/order/payTaxiOrder") @ApiOperation(value = "订单完成支付订单操作", tags = {"司机端-首页"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "支付方式(1=微信,2=支付宝,3=扫码支付,4=云闪付)", name = "payType", required = true, dataType = "int"), @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"), @ApiImplicitParam(value = "订单类型(3=跨城)", name = "orderType", required = true, dataType = "int"), @ApiImplicitParam(value = "优惠券id", name = "couponId", required = false, dataType = "int"), @ApiImplicitParam(value = "支付端(1=用户APP端,2=司机APP端,3=用户小程序端)", name = "type", required = true, dataType = "int"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil payTaxiOrder(Integer payType, Integer orderId, Integer orderType, Integer couponId, Integer type, HttpServletRequest request){ try { Integer uid = driverService.getUserIdFormRedis(request); if(null == uid){ return ResultUtil.tokenErr(); } Driver driver = driverService.selectById(uid); if(driver.getAppletsOpenId()==null && payType==1){ return ResultUtil.openIdError(); } switch (orderType){ case 3: return orderCrossCityService.payCrossCityOrder(payType, orderId, couponId, type,driver.getAppletsOpenId()); } return ResultUtil.success(new Object()); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } /** * 完成订单微信支付 斗拱 * @param request */ @ResponseBody @PostMapping("/base/DGPayCrossCity") public void DGPayCrossCity(HttpServletRequest request, HttpServletResponse response){ try { String sign =request.getParameter("sign"); String resp_data = request.getParameter("resp_data"); System.out.println(sign); System.out.println(resp_data); resp_data = resp_data.replaceAll("& #40;", "(").replaceAll("& #41;",")"); boolean verify = RsaUtils.verify(resp_data, "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsWrruP9JBxrUd8uEX5Z8y7pg/UIr5RNHSgDnHqNI1hbi2MfTzB5vZ275wSFFaLDD9BesgDWqsUepPS/opROlDCg9y6WYH8mkN23NmHL9F8kT48OMmH722am+Hp0XVMMwXqA0oNt4f7oW6kDemjZW8/RT4vIE7cyxoxSsVRvjqSpx9wDgFLPWh3o0pHQaoxLyeUsGBATHFrxEDlosBvsuXjMcgjPKXALrcemzKOhBmBkLgyxNVmh61ZK+FNXd+/X4PeZlnWf54NRQAUKe1308E6IIaszo+CjneKuhj1m/X4f7AIvxAqlhuCV5E/DfKRmGopxaWqdtE960Y/H4SmBh2wIDAQAB", sign); // Map map = payMoneyUtil.weixinpayCallback(request); if(verify){ JSONObject jsonObject = JSONObject.parseObject(resp_data); String transaction_id = jsonObject.get("out_trans_id").toString(); String out_trade_no = jsonObject.get("req_seq_id").toString(); String trans_stat = jsonObject.get("trans_stat").toString(); if("S".equals(trans_stat)){ System.out.println("完成订单微信支付回调"+jsonObject); PrintWriter out = response.getWriter(); out.write(200); out.flush(); out.close(); String[] split = out_trade_no.split("_"); Integer id = Integer.valueOf(split[0]); Integer type = Integer.valueOf(split[1]); // TODO 司机云闪付 跨城出行微信回调支付充值 // OrderCrossCity orderCrossCity = orderCrossCityService.selectById(id); // if(Objects.isNull(orderCrossCity)){ // System.out.println("该订单不存在"); // throw new RuntimeException("该订单不存在"); // } // cloudPay(orderCrossCity.getDriverId(),map.get("total_fee"),map.get("transaction_id"),1); switch (type){ case 3: orderCrossCityService.payOrderCrossCityCallback(id, transaction_id, 1); break; } } } }catch (Exception e){ e.printStackTrace(); } } /** * 完成订单微信支付 斗拱 * @param request */ @ResponseBody @PostMapping("/base/DGPayCrossCityZfb") public void DGPayCrossCityZfb(HttpServletRequest request, HttpServletResponse response){ try { String sign =request.getParameter("sign"); String resp_data = request.getParameter("resp_data"); System.out.println(sign); System.out.println(resp_data); resp_data = resp_data.replaceAll("& #40;", "(").replaceAll("& #41;",")"); boolean verify = RsaUtils.verify(resp_data, "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsWrruP9JBxrUd8uEX5Z8y7pg/UIr5RNHSgDnHqNI1hbi2MfTzB5vZ275wSFFaLDD9BesgDWqsUepPS/opROlDCg9y6WYH8mkN23NmHL9F8kT48OMmH722am+Hp0XVMMwXqA0oNt4f7oW6kDemjZW8/RT4vIE7cyxoxSsVRvjqSpx9wDgFLPWh3o0pHQaoxLyeUsGBATHFrxEDlosBvsuXjMcgjPKXALrcemzKOhBmBkLgyxNVmh61ZK+FNXd+/X4PeZlnWf54NRQAUKe1308E6IIaszo+CjneKuhj1m/X4f7AIvxAqlhuCV5E/DfKRmGopxaWqdtE960Y/H4SmBh2wIDAQAB", sign); // Map map = payMoneyUtil.weixinpayCallback(request); if(verify){ JSONObject jsonObject = JSONObject.parseObject(resp_data); String transaction_id = jsonObject.get("out_trans_id").toString(); String out_trade_no = jsonObject.get("req_seq_id").toString(); String trans_stat = jsonObject.get("trans_stat").toString(); if("S".equals(trans_stat)){ System.out.println("完成订单微信支付回调"+jsonObject); PrintWriter out = response.getWriter(); out.write(200); out.flush(); out.close(); String[] split = out_trade_no.split("_"); Integer id = Integer.valueOf(split[0]); Integer type = Integer.valueOf(split[1]); // TODO 司机云闪付 跨城出行微信回调支付充值 // OrderCrossCity orderCrossCity = orderCrossCityService.selectById(id); // if(Objects.isNull(orderCrossCity)){ // System.out.println("该订单不存在"); // throw new RuntimeException("该订单不存在"); // } // cloudPay(orderCrossCity.getDriverId(),map.get("total_fee"),map.get("transaction_id"),1); switch (type){ case 3: orderCrossCityService.payOrderCrossCityCallback(id, transaction_id, 2); break; } } } }catch (Exception e){ e.printStackTrace(); } } /** * 完成订单微信支付回调 * @param request */ @ResponseBody @PostMapping("/base/wxPayCrossCity") public void wxPayCrossCity(HttpServletRequest request, HttpServletResponse response){ try { Map map = payMoneyUtil.weixinpayCallback(request); if(null != map){ System.err.println(JSON.toJSONString(map)); String out_trade_no = map.get("out_trade_no"); String transaction_id = map.get("transaction_id"); String result = map.get("result"); if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(transaction_id)){ System.out.println("完成订单微信支付回调"+map); PrintWriter out = response.getWriter(); out.write(result); out.flush(); out.close(); String[] split = out_trade_no.split("_"); Integer id = Integer.valueOf(split[0]); Integer type = Integer.valueOf(split[1]); // TODO 司机云闪付 跨城出行微信回调支付充值 // OrderCrossCity orderCrossCity = orderCrossCityService.selectById(id); // if(Objects.isNull(orderCrossCity)){ // System.out.println("该订单不存在"); // throw new RuntimeException("该订单不存在"); // } // cloudPay(orderCrossCity.getDriverId(),map.get("total_fee"),map.get("transaction_id"),1); switch (type){ case 3: orderCrossCityService.payOrderCrossCityCallback(id, transaction_id, 1); break; } } } }catch (Exception e){ e.printStackTrace(); } } @ResponseBody @PostMapping("/base/aliPayCrossCity") public void aliPayCrossCity(HttpServletRequest request, HttpServletResponse response){ try { System.err.println("支付宝回调----->"); Map map = payMoneyUtil.alipayCallback(request); System.err.println(JSON.toJSONString(map)); if(null != map){ String out_trade_no = map.get("out_trade_no"); String trade_no = map.get("trade_no"); if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(trade_no)){ String[] split = out_trade_no.split("_"); Integer id = Integer.valueOf(split[0]); Integer type = Integer.valueOf(split[1]); switch (type){ case 3: orderCrossCityService.payOrderCrossCityCallback(id, trade_no, 2); break; } String uid = map.get("passback_params"); System.out.println("完成订单支付宝支付回调"+map); // TODO 司机云闪付 跨城出行支付宝回调支付充值 // OrderCrossCity orderCrossCity = orderCrossCityService.selectById(id); // if(Objects.isNull(orderCrossCity)){ // System.out.println("该订单不存在"); // throw new RuntimeException("该订单不存在"); // } // cloudPay(orderCrossCity.getDriverId(),map.get("total_amount"),map.get("trade_no"),0); PrintWriter out = response.getWriter(); out.print("success"); out.flush(); out.close(); } } }catch (Exception e){ e.printStackTrace(); } } private void cloudPay(Integer uid,String total_fee,String transaction_id,int type) { if(type==1){ BigDecimal divide = new BigDecimal(total_fee).divide(new BigDecimal(100)); total_fee=divide.toString(); } Driver driver = driverService.selectById(uid); if(Objects.isNull(driver)){ throw new RuntimeException("该司机不存在!"+uid); } System.out.println("回调参数:"+total_fee+"---"+transaction_id); // 查询平台账户 Company company = companyService.selectOne(new EntityWrapper() .eq("type", 1) .last("LIMIT 1")); System.out.println("查询平台账户==============="+company); // 查询平台开户信息 TEnterpriseWithdrawal enterpriseWithdrawal = enterpriseWithdrawalService.selectOne(new EntityWrapper() .eq("companyId", company.getId())); // 替换为公司id System.out.println("查询平台开户信息==============="+enterpriseWithdrawal); UserWithdrawal driverWith = userWithdrawalService.selectOne(new EntityWrapper() .eq("phone", driver.getPhone()) .last("LIMIT 1")); // DepositReq depositReq = new DepositReq(); // depositReq.setOutOrderNo(ToolUtil.getRandomString(32)); // depositReq.setTotalAmount(new BigDecimal(total_fee).multiply(new BigDecimal(100)).intValue()); // 总金额 // depositReq.setAmount(new BigDecimal(total_fee).multiply(new BigDecimal(100)).intValue()); // 支付金额 // depositReq.setDiscountAmount(0); // 优惠金额 // depositReq.setBalanceAcctId(driverWith.getBalanceAcctId()); // depositReq.setDepositType("1"); // depositReq.setPaymentType(PaymentTypeEnum.CUP_APP.getCode()); // depositReq.setPaymentTradeNo(transaction_id); // 系统交易流水号 // depositReq.setPaymentSucceededAt(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").format(new Date())); // depositReq.setOrderNo(transaction_id); // depositReq.setOrderAmount(new BigDecimal(total_fee).multiply(new BigDecimal(100)).longValue()); // depositReq.setProductName("用户支付充值"); // depositReq.setProductCount(1); try { // DepositResp depositResp = DepositExample.create(depositReq); // System.err.println(depositResp); AllocationReq allocationReq = new AllocationReq(); allocationReq.setPayBalanceAcctId(driverWith.getBalanceAcctId()); // 发送方 allocationReq.setRecvBalanceAcctId(enterpriseWithdrawal.getBalanceAcctId()); // 接收方 BigDecimal multiply = new BigDecimal(100).multiply(new BigDecimal(total_fee)); allocationReq.setAmount(multiply.intValue()); // 金额 allocationReq.setPassword(Base64Util.decode(enterpriseWithdrawal.getTransactionAuthorizationCode())); // 密码 allocationReq.setOrderNo(transaction_id); allocationReq.setOrderAmount(Long.valueOf(total_fee)); allocationReq.setProductName("订单改派"); allocationReq.setProductCount(1); AllocationResp allocationResp = AllocationExample.create(allocationReq); System.err.println("司机分账信息:"+allocationResp); } catch (Exception e) { e.printStackTrace(); } } }