| | |
| | | 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; |
| | |
| | | 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( |
| | |
| | | |
| | | 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 |
| | |
| | | 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(); |
| | | } |
| | | } |
| | | } |
| | | } |