美文网首页
支付宝支付

支付宝支付

作者: 小别墅是毛坯 | 来源:发表于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 "";
    }

相关文章

  • Android支付宝支付集成

    Android支付宝支付 标签: android Android支付宝支付使用的流程介绍 支付宝流程介绍 支付宝流...

  • ## [iOS 支付宝支付]

    [iOS开发系列-支付宝支付] 概述 开发中支付通常都会集成支付宝支付,下面讲解支付宝的整体流程。 集成支付宝支付...

  • 三方支付流程总结

    支付宝支付和微信支付 支付宝支付流程图: 支付宝支付: 当我们选择点击了支付宝支付按钮开始 1.app选择商品进行...

  • iOS支付

    支付宝支付 支付宝支付支付宝补充 微信支付 微信支付 内购 iOS开发 内购流程

  • 奖品合集

    支付宝44.44x12 支付宝200x1 支付宝121x1 支付宝111x1 支付宝100x1 支付宝88x1 支...

  • 对接支付宝支付接口开发笔记

    支付宝对接学习笔记: 功能介绍: 支付宝对接 支付宝回调 查询支付状态(略过不讲) 要求: 熟悉支付宝对接核心文档...

  • iOS集成支付宝支付

    一、支付宝支付,首先利用CocoaPods,导入支付宝SDK 二、 创建支付宝支付管理类 AlipayManag...

  • 历害word哥,支付宝AR红包风靡朋友圈

    支付宝又来搞事情,2016年12月22日,支付宝又出新玩法:支付宝AR红包! 支付宝用户可以利用支付宝的红包功能:...

  • iOS支付宝功能集成

    iOS快速集成支付宝详解/支付宝集成获取私钥与公钥 在集成支付宝功能前,我们必须了解下什么支付宝流程,下图是支付宝...

  • iOS第三方支付(支付宝、微信)

    这里会详细讲解支付宝和微信支付 一、支付宝支付 1.准备工作 1> 向支付宝”签约" 成为支付宝的”商户”, 签约...

网友评论

      本文标题:支付宝支付

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