深入支付宝支付扫描支付-跳转支付宝二维码页面支付与自定义生成二维码支付-3.自定义生成二维码行扫码支付

1、自定义页面二维码扫码支付需要利用img 的src来请求后端接口,后端使用response将二维码文件流返回

2、自定义二维码生成使用的是AlipayTradePrecreateRequest 预请求接口,不同于跳转支付宝二维码支付页面的AlipayTradePagePayRequest,且入参也有些不一样。可以从这个接口响应中获取二维码URL,用工具类转成二维码流响应给img的src属性前端即可在自定义页面展示

   public String alipay(String orderId, HttpServletResponse servletResponse) throws AlipayApiException {
        ServiceOrder order = orderMapper.selectById(orderId);//订单校验?如剔除订单项中已被置为删除的
        AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
        model.setSubject("XX增值服务");
        model.setTotalAmount(String.valueOf(order.getPayPrice()));
        model.setStoreId(orderId);
        model.setTimeoutExpress("1m");
        model.setOutTradeNo(order.getOrderNo());
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        request.setBizModel(model);
        request.setReturnUrl(alipayReturnUrl);
        request.setNotifyUrl(alipayNotifyUrl);
        // 执行支付宝请求。
        AlipayTradePrecreateResponse response = alipayClient.execute(request);
        if (response.isSuccess()) {
            log.info("调用成功");
            String code = response.getQrCode();
            log.info("二维码URL" + code); //如https://qr.alipay.com/bax04344igml342yrywa004f
            writeToServletFile(code, servletResponse);
            return response.getBody();
        } else {
            throw new CommonException(CommonConstant.FAILED, "支付宝生成二维码失败");
        }

    }


public static void writeToServletFile(String contents, HttpServletResponse resp) {
        try {
            Map<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
            hints.put(EncodeHintType.CHARACTER_SET, "UTF8");
            BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE,
                    200, 200, hints);
            resp.setHeader("Content-Type", "image/jped");//图片流写回图片的src属性即可展示
            MatrixToImageWriter.writeToStream(bitMatrix, "png", resp.getOutputStream());

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

3、这种方式不需要同步通知,异步通知同上篇博客。手机扫码(扫了没支付)马上就会回调一次,支付状态为WAIT_BUYER_PAY“,这种状态直接返回不要走后续逻辑。输入密码支付成功后还会调异步回调通知接口,这时处理自己业务并返回给支付宝“SUCCESS”。但是页面要知道是否知道是否支付成功则需要页面用个定时器来查询订单状态,或考虑websocket进行通知?

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值