fs-danaus
2021-08-27 35603c9d2edd3ba95f80a90d2a6cafd0caf5b1b8
完善农行支付功能
5个文件已修改
746 ■■■■ 已修改文件
src/com/yc/abc/controller/AbcPayController.java 675 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/com/yc/abc/entity/OrderEntity.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/com/yc/abc/service/AbcPayServiceIfc.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/com/yc/abc/service/AbcPayServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/com/yc/abc/utils/AbcPayUtils.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/com/yc/abc/controller/AbcPayController.java
@@ -34,6 +34,7 @@
import org.springframework.web.context.request.async.WebAsyncTask;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
@@ -63,7 +64,7 @@
    WebAsyncTask abcPay(@RequestBody OrderEntity orderEntity, HttpServletRequest request) {
        CallBackMessage callBackMessage = new CallBackMessage();
        Callable<Object> callable = new PayCallable(orderEntity,request);
        Callable<Object> callable = new PayCallable(orderEntity, request);
        //定义超时45秒, 改为600秒,Modified by Johns Wang,2021-02-10
        WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(600), threadPoolExecutor, callable);
        asyncTask.onCompletion(
@@ -90,9 +91,10 @@
        HttpServletRequest request;
        OrderEntity orderEntity;
        public PayCallable(OrderEntity orderEntity,HttpServletRequest request) {
        public PayCallable(OrderEntity orderEntity, HttpServletRequest request) {
            this.request = request;
            this.orderEntity=orderEntity;
            this.orderEntity = orderEntity;
        }
        @Override
@@ -106,389 +108,388 @@
                if (StringUtils.isBlank(orderEntity.getOrderNo())) {
                    throw new ApplicationException("单号不能为空");
                }
                //1-------------------取收款单 150101
                SpObserver.setDBtoInstance("_"+dataSourceEntity.getDbId());
                String orderNo=orderEntity.getOrderNo();
                SpObserver.setDBtoInstance("_" + dataSourceEntity.getDbId());
                String orderNo = orderEntity.getOrderNo();
                //1-------------------取收款单 150101
                orderEntity = abcPayServiceIfc.getOrder(orderEntity.getOrderNo());
                if (orderEntity == null) {
                    throw new ApplicationException(orderNo + "单据不存在");
                }
                if (orderEntity.getAmount() == null) {
                    throw new ApplicationException(orderEntity.getOrderNo() + "-金额不能为空");
                if (orderEntity.getAmount() == null || orderEntity.getAmount().doubleValue() == 0) {
                    throw new ApplicationException("收款单:" + orderEntity.getOrderNo() + "金额不能为空");
                }
                orderEntity.setInfo(userCode);
                orderEntity.setDbid(dataSourceEntity.getDbId() + "");
                orderEntity.setIp(IPUtil.getIpAddr(request));
                //2--------------------生成支付平台需要的请求对象
                JSON json = AbcPayUtils.createPostOrder(orderEntity);
                String ReturnCode = json.GetKeyValue("ReturnCode");
                String ErrorMessage = json.GetKeyValue("ErrorMessage");
                //String paymentURL = json.GetKeyValue("PaymentURL");
                log.info("ReturnCode   = [" + ReturnCode + "]");
                log.info("ErrorMessage = [" + ErrorMessage + "]");
                //log.info("PaymentURL-->" + json.GetKeyValue("PaymentURL"));
                //成功
                if ("0000".equals(ReturnCode)) {
                    //3---------------------把返回的信息返回给app端,发起支付请求
                    //----第一种方式是返回给APP,直接调起农行掌银
                    //---解析PaymentURL,获得支付token
                    //info.put("token", paymentURL.split("TOKEN=")[1]);
                String orderNum = null;
                String amount = null;
                String qrCodeUrl = null;
                if ("0000".equalsIgnoreCase(orderEntity.getOnlinePaymentReturnCode())) {
                    //---检查订单已成功提交农行平台,直接取数,避免出现【2306-此账单编号已存在】的错误
                    orderNum=orderEntity.getOrderNo();
                    amount=orderEntity.getAmount().setScale(2, BigDecimal.ROUND_HALF_UP).toString();
                    qrCodeUrl=imgData.getImageUrl(orderEntity.getOnlinePaymentOneQRForAllUnid(), 250, 250, true, false, request);
                } else {
                    orderEntity.setInfo(userCode);
                    orderEntity.setDbid(dataSourceEntity.getDbId() + "");
                    orderEntity.setIp(IPUtil.getIpAddr(request));
                    //2--------------------生成支付平台需要的请求对象
                    JSON json = AbcPayUtils.createPostOrder(orderEntity);
                    String ReturnCode = json.GetKeyValue("ReturnCode");
                    //成功
                    if ("0000".equals(ReturnCode)) {
                        //3---------------------把返回的信息返回给app端,发起支付请求
                        //生成二维码图片输出
                        final QrCodeForAppEntity qrCodeForAppEntity = createQrCode(json.GetKeyValue("OneQRForAll"));
                        qrCodeUrl = imgData.getImageUrl(qrCodeForAppEntity.getQrCodeUnid(), 250, 250, true, false, request);
                        orderNum=json.GetKeyValue("OrderNo");
                        amount=json.GetKeyValue("OrderAmount");
                        //--保存起来,方便再次调用
                        abcPayServiceIfc.save150101OrderInfo(json, qrCodeForAppEntity.getQrCodeUnid());
                    } else {
                        //出错
                        throw new ApplicationException(ReturnCode + "-" + json.GetKeyValue("ErrorMessage"));
                    }
                }
                    Map info = new HashMap();
                    info.put("orderNo", json.GetKeyValue("OrderNo"));//交易号
                    info.put("amount", json.GetKeyValue("OrderAmount"));
                    //生成二维码图片输出
                    String qrCodeUrl = createQrCode(request, json.GetKeyValue("OneQRForAll"));
                    info.put("orderNo", orderNum);//交易号
                    info.put("amount", amount);
                    info.put("qrCodeUrl", qrCodeUrl);
                    System.out.println(qrCodeUrl);
                    callBackMessage.setInfo(info);
                    callBackMessage.sendSuccessMessageByDefault();
                    return callBackMessage.toJSONObject();
                } else {
                    //出错
                    throw new ApplicationException(ReturnCode + "-" + ErrorMessage);
                } catch(Exception ex){
                    ex.printStackTrace();
                    callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
                    return callBackMessage.toJSONObject();
                } finally{
                    SpObserver.setDBtoInstance();
                }
            } catch (Exception ex) {
                ex.printStackTrace();
                callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
                return callBackMessage.toJSONObject();
            } finally {
                SpObserver.setDBtoInstance();
            }
        }
    }
    private String createQrCode(HttpServletRequest request, String url) throws Exception {
        //生成新的二维码图片
        QrCodeForAppEntity qrCodeForAppEntity = new QrCodeForAppEntity();
        qrCodeForAppEntity.setAuthorCode("SYSTEM");
        qrCodeForAppEntity.setAuthorName("管理员");
        qrCodeForAppEntity.setQrCode(url);
        qrCodeForAppEntity = GenerationQrCodeForApp.createGeneralQrCode(qrCodeForAppEntity);
        return imgData.getImageUrl(qrCodeForAppEntity.getQrCodeUnid(), 250, 250, true, false, request);
    }
    /**
     * 支付通知结果
     *
     * @param request
     */
    @RequestMapping(value = "/abc/{dbid}/{formid}/{docCode}/{userCode}/orderPayCallback.do")
    @CrossOrigin
    public @ResponseBody
    WebAsyncTask orderPayCallback(@PathVariable int dbid,@PathVariable int formid,
                                  @PathVariable String docCode,@PathVariable String userCode,HttpServletRequest request) {
        Callable<Object> callable = new OrderPayCallable(request.getParameter("MSG"),dbid,formid,docCode,userCode);
        //定义超时45秒
        WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(45), threadPoolExecutor, callable);
        asyncTask.onError(
                (Callable<Object>) () -> {
                    CallBackMessage callBackMessage = new CallBackMessage();
                    callBackMessage.sendErrorMessage("执行出错,请重新提交");
                    return callBackMessage.toJSONObject();
                }
        );
        asyncTask.onTimeout(
                (Callable<Object>) () -> {
                    CallBackMessage callBackMessage = new CallBackMessage();
                    callBackMessage.sendErrorMessage("服务器繁忙,请不要重复提交,稍候在支付结果中查询结果", -1003);
                    return callBackMessage.toJSONObject();
                }
        );
        return asyncTask;
    }
    private class OrderPayCallable implements Callable<Object> {
        String msg;
        int dbid;
        int formid;
        String docCode;
        String userCode;
        public OrderPayCallable(String msg, int dbid, int formid, String docCode, String userCode) {
            this.msg = msg;
            this.dbid = dbid;
            this.formid = formid;
            this.docCode = docCode;
            this.userCode = userCode;
        private QrCodeForAppEntity createQrCode(String url) throws Exception {
            //生成新的二维码图片
            QrCodeForAppEntity qrCodeForAppEntity = new QrCodeForAppEntity();
            qrCodeForAppEntity.setAuthorCode("SYSTEM");
            qrCodeForAppEntity.setAuthorName("管理员");
            qrCodeForAppEntity.setQrCode(url);
            qrCodeForAppEntity = GenerationQrCodeForApp.createGeneralQrCode(qrCodeForAppEntity);
            return qrCodeForAppEntity;
        }
        @Override
        public Object call() throws Exception {
            CallBackMessage callBackMessage = new CallBackMessage();
            PaymentResult paymentResult = null;
            SystemInfoEntity infoEntity=null;
            try {
                log.info("msg:" + msg);
                paymentResult = new PaymentResult(msg);
                log.info("orderNo:" + paymentResult.getValue("OrderNo"));
                log.info("ResponseMessage:" + paymentResult.getResponseMessage());
            //String info = paymentResult.getValue("MerchantRemarks");
        /**
         * 支付通知结果
         *
         * @param request
         */
        @RequestMapping(value = "/abc/{dbid}/{formid}/{docCode}/{userCode}/orderPayCallback.do")
        @CrossOrigin
        public @ResponseBody
        WebAsyncTask orderPayCallback(@PathVariable int dbid, @PathVariable int formid,
                                      @PathVariable String docCode, @PathVariable String userCode, HttpServletRequest request) {
            Callable<Object> callable = new OrderPayCallable(request.getParameter("MSG"), dbid, formid, docCode, userCode);
            //定义超时45秒
            WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(45), threadPoolExecutor, callable);
//            if (StringUtils.isBlank(info)) {
//                throw new ApplicationException("支付结果MerchantRemarks内容不能为空");
//            }
//             infoEntity = com.alibaba.fastjson.JSON.parseObject(new String(java.util.Base64.getDecoder().decode(info), "utf-8"), SystemInfoEntity.class);
                SpObserver.setDBtoInstance("_" + dbid);
                //--插入日志表
                abcPayServiceIfc.save150101Log(paymentResult);
                Map map = new HashMap();
                map.put("orderNo", paymentResult.getValue("OrderNo"));
                map.put("amount", paymentResult.getValue("Amount"));
                map.put("thirdOrderNo", paymentResult.getValue("ThirdOrderNo"));
                map.put("msg", paymentResult.getErrorMessage());
                if ("0000".equals(paymentResult.getReturnCode())) {
                    //执行150101确认过账
                    abcPayServiceIfc.update150101LogByCallBack(paymentResult);
                    log.info("执行完成150101过账");
                    //--通过websocket推送支付结果
                    callBackMessage.setInfo(map).sendSuccessMessageByDefault();
                    sendWebSocket(dbid+"", userCode, callBackMessage);
                    return callBackMessage.toJSONObject();
                } else {
                    callBackMessage.setInfo(map).sendErrorMessage(paymentResult.getErrorMessage());
            asyncTask.onError(
                    (Callable<Object>) () -> {
                        CallBackMessage callBackMessage = new CallBackMessage();
                        callBackMessage.sendErrorMessage("执行出错,请重新提交");
                        return callBackMessage.toJSONObject();
                    }
            );
            asyncTask.onTimeout(
                    (Callable<Object>) () -> {
                        CallBackMessage callBackMessage = new CallBackMessage();
                        callBackMessage.sendErrorMessage("服务器繁忙,请不要重复提交,稍候在支付结果中查询结果", -1003);
                        return callBackMessage.toJSONObject();
                    }
            );
            return asyncTask;
        }
        private class OrderPayCallable implements Callable<Object> {
            String msg;
            int dbid;
            int formid;
            String docCode;
            String userCode;
            public OrderPayCallable(String msg, int dbid, int formid, String docCode, String userCode) {
                this.msg = msg;
                this.dbid = dbid;
                this.formid = formid;
                this.docCode = docCode;
                this.userCode = userCode;
            }
            @Override
            public Object call() throws Exception {
                CallBackMessage callBackMessage = new CallBackMessage();
                PaymentResult paymentResult = null;
                SystemInfoEntity infoEntity = null;
                try {
                    log.info("msg:" + msg);
                    paymentResult = new PaymentResult(msg);
                    log.info("orderNo:" + paymentResult.getValue("OrderNo"));
                    log.info("ResponseMessage:" + paymentResult.getResponseMessage());
                    SpObserver.setDBtoInstance("_" + dbid);
                    //--插入日志表
                    abcPayServiceIfc.save150101Log(paymentResult);
                    Map map = new HashMap();
                    map.put("orderNo", paymentResult.getValue("OrderNo"));
                    map.put("amount", paymentResult.getValue("Amount"));
                    map.put("thirdOrderNo", paymentResult.getValue("ThirdOrderNo"));
                    map.put("msg", paymentResult.getErrorMessage());
                    if ("0000".equals(paymentResult.getReturnCode())) {
                        //执行150101确认过账
                        abcPayServiceIfc.update150101LogByCallBack(paymentResult);
                        log.info("执行完成150101过账");
                        //--通过websocket推送支付结果
                        callBackMessage.setInfo(map).sendSuccessMessageByDefault();
                        sendWebSocket(dbid + "", userCode, callBackMessage);
                        return callBackMessage.toJSONObject();
                    } else {
                        callBackMessage.setInfo(map).sendErrorMessage(paymentResult.getErrorMessage());
                        sendWebSocket(infoEntity.getDbid(), infoEntity.getUserCode(), callBackMessage);
                        return callBackMessage.toJSONObject();
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                    log.info("ErrorMessage:" + ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
                    callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
                    sendWebSocket(infoEntity.getDbid(), infoEntity.getUserCode(), callBackMessage);
                    return callBackMessage.toJSONObject();
                } finally {
                    SpObserver.setDBtoInstance();
                }
            } catch (Exception ex) {
                ex.printStackTrace();
                log.info("ErrorMessage:" + ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
                callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
                sendWebSocket(infoEntity.getDbid(), infoEntity.getUserCode(), callBackMessage);
                return callBackMessage.toJSONObject();
            } finally {
                SpObserver.setDBtoInstance();
            }
        }
    }
    private void sendWebSocket(String dbid, String userCode, CallBackMessage callBackMessage) {
        MessageInfo messageInfo = new MessageInfo();
        messageInfo.setMsgType(MessageType.ABC_PAY_CALLBACK);
        messageInfo.setDbId(Integer.parseInt(dbid)).setUserCode(userCode).setUserFromType(UserFromType.ABC_PAY_CALLBACK);
        messageInfo.setMsg(com.alibaba.fastjson.JSON.toJSONString(callBackMessage));
        WebSocketMessageServer.publishMessageToRedis(messageInfo);
    }
    /**
     * 通过扫客户付款码进行支付
     *
     * @param request
     */
    @RequestMapping(value = "/abc/payByQrCode.do")
    @CrossOrigin
    public @ResponseBody
    WebAsyncTask payByQrCode( @RequestBody OrderEntity orderEntity, HttpServletRequest request) {
        CallBackMessage callBackMessage = new CallBackMessage();
        Callable<Object> callable = new PayByQrCodeCallable(orderEntity, request);
        //定义超时45秒, 改为600秒,Modified by Johns Wang,2021-02-10
        WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(600), threadPoolExecutor, callable);
        asyncTask.onCompletion(
                () -> log.info("执行成功")
        );
        asyncTask.onError(
                (Callable<Object>) () -> {
                    log.info("执行出错");
                    callBackMessage.sendErrorMessage("执行出错,请重新提交");
                    return callBackMessage.toJSONObject();
                }
        );
        asyncTask.onTimeout(
                (Callable<Object>) () -> {
                    log.info("执行超时");
                    callBackMessage.sendErrorMessage("服务器繁忙,请不要重复提交", -1003);
                    return callBackMessage.toJSONObject();
                }
        );
        return asyncTask;
    }
    private class PayByQrCodeCallable implements Callable<Object> {
        HttpServletRequest request;
        OrderEntity orderEntity;
        public PayByQrCodeCallable(OrderEntity orderEntity,HttpServletRequest request) {
            this.request = request;
            this.orderEntity=orderEntity;
        private void sendWebSocket(String dbid, String userCode, CallBackMessage callBackMessage) {
            MessageInfo messageInfo = new MessageInfo();
            messageInfo.setMsgType(MessageType.ABC_PAY_CALLBACK);
            messageInfo.setDbId(Integer.parseInt(dbid)).setUserCode(userCode).setUserFromType(UserFromType.ABC_PAY_CALLBACK);
            messageInfo.setMsg(com.alibaba.fastjson.JSON.toJSONString(callBackMessage));
            WebSocketMessageServer.publishMessageToRedis(messageInfo);
        }
        @Override
        public Object call() throws Exception {
        /**
         * 通过扫客户付款码进行支付
         *
         * @param request
         */
        @RequestMapping(value = "/abc/payByQrCode.do")
        @CrossOrigin
        public @ResponseBody
        WebAsyncTask payByQrCode(@RequestBody OrderEntity orderEntity, HttpServletRequest request) {
            CallBackMessage callBackMessage = new CallBackMessage();
            Callable<Object> callable = new PayByQrCodeCallable(orderEntity, request);
            //定义超时45秒, 改为600秒,Modified by Johns Wang,2021-02-10
            WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(600), threadPoolExecutor, callable);
            asyncTask.onCompletion(
                    () -> log.info("执行成功")
            );
            asyncTask.onError(
                    (Callable<Object>) () -> {
                        log.info("执行出错");
                        callBackMessage.sendErrorMessage("执行出错,请重新提交");
                        return callBackMessage.toJSONObject();
                    }
            );
            asyncTask.onTimeout(
                    (Callable<Object>) () -> {
                        log.info("执行超时");
                        callBackMessage.sendErrorMessage("服务器繁忙,请不要重复提交", -1003);
                        return callBackMessage.toJSONObject();
                    }
            );
            return asyncTask;
        }
        private class PayByQrCodeCallable implements Callable<Object> {
            HttpServletRequest request;
            OrderEntity orderEntity;
            public PayByQrCodeCallable(OrderEntity orderEntity, HttpServletRequest request) {
                this.request = request;
                this.orderEntity = orderEntity;
            }
            @Override
            public Object call() throws Exception {
                CallBackMessage callBackMessage = new CallBackMessage();
            DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap(request);
            String userCode = request.getSession().getAttribute(SessionKey.USERCODE) + "";
                DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap(request);
                String userCode = request.getSession().getAttribute(SessionKey.USERCODE) + "";
                try {
                    String qrCode = null;
                    Map<String, String> map = null;
                    SpObserver.setDBtoInstance("_" + dataSourceEntity.getDbId());//切换数据源
                    if (StringUtils.isBlank(orderEntity.getOrderNo())) {
                        throw new ApplicationException("单号不能为空");
                    }
                    if (StringUtils.isBlank(orderEntity.getQrCode())) {
                        throw new ApplicationException("付款码不能为空");
                    }
                    qrCode = orderEntity.getQrCode();
                    String orderNo = orderEntity.getOrderNo();
                    //1-------------------取收款单 150101
                    orderEntity = abcPayServiceIfc.getOrder(orderEntity.getOrderNo());
                    if (orderEntity == null) {
                        throw new ApplicationException(orderNo + "单据不存在");
                    }
                    if (orderEntity.getAmount() == null || orderEntity.getAmount().doubleValue() == 0) {
                        throw new ApplicationException(orderEntity.getOrderNo() + "-金额不能为空");
                    }
                    orderEntity.setInfo(userCode);
                    orderEntity.setDbid(dataSourceEntity.getDbId() + "");
                    orderEntity.setIp(IPUtil.getIpAddr(request));
                    orderEntity.setPayType(1);
                    orderEntity.setQrCode(qrCode);
                    //2--------------------生成支付平台需要的请求对象
                    JSON json = AbcPayUtils.createPostOrder(orderEntity);
                    String ReturnCode = json.GetKeyValue("ReturnCode");
                    String ErrorMessage = json.GetKeyValue("ErrorMessage");
                    log.info("ReturnCode   = [" + ReturnCode + "]");
                    log.info("ErrorMessage = [" + ErrorMessage + "]");
                    String merchantID = ((JSONObject) com.alibaba.fastjson.JSON.parse(json.GetKeyValue("Merchant"))).getString("MerchantID");
                    //成功
                    //AP6419-客户正在支付中,请等待
                    //00-订单登记成功 农行支付
                    if ("00".equals(ReturnCode) || "0000".equals(ReturnCode) || "AP6419".equals(ReturnCode)) {
                        Map info = new HashMap();
                        info.put("orderNo", json.GetKeyValue("OrderNo"));//交易号
                        info.put("amount", json.GetKeyValue("OrderAmount"));//金额
                        info.put("thirdOrderNo", json.GetKeyValue("ThirdOrderNo"));//第三方交易号
                        callBackMessage.setInfo(info);
                        callBackMessage.sendSuccessMessage(ErrorMessage);
                        //sendWebSocket(dataSourceEntity.getDbId()+"", userCode, callBackMessage);
                        //--先插入日志表,最终还需要再查询一次状态
                        abcPayServiceIfc.save150101LogByQrCode(json, merchantID);
                        return callBackMessage.toJSONObject();
                    } else {
                        //出错
                        throw new ApplicationException(ReturnCode + "-" + ErrorMessage);
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                    callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
                    //sendWebSocket(dataSourceEntity.getDbId()+"", userCode, callBackMessage);
                    return callBackMessage.toJSONObject();
                } finally {
                    SpObserver.setDBtoInstance();
                }
            }
        }
        /**
         * 单笔支付查询
         *
         * @param request
         */
        @RequestMapping(value = "/abc/queryOrder.do")
        @CrossOrigin
        public @ResponseBody
        WebAsyncTask queryOrder(String orderNo, HttpServletRequest request) {
            boolean isAppPost = request.getHeader("x-app-type") == null ? false : true;
            Callable<Object> callable = new QueryOrderCallable(orderNo, request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + "", isAppPost, request.getSession().getAttribute(SessionKey.USERCODE) + "");
            //定义超时45秒
            WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(45), threadPoolExecutor, callable);
            asyncTask.onError(
                    (Callable<Object>) () -> {
                        CallBackMessage callBackMessage = new CallBackMessage();
                        callBackMessage.sendErrorMessage("执行出错,请重新提交");
                        return callBackMessage.toJSONObject();
                    }
            );
            asyncTask.onTimeout(
                    (Callable<Object>) () -> {
                        CallBackMessage callBackMessage = new CallBackMessage();
                        callBackMessage.sendErrorMessage("服务器繁忙,请稍候查询", -1003);
                        return callBackMessage.toJSONObject();
                    }
            );
            return asyncTask;
        }
        public CallBackMessage queryOrderStatus(String dbid, String orderNo, String userCode) {
            try {
                String qrCode=null;
                Map<String, String> map = null;
                SpObserver.setDBtoInstance("_" + dataSourceEntity.getDbId());//切换数据源
                if (StringUtils.isBlank(orderEntity.getOrderNo())) {
                    throw new ApplicationException("单号不能为空");
                SpObserver.setDBtoInstance("_" + dbid);
                CallBackMessage callBackMessage = new CallBackMessage();
                QueryOrderRequest tQueryRequest = new QueryOrderRequest();
                tQueryRequest.queryRequest.put("PayTypeID", Constants.PAY_TYPE_DIRECTPAY);    //设定交易类型
                tQueryRequest.queryRequest.put("OrderNo", orderNo);    //设定订单编号 (必要信息)
                tQueryRequest.queryRequest.put("QueryDetail", "1");//设定查询方式
                final MerchantEntity merchantEntity = AbcPayUtils.getMerchantInfo(Integer.parseInt(dbid), 150101, userCode, orderNo);
                if (merchantEntity == null) {
                    throw new ApplicationException("请维护好商家与数据源映射关系】");
                }
                if (StringUtils.isBlank(orderEntity.getQrCode())) {
                    throw new ApplicationException("付款码不能为空");
                }
                qrCode=orderEntity.getQrCode();
                String orderNo=orderEntity.getOrderNo();
                //1-------------------取收款单 150101
                 orderEntity = abcPayServiceIfc.getOrder(orderEntity.getOrderNo());
                if (orderEntity == null) {
                    throw new ApplicationException(orderNo + "单据不存在");
                }
                if (orderEntity.getAmount() == null) {
                    throw new ApplicationException(orderEntity.getOrderNo() + "-金额不能为空");
                }
                orderEntity.setInfo(userCode);
                orderEntity.setDbid(dataSourceEntity.getDbId()+"");
                orderEntity.setIp(IPUtil.getIpAddr(request));
                orderEntity.setPayType(1);
                orderEntity.setQrCode(qrCode);
                //2--------------------生成支付平台需要的请求对象
                JSON json = AbcPayUtils.createPostOrder(orderEntity);
                JSON json = tQueryRequest.extendPostRequest(merchantEntity.getIndex());
                String ReturnCode = json.GetKeyValue("ReturnCode");
                String ErrorMessage = json.GetKeyValue("ErrorMessage");
                log.info("ReturnCode   = [" + ReturnCode + "]");
                log.info("ErrorMessage = [" + ErrorMessage + "]");
                String merchantID=((JSONObject)com.alibaba.fastjson.JSON.parse(json.GetKeyValue("Merchant"))).getString("MerchantID");
                String MerchantID = ((JSONObject) com.alibaba.fastjson.JSON.parse(json.GetKeyValue("Merchant"))).getString("MerchantID");
                final String trxType = json.GetKeyValue("TrxType");
                //成功
                //AP6419-客户正在支付中,请等待
                //00-订单登记成功 农行支付
                if ("00".equals(ReturnCode)||"0000".equals(ReturnCode)||"AP6419".equals(ReturnCode)) {
                if (ReturnCode.equals("0000")) {
                    String orderInfo = json.GetKeyValue("Order");
                    Base64 tBase64 = new Base64();
                    String orderDetail = new String(tBase64.decode(orderInfo), "gb2312");
                    json.setJsonString(orderDetail);
                    //支付成功才写执行
                    if ("03".equalsIgnoreCase(json.GetKeyValue("Status"))
                            || "04".equalsIgnoreCase(json.GetKeyValue("Status"))
                            || "05".equalsIgnoreCase(json.GetKeyValue("Status"))
                    ) {
                        //--更新订单状态及执行过账
                        abcPayServiceIfc.update150101LogByQuery(json, MerchantID, trxType);
                    }
                    Map info = new HashMap();
                    info.put("orderNo", json.GetKeyValue("OrderNo"));//交易号
                    info.put("amount", json.GetKeyValue("OrderAmount"));//金额
                    info.put("thirdOrderNo", json.GetKeyValue("ThirdOrderNo"));//第三方交易号
                    info.put("code", json.GetKeyValue("Status"));
                    info.put("status", AbcPayUtils.getOrderStatus(json.GetKeyValue("Status"), json.GetKeyValue("PayTypeID")));
                    callBackMessage.setInfo(info);
                    callBackMessage.sendSuccessMessage(ErrorMessage);
                    //sendWebSocket(dataSourceEntity.getDbId()+"", userCode, callBackMessage);
                    //--先插入日志表,最终还需要再查询一次状态
                    abcPayServiceIfc.save150101LogByQrCode(json,merchantID);
                    return callBackMessage.toJSONObject();
                    callBackMessage.sendSuccessMessageByDefault();
                    return callBackMessage;
                } else {
                    //出错
                    throw new ApplicationException(ReturnCode + "-" + ErrorMessage);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
                callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
                //sendWebSocket(dataSourceEntity.getDbId()+"", userCode, callBackMessage);
                return callBackMessage.toJSONObject();
            } catch (Exception e) {
                throw new ApplicationException(e.getMessage());
            } finally {
                SpObserver.setDBtoInstance();
            }
        }
    }
    /**
     * 单笔支付查询
     *
     * @param request
     */
    @RequestMapping(value = "/abc/queryOrder.do")
    @CrossOrigin
    public @ResponseBody
    WebAsyncTask queryOrder(String orderNo, HttpServletRequest request) {
        boolean isAppPost = request.getHeader("x-app-type") == null ? false : true;
        private class QueryOrderCallable implements Callable<Object> {
        Callable<Object> callable = new QueryOrderCallable(orderNo, request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + "", isAppPost,request.getSession().getAttribute(SessionKey.USERCODE) + "");
        //定义超时45秒
        WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(45), threadPoolExecutor, callable);
            String orderNo;
            String dbid;
            boolean isAppCall;
            String userCode;
        asyncTask.onError(
                (Callable<Object>) () -> {
                    CallBackMessage callBackMessage = new CallBackMessage();
                    callBackMessage.sendErrorMessage("执行出错,请重新提交");
            public QueryOrderCallable(String orderNo, String dbid, boolean isAppCall, String userCode) {
                this.orderNo = orderNo;
                this.dbid = dbid;
                this.isAppCall = isAppCall;
                this.userCode = userCode;
            }
            @Override
            public Object call() throws Exception {
                CallBackMessage callBackMessage = new CallBackMessage();
                try {
                    //暂停1秒
                    Thread.sleep(1000);
                    return queryOrderStatus(dbid, orderNo, userCode).toJSONObject();
                } catch (Exception ex) {
                    callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
                    return callBackMessage.toJSONObject();
                }
        );
        asyncTask.onTimeout(
                (Callable<Object>) () -> {
                    CallBackMessage callBackMessage = new CallBackMessage();
                    callBackMessage.sendErrorMessage("服务器繁忙,请稍候查询", -1003);
                    return callBackMessage.toJSONObject();
                }
        );
        return asyncTask;
    }
    public CallBackMessage queryOrderStatus(String dbid,String orderNo,String userCode) {
        try {
            SpObserver.setDBtoInstance("_" + dbid);
            CallBackMessage callBackMessage = new CallBackMessage();
            QueryOrderRequest tQueryRequest = new QueryOrderRequest();
            tQueryRequest.queryRequest.put("PayTypeID", Constants.PAY_TYPE_DIRECTPAY);    //设定交易类型
            tQueryRequest.queryRequest.put("OrderNo", orderNo);    //设定订单编号 (必要信息)
            tQueryRequest.queryRequest.put("QueryDetail", "1");//设定查询方式
            final MerchantEntity merchantEntity = AbcPayUtils.getMerchantInfo(Integer.parseInt(dbid),150101,userCode,orderNo);
            if(merchantEntity==null){
                throw  new ApplicationException("请维护好商家与数据源映射关系】");
            }
            JSON json = tQueryRequest.extendPostRequest(merchantEntity.getIndex());
            String ReturnCode = json.GetKeyValue("ReturnCode");
            String ErrorMessage = json.GetKeyValue("ErrorMessage");
            String MerchantID=((JSONObject)com.alibaba.fastjson.JSON.parse(json.GetKeyValue("Merchant"))).getString("MerchantID");
            final String trxType = json.GetKeyValue("TrxType");
            //成功
            if (ReturnCode.equals("0000")) {
                String orderInfo = json.GetKeyValue("Order");
                Base64 tBase64 = new Base64();
                String orderDetail = new String(tBase64.decode(orderInfo),"gb2312");
                json.setJsonString(orderDetail);
                //支付成功才写执行
                if ("03".equalsIgnoreCase(json.GetKeyValue("Status"))
                        || "04".equalsIgnoreCase(json.GetKeyValue("Status"))
                        || "05".equalsIgnoreCase(json.GetKeyValue("Status"))
                ) {
                    //--更新订单状态及执行过账
                    abcPayServiceIfc.update150101LogByQuery(json,MerchantID,trxType);
                }
                Map info = new HashMap();
                info.put("code", json.GetKeyValue("Status"));
                info.put("status", AbcPayUtils.getOrderStatus(json.GetKeyValue("Status")));
                callBackMessage.setInfo(info);
                callBackMessage.sendSuccessMessageByDefault();
                return callBackMessage;
            } else {
                throw new ApplicationException(ReturnCode + "-" + ErrorMessage);
            }
        }catch (Exception e){
            throw new ApplicationException(e.getMessage());
        }finally {
            SpObserver.setDBtoInstance();
        }
    }
    private class QueryOrderCallable implements Callable<Object> {
        String orderNo;
        String dbid;
        boolean isAppCall;
        String userCode;
        public QueryOrderCallable(String orderNo, String dbid, boolean isAppCall,String userCode) {
            this.orderNo = orderNo;
            this.dbid = dbid;
            this.isAppCall = isAppCall;
            this.userCode=userCode;
        }
        @Override
        public Object call() throws Exception {
            CallBackMessage callBackMessage = new CallBackMessage();
            try {
                //暂停1秒
                Thread.sleep(1000);
                return  queryOrderStatus(dbid,orderNo,userCode).toJSONObject();
            } catch (Exception ex) {
                callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
                return callBackMessage.toJSONObject();
            }
        }
    }
}
src/com/yc/abc/entity/OrderEntity.java
@@ -18,4 +18,8 @@
    String cltCode;
    String cltName;
    String companyName;
    String onlinePaymentReturnCode;
    String onlinePaymentOneQRForAllUnid;
}
src/com/yc/abc/service/AbcPayServiceIfc.java
@@ -26,4 +26,6 @@
    void update150101LogByQuery(JSON json,String merchantID,String trxType);
    List<String> getPayOrderNoByLog();
    void save150101OrderInfo(JSON json, String qrCodeUnid);
}
src/com/yc/abc/service/AbcPayServiceImpl.java
@@ -38,11 +38,21 @@
    public OrderEntity getOrder(String docCode) {
        try {
            return this.jdbcTemplate.queryForObject("set nocount on\n" +
                    " select a.doccode as orderNo,a.SumAmount as amount,a.cltCode,a.cltName,b.companyName from t150101H a join oCompany b on a.CompanyID=b.companyid where DocCode=?", new BeanPropertyRowMapper<>(OrderEntity.class), docCode);
                    " select a.doccode as orderNo,a.SumAmount as amount,a.cltCode,a.cltName,b.companyName,a.onlinePaymentOneQRForAllUnid,a.onlinePaymentReturnCode \n" +
                    " from t150101H a join oCompany b on a.CompanyID=b.companyid where DocCode=?", new BeanPropertyRowMapper<>(OrderEntity.class), docCode);
        }catch (EmptyResultDataAccessException e){
            return  null;
        }
    }
    @Override
    public void save150101OrderInfo(JSON json, String qrCodeUnid) {
        String sql="set  nocount on\n" +
                " declare @ReturnCode varchar(20)=?,@ErrorMessage varchar(200)=?,@PaymentURL varchar(200)=?,@qrCodeUnid varchar(50)=?" +
                " update a set a.OnlinePaymentReturnCode=@ReturnCode,a.OnlinePaymentErrorMessage=@ErrorMessage,a.OnlinePaymentURL=@PaymentURL,a.OnlinePaymentOneQRForAllUnid=@qrCodeUnid  from t150101H a where a.docCode=?";
        jdbcTemplate.update(sql,json.GetKeyValue("ReturnCode"),json.GetKeyValue("ErrorMessage"),json.GetKeyValue("PaymentURL"),qrCodeUnid,json.GetKeyValue("OrderNo"));
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void save150101Log(PaymentResult paymentResult) {
src/com/yc/abc/utils/AbcPayUtils.java
@@ -41,26 +41,41 @@
     * 00:授权已取消
     * 99:失败
     */
    public  static String getOrderStatus(String status) {
    public  static String getOrderStatus(String status,String payType) {
        String result="";
        switch (status) {
            case "01":
                return "未支付";
            case "02":
                return "无回应";
            case "03":
                return "微信和支付宝支付成功";
            case "04":
                return "支付成功";
            case "05":
                return "已退款";
            case "07":
                return "授权确认成功";
            case "00":
                return "授权已取消";
            default:
                return "失败";
        }
            case "01":
                result= "未支付";
                break;
            case "02":
                result= "无回应";
                break;
            case "03":
            case "04":
                result= "支付成功";
                break;
            case "05":
                result= "已退款";
                break;
            case "07":
                result= "授权确认成功";
                break;
            case "00":
                result= "授权已取消";
                break;
            default:
                result= "支付失败";
        }
        String payTypeId="";
        if("ALI_PAY".equalsIgnoreCase(payType)){
            payTypeId="支付宝";
        }else if("weixinpay".equalsIgnoreCase(payType)){
            payTypeId="微信";
        }else{
            payTypeId="掌银";
        }
    return payTypeId+result;
    }
    /**
@@ -134,7 +149,7 @@
        tPaymentRequest.dicOrder.put("PayTypeID", Constants.PAY_TYPE_DIRECTPAY);                   //设定交易类型
        tPaymentRequest.dicOrder.put("OrderDate", date);                  //设定订单日期 (必要信息 - YYYY/MM/DD)
        tPaymentRequest.dicOrder.put("OrderTime", time);                   //设定订单时间 (必要信息 - HH:MM:SS)
        //tPaymentRequest.dicOrder.put("orderTimeoutDate", LocalDateTime.now().plusMinutes(5).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));           // 设置订单过期时间,30分钟
        //tPaymentRequest.dicOrder.put("orderTimeoutDate", LocalDateTime.now().plusMinutes(10).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));           // 设置订单过期时间,10分钟
        tPaymentRequest.dicOrder.put("OrderNo", orderNo);                       //设定订单编号 (必要信息)
        tPaymentRequest.dicOrder.put("CurrencyCode", "156");             //设定交易币种
        tPaymentRequest.dicOrder.put("OrderAmount", orderAmount.toString());      //设定交易金额