1、前端-使用window.location.href来请求接口,不要使用ajax,我们请求后台支付接口后要跳转到支付宝的支付页面,安全起见,这里入参传订单ID就够了,使用订单ID从后台拿订单数据

2、控制器

 @ApiOperation("根据订单ID生成支付宝支付二维码")@GetMapping("/alipay")public String alipay(String orderId, HttpServletResponse response) throws AlipayApiException {return orderService.alipay(orderId, response);}

3、支付业务,支付宝接口文档参考“电脑网址支付——alipay.trade.page.pay(统一收单下单并支付页面接口)”

    @Overridepublic String alipay(String orderId, HttpServletResponse servletResponse) throws AlipayApiException {ServiceOrder order = orderMapper.selectById(orderId);//订单校验?如剔除订单项中已被置为删除的AlipayVo vo = new AlipayVo();vo.setOut_trade_no(order.getOrderNo());vo.setTotal_amount(String.valueOf(order.getPayPrice()));vo.setSubject("jwolf测试");vo.setProduct_code("FAST_INSTANT_TRADE_PAY"); //这个是固定的AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();request.setBizContent(JSON.toJSONString(vo));request.setReturnUrl(alipayReturnUrl);request.setNotifyUrl(alipayNotifyUrl);// 执行支付宝请求,其实就是httpclient请求// 注意这里使用的是AlipayTradePagePayRequest,返回的是response.getBody(),与自定义二维码不同AlipayTradePagePayResponse response = alipayClient.pageExecute(request);if (!response.isSuccess()) {throw new CommonException("支付异常");}  return response.getBody();}

4、返回给页面的是如下字符串,就是一个表单,表单会立即提交然后生成二维码到支付宝的固定页面,下面的form表单是带有returnURL的。支付宝扫描支付成功后进入显示支付宝支付成功,然后页面定时器重定向到商户定义的returnURL接口。这就是同步回调。支付宝还会调用配置给它的异步回调接口告知商户后台,商户后台接收到回调请求开始处理自身业务,然后返回给支付宝“SUCCESS”,如果支付宝一直没有及时收到响应会进行衰减请求。

5、同步通知。前后端分离需要自己拼接HTML页面,比较麻烦,然后response响应回去,没分离则直接跳视图填充数据就OK了

    public void alipayReturnUrl(HttpServletRequest request, HttpServletResponse response) throws IOException, AlipayApiException {log.info("支付宝同步回调");//获取支付宝GET过来反馈信息Map<String, String> params = new HashMap<String, String>();Map requestParams = request.getParameterMap();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] + ",";}//乱码解决,这段代码在出现乱码时使用。//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}boolean signVerified = AlipaySignature.rsaCheckV1(params, zfbPublicKey, AlipayClientConfiguration.charset, AlipayClientConfiguration.signType);response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();if (!signVerified) {out.println("<html>验签失败</html>");}//商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");//支付宝交易号String tradeNo = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");String totalAmount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");String tradeStatus = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");ServiceOrder order = orderMapper.selectOne(new QueryWrapper<ServiceOrder>().eq("order_no", out_trade_no));String msg = tradeStatus.equals("TRADE_SUCCESS") ? "支付成功" : "支付失败";msg += JSON.toJSONString(order);//前后端分离需要自己拼接HTML页面,比较麻烦,然后response响应回去,没分离则直接跳视图就可以了out.println("<html>" + msg + "</html>");}

6、异步通知,请求参数处理和验签都和同步通知一样,不同的是同步通知是返回一个页面,这里要修改订单状态,即支付后续逻辑,注意幂等,不要出现两次“发货”。商户的自身业务最好异步执行,可以避免执行失败或超时导致支付宝再次回调,可能会有幂等问题。最好是异步处理支付成功后的业务。异步业务最好多打印日志以备对账使用,这时的订单状态应该是支付成功与订单完成中间的一个“发货”过渡状态,异步业务正常执行完就修改订单状态为完成,而处理失败了可采取人工干预等

  @Overridepublic String alipayNotifyUrl(HttpServletRequest request) throws AlipayApiException {log.info("支付宝异步回调");Map<String, String> params = new HashMap<String, String>();Map requestParams = request.getParameterMap();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] + ",";}//乱码解决,这段代码在出现乱码时使用。//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}boolean flag = AlipaySignature.rsaCheckV1(params, zfbPublicKey, AlipayClientConfiguration.charset, AlipayClientConfiguration.signType);// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//if (flag == true) {// 验证成功String trade_status = request.getParameter("trade_status"); // 交易状态String out_trade_no = request.getParameter("out_trade_no"); // 获取订单号log.info("回调过程获取的订单编号:{},订单状态:{}", out_trade_no, trade_status);        if (!"TRADE_SUCCESS".equals(trade_status)) {return "";}log.info("支付宝订单支付成功!开始本地支付成功后业务");int update = orderMapper.update(new ServiceOrder().setStatus(Constants.OrderStatus.PAY_OK.getOrderStatus()), new QueryWrapper<ServiceOrder>().eq("order_no", out_trade_no).eq("status", Constants.OrderStatus.NO_PAY.getOrderStatus()));if (update != 1) {log.error("支付成功,但跟新订单状态为处理出现失败,订单号:{}", out_trade_no);return "";} else {//异步处理该订单。收了钱不能退款,告诉用户成功。异步处理订单如有错误需要人工处理。asyncProcessOrder(out_trade_no);return "SUCCESS";}}return "";}

深入支付宝支付扫描支付-跳转支付宝二维码页面支付与自定义生成二维码支付-2跳转固定的支付宝页面进行扫码支付相关推荐

  1. app内嵌h5支付功能,跳转支付宝微信,vue组件

    一.功能梳理 app内前h5涉及到支付的功能,ios非实物商品实付需要使用ios原生支付方式,实物商品则可以三方支付,主要的实现思路为后端返回跳转支付宝或微信的支付scheme链接,前端进行跳转支付, ...

  2. php支付宝红包跳转接口,支付宝小程序API 跳转支付宝应用或页面

    my.ap.navigateToAlipayPage 版本需求:基础库 1.10.0 或更高版本:支付宝客户端 10.1.32 或更高版本 ,若支付宝客户端版本较低,建议做 兼容处理. 小程序中跳转到 ...

  3. 深入支付宝支付扫描支付-跳转支付宝二维码页面支付与自定义生成二维码支付-1参数配置篇

    这里较详细总结一下支付宝扫码支付,从三个方面总结 ①参数配置 ②跳转固定的支付宝页面进行扫码支付 ③自定义二维码扫码支付 参数配置-开放平台相关配置(沙箱环境) 刚开始支付宝的配置参数还是有点让人懵逼 ...

  4. iOS和Android使用同一个二维码自动跳转不同下载页面链接(附生成二维码地址方法)

    一.使用场景 开发了一款App,包括iOS及Android版,到了推广阶段,准备生成二维码让用户扫码下载,那这个二维码该怎么生成?iOS及Andorid各自生成一个二维码让用户区分下载?当然这种方式是 ...

  5. IOS抖音短视频APP开发关于扫描二维码,并根据文本生成二维码

    IOS抖音短视频APP开发关于扫描二维码,(根据光线强弱显示隐藏闪光灯)并根据文本生成二维码. WeakSelf; //IOS抖音短视频APP开发构建扫描样式视图 _scanView = [[WSLS ...

  6. Nuxt.js - 最新自定义报错、缺省、404、500 定制化 error.vue(页面、接口报错时自动跳转到该自定义页面)支持自定义文案、状态码等功能

    前言 在开发 Nuxt.js 时,当页面出错或接口后台数据返回异常时,页面就会 "直接呈现" 报错的信息. 正常情况下,当页面 404.500 或页面报错时, 前端应该 自动跳转到 ...

  7. java跳转QQ支付宝_[Web] QQ跳转支付宝领红包,一步到位,无需调用浏览器~附源码和演示动图...

    [HTML] 纯文本查看 复制代码 支付宝领红包啦! html, body { margin:0; padding:0; background-color:#0097F7; font-size:16p ...

  8. Spring Boot电商项目57:订单模块六:【前台:生成支付二维码】接口;(支付url的拼凑;利用zxing生成二维码;二维码图片的存储;真实地址与可访问地址的转换;)

    说明: (1)本篇博客主要内容是:开发[前台:生成支付二维码]接口: (2)本篇博客需要注意的点有: ● 支付url的拼凑: ● 利用zxing生成二维码: ● 二维码图片的存储:真实地址与可访问地址 ...

  9. 【Android】实现生成二维码、条形码和扫描二维码的功能

    目录 一.添加依赖 二.布局文件 三.实现生成二维码的功能 四.效果图 一.添加依赖 要先添加一个第三方库来实现二维码的生成以及扫描二维码的功能,开源库如下: 在build.grade(Moudle) ...

  10. HTML5+js 实现生成二维码,扫描解析二维码

    先看效果图 二维码内容可以是数字,字母,中文,都可以解析识别.中文会存在乱码问题,要使用utf8Decode转码后才可以正确解析. 代码 使用了两个页面,一个是生成二维码页面,一个是解析页面. 下面是 ...

最新文章

  1. ASP中关于全局页面的作用 asax文件
  2. 深拷贝浅拷贝的一些理解
  3. Practical Go: Real world advice for writing maintainable Go programs
  4. jquery的extend和fn.extend
  5. 【web前端期末大作业】html在线网上书店 基于html制作我的书屋(23页面)
  6. 如何在VS中统计项目代码量
  7. cad 打开硬件加速卡_如何提高CAD运行速度
  8. 编译错误(拓补排序)
  9. pe下找不到ssd硬盘_进入PE系统之后找不到固态硬盘
  10. 使用pip出现报错:Could not find a version that satisfies the...No matching distribution distributio...
  11. Unity3D组件 | 绘制静态柱状图
  12. 怎么修改背景图片大小的HTML代码,css如何改变背景图片大小?
  13. 浏览器输入url后经历的过程(详细)
  14. 总结做SEO没效果,这些点你考虑过吗?
  15. mysql 慢日志 逻辑读_运维日记| MySQLOracle深度解析之一:逻辑读
  16. 基于行为识别和视频分类的算法
  17. 算法-动态规划2图问题-TSP问题
  18. arcgisengine 线转面方法
  19. 2022低压电工考试模拟100题及答案
  20. 管理驾驶舱前景如何?

热门文章

  1. 解除IIS文件下载限制
  2. H盘显示数据错误循环冗余检查要怎样办啊
  3. 2018金山wps暑期招聘服务器端笔试题(第二批)
  4. 修行漫谈——说说中年危机
  5. win10文件名乱码但内容正常怎么办 win10文件名乱码怎么解决
  6. c# 财务报表数字转大写的方法
  7. 网站盈利模式其实只有三种
  8. 交叉电缆与以太网电缆有哪些区别之处,弱电工程师必知!
  9. 往期回顾和开学第二周总结
  10. webuploader直接上传文件到百度云BOS中