美文网首页
支付宝支付

支付宝支付

作者: 小别墅是毛坯 | 来源:发表于2020-01-09 14:27 被阅读0次
    @ApiOperation(value = "支付宝支付", notes = "支付宝支付")
       @PostMapping(value = "/zfbpay")
       public String zfbPrePay(@RequestBody BuyerPayDto buyerPayDto) throws DocumentException {
           String collect = buyerPayDto.getIds().replaceAll(",", "-");
           double countAmount = buyerPayService.countAmount(Arrays.asList(buyerPayDto.getIds().split(",")));
           PayUtils.PayOrderInfo payOrderInfo = PayUtils.generatePayOrderInfo(PayTypeEnum.ALIPAY, "一分钱商品", "商品购买",
                   BigDecimal.valueOf(countAmount), PayProperty.get("ZFB.notify_url"), collect);
           return payOrderInfo.getOrderInfo();
       }
    
        @ApiOperation(value = "支付宝支付结果回调", notes = "支付宝支付结果回调")
        @RequestMapping(value = "/zfbsuccess", produces = {"application/json;charset=UTF-8"})
        @ResponseBody
        @ApiIgnore
        public String AliNotify(HttpServletRequest request) {
            Map requestParams = request.getParameterMap();
            /*
             * 获取支付宝返回信息
             */
            try {
                HashMap<String, String> params = new HashMap<String, String>();
                for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
                    String name = (String) iter.next();
                    String[] values = (String[]) requestParams.get(name);
                    String valueStr = "";
                    for (int i = 0; i < values.length; i++) {
                        valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
                    }
                    if (name.equals("trade_status")) {
                        System.out.println("交易状态为:" + valueStr);
                    }
                    params.put(name, valueStr);
                }
                // 获取支付宝的通知返回参数
                // 商户订单号
                String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8")
                        .replaceAll("-", ",");
                // 支付宝交易号
                String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
                // 买家登录支付宝id
                String buyer_logon_id = new String(request.getParameter("buyer_logon_id").getBytes("ISO-8859-1"), "UTF-8");
                // 交易时间
                String gmt_payment = new String(request.getParameter("gmt_payment").getBytes("ISO-8859-1"), "UTF-8");
                // 交易金额
                String invoice_amount = new String(request.getParameter("invoice_amount").getBytes("ISO-8859-1"), "UTF-8");
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = null;
                try {
    
                    date = format.parse(gmt_payment);
                } catch (Exception e) {
                }
                PropertiesUtil PAY_PROP = new PropertiesUtil("/configs/pay.properties"); // 这里需使用支付宝的配置
                boolean b = AlipaySignature.rsaCheckV1(params, PAY_PROP.getProperty("alipay_public_key"), "UTF-8", "RSA2");
                int orderType = getOrderType(out_trade_no);
                // 验证通过
                if (b) {
                    // 交易状态为成功
                    if ("TRADE_SUCCESS".equals(params.get("trade_status"))) {
                        try {
                            Arrays.asList(out_trade_no.split(",")).forEach(outTradeNo -> {
                                userAccountWork(outTradeNo, trade_no, 1, orderType);
                            });
                        } catch (Exception e1) {
                            e1.printStackTrace();
                        }
    
                        return "SUCCESS";
                    }
    
                }
                return "error:验证签名失败";
            } catch (Exception e) {
                // TODO: handle exception
                return "支付异常";
            }
        }
    
        private int getOrderType(String out_trade_no) {
            if (out_trade_no.split(",").length > 1) {
                return 0;
            }
            return 1;
        }
    
        public void buildGoodPayOrder(int type, String outTradeNo, BigDecimal payAmount, Integer userId, Integer status,
                                      String tradeNo, int orderType) {
            Example example = new Example(GoodsOrderDetail.class);
            example.createCriteria().andEqualTo("orderId", outTradeNo);
            GoodsOrderDetail goodsOrderDetail = goodsOrderDetailMapper.selectOneByExample(example);
            GoodsModel goodsModel = goodsMapper.selectByPrimaryKey(goodsOrderDetail.getGoodsId());
            if (goodsModel.getStockNum() > 0) {
                goodsModel.setStockNum(goodsModel.getStockNum() - 1);
                goodsModel.setBrowseNum(goodsModel.getBrowseNum() == null ? 0 : goodsModel.getBrowseNum() + 1);
                goodsModel.setSalesVolume(goodsModel.getSalesVolume() == null ? 0 : goodsModel.getSalesVolume() + 1);
            }
            userRank.add(goodsModel.getType());
            map.put(userId + "", userRank);
            goodsMapper.updateByPrimaryKey(goodsModel);
            GoodsPayOrder goodsPayOrder = new GoodsPayOrder();
            goodsPayOrder.setCreateTime(new Date());
            goodsPayOrder.setOrderNum(1);
            goodsPayOrder.setOutTradeNo(outTradeNo);
            goodsPayOrder.setDeleteFlag(1);
            goodsPayOrder.setPayType(type);
            goodsPayOrder.setPayAmount(payAmount);
            goodsPayOrder.setUserId(userId);
            goodsPayOrder.setPayStatus(status);
            goodsPayOrder.setOrderType(orderType);
            goodsPayOrder.setPayTime(new Date());
            goodsPayOrder.setTradeNo(tradeNo);
            goodsPayOrderMapper.insert(goodsPayOrder);
        }
    
        public void userAccountWork(String outTradeNo, String trade_no, int type, int orderType) {
            //更新订单相关 ---------------------------------
            GoodsOrder payInfo = buyerPayService.getPayInfo(Integer.parseInt(outTradeNo));
            // 第三方防止重复通知
            if (payInfo.getOrderStatus() > 0) {
                return;
            }
            buildGoodPayOrder(type, outTradeNo, payInfo.getOrderAmount(), payInfo.getUserId(), 1, trade_no, orderType);
            Example example = new Example(GoodsOrderDetail.class);
            example.createCriteria().andEqualTo("orderId", outTradeNo);
            GoodsOrderDetail goodsOrderDetail = goodsOrderDetailMapper.selectOneByExample(example);
            GoodsModel goodsModel = goodsMapper.selectByPrimaryKey(goodsOrderDetail.getGoodsId());
            payInfo.setPayOrderNo(trade_no);
            if (goodsModel.getType() == 0) {
                payInfo.setOrderStatus(1);
            } else {
                payInfo.setOrderStatus(5);
            }
            payInfo.setPayTime(new Date());
            buyerPayService.updateStatus(payInfo);
            // 付款成功业务逻辑处理-减除掉用户的消费卷
            UserAccount userAccount = userAccountService.findByUserId(payInfo.getUserId());
            User user = userService.findById(payInfo.getUserId());//当前付款用户
            User RecommenderUser = userService.findByPhone(user.getUserPhone());//当前用户的推荐人
    
            if (user == null) {
                //查无用户
                return;
            }
            //支付明细相关-------------------------------------------
            if (type == 2) {
                // 分红余额支付及明细生成
                DataDividendRecord dataDividendRecord = new DataDividendRecord();
                dataDividendRecord.setOrderId(payInfo.getId());
                dataDividendRecord.setUserId(payInfo.getUserId());
                dataDividendRecord.setBeforeAmount(userAccount.getDividendb());
                userAccount.setDividendb(userAccount.getDividendb().subtract(payInfo.getPayAmount()));
                dataDividendRecord.setAfterAmount(userAccount.getDividendb());
                dataDividendRecord.setDeleteFlag(1);
                dataDividendRecord.setAmount(payInfo.getPayAmount());
                dataDividendRecord.setType(4);
                dataDividendRecord.setCreateTime(new Date());
                dataDividendRecord.setUserReceiptId(payInfo.getUserId());
                dataDividendRecord.setStatus(1);
                dataDividendRecord.setRemark("分红余额消费扣除");
                dataDividendRecordMapper.insert(dataDividendRecord);
    
            }
    
        private static final PropertiesUtil PAY_PROP = new PropertiesUtil("/configs/pay.properties");
        private static AlipayClient alipayClient;
    
        static {
            alipayClient = new DefaultAlipayClient(PAY_PROP.getProperty("alipay_getway"),
                    PAY_PROP.getProperty("alipay_app.id"),
                    PAY_PROP.getProperty("alipay_rsa_private_key"),
                    "JSON",
                    "UTF-8",
                    PAY_PROP.getProperty("alipay_public_key"),
                    "RSA2"
            );
        }
     /**
         * 生成支付订单信息(APP支付用)
         *
         * @param payType     支付类型
         * @param orderDesc   订单描述信息
         * @param orderTitle  订单标题
         * @param orderAmount 订单金额
         * @param notifyUrl   回调通知URL
         * @return 支付订单信息
         */
        public static PayOrderInfo generatePayOrderInfo(PayTypeEnum payType, String orderDesc, String orderTitle, BigDecimal orderAmount, String notifyUrl, String orderNo) throws DocumentException {
    
            //若订单号为空,则自动生成支付订单号
            if (StringUtils.isBlank(orderNo)) {
                orderNo = generateOrderNo(payType);
            }
    
            //若支付回调地址为空,则自动生成支付回调地址
            if (StringUtils.isBlank(notifyUrl)) {
                notifyUrl = generatePayNotifyUrl(payType);
            }
    
            //根据支付类型生成支付订单信息
            String orderInfo = "";
            switch (payType) {
                case ALIPAY:
                    orderInfo = generateAlipayOrderInfo(orderDesc, orderTitle, orderAmount, orderNo, notifyUrl);
                    break;
              
                default:
                    break;
            }
    
            return new PayOrderInfo(orderNo, orderInfo);
        }
     /**
         * 生成支付宝支付订单信息(支付宝APP支付-预下单)
         *
         * @param orderDesc   订单描述信息
         * @param orderTitle  订单标题
         * @param orderAmount 订单金额
         * @param orderNo     订单号
         * @param notifyUrl   回调通知URL
         * @return 支付宝支付订单信息
         */
        private static String generateAlipayOrderInfo(String orderDesc, String orderTitle, BigDecimal orderAmount, String orderNo, String notifyUrl) {
            AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
            model.setBody(orderDesc);
            model.setSubject(orderTitle);
            model.setOutTradeNo(orderNo);
            model.setTotalAmount(orderAmount.setScale(2, BigDecimal.ROUND_DOWN) + "");
    
            AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
            request.setBizModel(model);
            request.setNotifyUrl(notifyUrl);
            try {
                AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
                return response.getBody();
            } catch (AlipayApiException e) {
                e.printStackTrace();
            }
            return "";
        }
    

    相关文章

      网友评论

          本文标题:支付宝支付

          本文链接:https://www.haomeiwen.com/subject/orpyactx.html