首先创建调用支付宝支付接口的配置类

public class AlipayConfig {// 商户appidpublic static String APPID = "";// 私钥 pkcs8格式的public static String RSA_PRIVATE_KEY = "";// 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String notify_url = "http://yourwebsite/alipay/notify";// 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址public static String return_url = "http://yourwebsite/alipay/returnurl";// 请求网关地址//public static String URL = "https://openapi.alipay.com/gateway.do";public static String URL = "https://openapi.alipaydev.com/gateway.do";// 编码public static String CHARSET = "UTF-8";// 返回格式public static String FORMAT = "json";// 支付宝公钥public static String ALIPAY_PUBLIC_KEY = "";// 日志记录目录public static String log_path = "/paylog";// RSA2public static String SIGNTYPE = "RSA2";
}

前台页面发起支付请求,后台调支付宝SDK提供的API,返回一个form表单到前台,前台直接发送支付请求,唤起支付宝支付页面

//前台发起支付请求
submits(){debuggerconst options = {method: 'POST',headers: { 'content-type': 'application/x-www-form-urlencoded' },url:'/pictureweb/alipay/pay',};axios(options).then((res)=>{debuggerthis.showSubmitPage = false;const form = res.data;const div = document.createElement('div');div.id = 'alipay';div.innerHTML = form;document.body.appendChild(div);document.querySelector('#alipay').children[0].submit(); // 执行后会唤起支付宝})},
@PostMapping("/pay")public void pay(HttpServletRequest request, HttpServletResponse response) throws Exception {// 商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = UUID.randomUUID().toString();logger.debug("========>1,生成的out_trade_no为"+out_trade_no+"<===========");//user表增加订单号String userName = (String) request.getAttribute("userName");User user = new User();user.setUserName(userName);user.setOutTradeNo(out_trade_no);user.setFlag(0);userService.updateByUserName(user);// 订单名称,必填String subject = "测试";// 付款金额,必填String total_amount = "1";// 商品描述,可空String body = "测试";// 超时时间 可空String timeout_express = "2m";// 销售产品码 必填String product_code = "QUICK_WAP_PAY";/**********************/// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签//调用RSA签名方式AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest();// 封装请求支付信息AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();model.setOutTradeNo(out_trade_no);model.setSubject(subject);model.setTotalAmount(total_amount);model.setBody(body);model.setTimeoutExpress(timeout_express);model.setProductCode(product_code);alipay_request.setBizModel(model);// 设置异步通知地址alipay_request.setNotifyUrl(AlipayConfig.notify_url);// 设置同步地址alipay_request.setReturnUrl(AlipayConfig.return_url);// form表单生产String form = "";try {// 调用SDK生成表单form = client.pageExecute(alipay_request).getBody();response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);response.getWriter().write(form);//直接将完整的表单html输出到页面response.getWriter().flush();response.getWriter().close();} catch (AlipayApiException e) {e.printStackTrace();}}

return_url配置的是支付成功后的同步回调路径,也就是支付成功后,支付宝要访问的你的服务器路径,这个路径必须是外网可以访问的,这样支付宝才能调的通。可以在这个回调函数中做一些处理后跳转到一个页面,比如下面代码所示,验证成功后,跳转到paysuccess.html页面。

@GetMapping("/returnurl")public void returnUrl(HttpServletRequest request, HttpServletResponse response) throws Exception {//获取支付宝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] + ",";}//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)////商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");//支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)////计算得出通知验证结果//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");if (verify_result) {//验证成功////请在这里加上商户的业务逻辑程序代码//验证成功跳转到前台支付结果页面response.sendRedirect("http://ip:port/paysuccess.html?out_trade_no="+out_trade_no);//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——//} else {//该页面可做页面美工编辑response.sendRedirect("http://ip:port/payfail.html");}}

在这个paysuccess.html页面中可以每几秒去查询下自己的数据库中订单的状态,这个状态是支付宝通过异步回调notify_url配置的路径来修改的,当支付宝修改了订单状态,前台页面查询到后即可跳转到一个指定页面,支付完成。

@PostMapping("/notify")public void notify(HttpServletRequest request, HttpServletResponse response) throws Exception {//获取支付宝POST过来反馈信息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] + ",";}//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");params.put(name, valueStr);}//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)////商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");//支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");//交易状态String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)////计算得出通知验证结果//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");if (verify_result) {//验证成功////请在这里加上商户的业务逻辑程序代码//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——if (trade_status.equals("TRADE_FINISHED")) {logger.debug("========>2,交易状态为TRADE_FINISHED,out_trade_no为"+out_trade_no+"<===========");//支付成功,user表flag置为1User user = new User();user.setOutTradeNo(out_trade_no);user.setFlag(1);userService.updateByOutTradeNo(user);//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的//如果有做过处理,不执行商户的业务程序//注意://如果签约的是可退款协议,退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知//如果没有签约可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。} else if (trade_status.equals("TRADE_SUCCESS")) {logger.debug("========>2,交易状态为TRADE_SUCCESS,out_trade_no为"+out_trade_no+"<===========");//支付成功,user表flag置为1User user = new User();user.setOutTradeNo(out_trade_no);user.setFlag(1);userService.updateByOutTradeNo(user);//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的//如果有做过处理,不执行商户的业务程序//注意://如果签约的是可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。}//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——//} else {//验证失败//验证失败,user表flag置为3User user = new User();user.setOutTradeNo(out_trade_no);user.setFlag(3);userService.updateByOutTradeNo(user);}}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>支付结果</title><script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
<h1 id="result">支付确认中。。。。
</h1>
</body>
<script>$(function () {let out_trade_no = getUrlParam("out_trade_no")window.setInterval(function () {$.ajax({url: "/pictureweb/user/queryFlag",type: 'GET',async: false,cache: false,data:{outTradeNo:out_trade_no},contentType:"application/x-www-form-urlencoded",dataType: 'json',timeout: 60000,success: function (responseObj) {if(responseObj.code=="1"){$("#result").text("");$("#result").text("支付成功,5秒后跳回首页");sessionStorage.setItem("ifPayed","已支付");goForwardToIndex();}},error: function (errMsg) {$("#result").text("支付失败");goForwardToIndex();}});}, 5000)})getUrlParam = function (name) {var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象var r = window.location.search.substr(1).match(reg);  //匹配目标参数if (r != null) return unescape(r[2]); return null; //返回参数值}goForwardToIndex = function () {window.setTimeout(function () {window.location.href="./index.html"},5000)}
</script>
</html>

分享一些技术学习视频资料:https://pan.baidu.com/s/13dbR69NLIEyP1tQyRTl4xw

支付宝手机网站支付开发详细流程相关推荐

  1. 支付宝手机网站支付开发记录之结果异步通知

    开发的时候明明配置了异步通知,可是没有执行异步通知,就算是官方Demo也不行 https://openclub.alipay.com/read.php?tid=1314&fid=46& ...

  2. 支付宝手机网站支付详细流程步骤

    手机网站支付开发流程步骤 一:正式环境 需满足的条件: 看着截图上的条件很苛刻,其实没有那么严格,只要是公司账号,有营业执照即可,支付宝账号名称和你们公司那个名一样就可以了(一般申请支付宝账号时,两个 ...

  3. 【支付宝支付】Java实现支付宝手机网站支付流程

    前言 微信登录网页授权与APP授权 微信JSAPI支付 微信APP支付 微信APP和JSAPI退款 支付宝手机网站支付 支付宝APP支付 支付宝退款 以上我都放到个人公众号,搜一搜:JAVA大贼船,文 ...

  4. 支付--支付宝手机网站支付(WAP)

    介绍: 这是放在微信供公众号内的一个项目,支付模块设计到微信公众号支付和支付宝手机网站支付,这次把支付宝手机网站支付整理下来. 文档: 支付宝手机网站支付的开发文档: https://docs.ope ...

  5. Magento支付宝手机网站支付插件V6.0旗舰版发布,支持在微信中使用支付宝支付,订单重新支付功能!...

    2019独角兽企业重金招聘Python工程师标准>>> 功能 严格按照支付宝接口文档编写代码. 支付宝异步通知机制,确保订单状态及时更新,无丢失遗漏. 订单完美对接:支付后即使关掉支 ...

  6. 搞定支付接口(一) 支付宝即时到账支付接口详细流程和代码

    搞定支付接口(一) 支付宝即时到账支付接口详细流程和java代码 为避免你们和我一样被支付接口搞得焦头烂额,写一个从申请开始到能收到钱为止的详细教程,实际上各个语言都可以用来集成支付接口,我用java ...

  7. 支付宝手机网站支付实战踩坑

    准备 需求 需求就是最简单的对接支付宝支付接口 方案心路历程 简单用http对接一下,不过想了一下觉得第三方提供的SDK总是不用,所以打算尝试一下 支付宝新版SDK,从文档到git再安装到使用,然后放 ...

  8. 4 支付宝手机网站支付demo讲解

    目录 1 引言 2 业务流程 3 用户下单 4 商户系统处理订单信息 5 支付宝向用户展示支付信息 6 用户付款 7 同步通知与异步通知 1 引言 前面三小节我们已经学过如何使用支付宝手机网站支付的功 ...

  9. php手机网站支付宝_PHP实现支付宝手机网站支付功能

    PHP实现支付宝手机网站支付功能的方法:首先开通支付宝商家中心里面的手机网站支付:然后进入开发者中心,获取到APPID:接着去文档中心下载"DEMO":最后将"demo& ...

最新文章

  1. android level list,Android Drawable (levle List selector layer List)
  2. 需要用到的各种Jar包
  3. css html 优化,CSS Animation性能优化
  4. 11.20 yum:自动化RPM包管理工具
  5. windows和linux的内存管理
  6. 51单片机外部中断实验 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管
  7. 使用Kendo上传控件实现ASP.NET Core的“批处理模式”
  8. java的常用注解有哪些_spring系列笔记之常用注解
  9. HTTP MIME 类型
  10. matlab浮点转定点的函数,FPGA基础知识17(Matlab中滤波器的定点化 浮点运算转换为定点运算)...
  11. uooc c语言作业测验答案,UOOC优课在线组织行为学测验作业答案
  12. LA 4490 Help Bubu
  13. 基金指数温度怎么算_10分钟学会计算指数温度,挑选指数基金
  14. 故宫元宵节首开夜场,票务系统HTTPS加密护航 1
  15. uniapp分享到微信流程
  16. 普通平键的主要尺寸有_平键的基本参数
  17. 字符串比较 python
  18. 3dMax模型导入SuperMap
  19. 对Chrome进行扩展【极简插件】
  20. 今日头条小程序内测!BAT早已收割,张一鸣还能分到羹吗?

热门文章

  1. Kingdom Rush 国王保卫战策略心得
  2. 离线语音识别芯片对比
  3. Java获取一年有多少周、某周的第一天和最后一天,当前时间所在当年的实际周数
  4. Java面试笔试题大汇总(最全+详细答案)
  5. 阿里HR有多敬业,Python程序员:恐怖,晚上11点接到阿里HR面试电话
  6. 领导让程序员帮他加油,看到加油卡余额!网友:中石化老总石锤
  7. python爬虫爬取《斗破苍穹》小说全文
  8. python发送邮件(一)
  9. TWS ChargerBox 驱动篇(一):Charger
  10. 阿里云服务器与腾讯云服务器优势比较哪个好?