一、简介

电脑支付常用于电商和后台管理系统的账户充值等场景。

电脑网站支付 文档

电脑网站支付流程图

项目源代码(含数据库):码云Gitee

二、集成步骤

0、创建应用、配置密钥

集成前需要先创建应用、配置密钥、回调地址等以及alipay-sdk-java.jaralipay-trade-sdk.jar请查看
SpringBoot(一)集成支付宝 - 准备工作 | 官网案例

1、pom 坐标

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELEASE</version><relativePath/> <!-- lookup parent from repository -->
</parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><fastjson.version>1.2.41</fastjson.version>
</properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mariadb依赖  start--><dependency><groupId>org.mariadb.jdbc</groupId><artifactId>mariadb-java-client</artifactId></dependency><!-- mariadb依赖  end--><!--sprignboot mybatis支持--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.0</version></dependency><!-- jsp相关 --><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- 用于解析jsp页面--><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId></dependency><!-- 热部署 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><!-- apache的工具包 MapUtils start --><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.2</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.7</version></dependency><!-- apache的工具包 end --><!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 支付宝 alipay sdk --><!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java --><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.1.0</version></dependency><!-- wx xml相关 --><!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream --><dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.9</version></dependency></dependencies>

2、application.properties

spring:datasource:driver-class-name: org.mariadb.jdbc.Driverurl: jdbc:mariadb://localhost:3306/alipay?allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMTusername: rootpassword: 123456mvc:view:prefix: /WEB-INF/jsp/suffix: .jspstatic-path-pattern: /**redis:host: 127.0.0.1port: 6379timeout: 10000password: 123456
mybatis:mapper-locations: classpath:/mybatis-mapper/*type-aliases-package: com.example.demo.pojo
logging:level:org:springframework: WARN#打印dao上的sql语句com:example:demo :dao : DEBUG
#  config: classpath:logback-admin.xml  #这个注释掉就不会在服务器产生日志
server:port: 8080devtools:livereload:enabled: true#是否支持livereloadport: 35729restart:enabled: true#是否支持热部署

3、支付宝配置类

public class AlipayConfig {//这里用natapp内外网穿透
//    public static final String natUrl = "http://gca8w8.natappfree.cc";public static final String natUrl = "http://localhost:8080";// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号public static String app_id = "";//在后台获取(必须配置)// 商户私钥,您的PKCS8格式RSA2私钥public static String merchant_private_key = "";// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.html 对应APPID下的支付宝公钥。public static String alipay_public_key = "";// 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String notify_url = natUrl + "/alipay/alipayNotifyNotice";// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String return_url = natUrl + "/alipay/alipayReturnNotice";
//    public static String return_url = "http://login.calidray.com/?#/sign";// 签名方式public static String sign_type = "RSA2";// 字符编码格式public static String charset = "utf-8";// 支付宝网关public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";//注意:沙箱测试环境,正式环境为:https://openapi.alipay.com/gateway.do
}

4、支付宝Controller

@Controller
@RequestMapping("/alipay")
public class AlipayController {private static final Logger LOGGER = LoggerFactory.getLogger(AlipayController.class);@Autowiredprivate ProductService productService;@Autowiredprivate OrdersService ordersService;/*** 对应官方例子   alipay.trade.page.pay.jsp* @Description: 前往支付宝第三方网关进行支付* @Description notify_url 和 return_url 需要外网可以访问,建议natapp 内网穿透* @Date 2020-10-29 15:02* @Author: StarSea99*/@PostMapping("goAlipay")@ResponseBodypublic String goAlipay(String orderId, HttpServletRequest request, HttpServletRequest response) throws Exception {Orders order = ordersService.getOrderById(orderId);Product product = productService.getProductById(order.getProductId());//获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);//设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(AlipayConfig.return_url);alipayRequest.setNotifyUrl(AlipayConfig.notify_url);//商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = orderId;//付款金额,必填String total_amount = order.getOrderAmount();//订单名称,必填String subject = product.getName();//商品描述,可空String body = "用户订购商品个数:" + order.getBuyCounts();// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。String timeout_express = "10m";//例子去官方api找alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","+ "\"total_amount\":\"" + total_amount + "\","+ "\"subject\":\"" + subject + "\","+ "\"body\":\"" + body + "\","+ "\"timeout_express\":\"" + timeout_express + "\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");//请求String result = alipayClient.pageExecute(alipayRequest).getBody();System.out.println("==="+result);return result;}/*** @Title: 对应官方例子return_url.jsp    return_url必须放在公网上  回跳页面* @Description: 支付宝同步通知页面* @Description TODO* @Date 2020-10-29 15:02* @Author: StarSea99*/@RequestMapping("alipayReturnNotice")public String alipayReturnNotice(HttpServletRequest request, HttpServletRequest response, Map map) throws Exception {LOGGER.info("支付成功, 进入同步通知接口...");//获取支付宝GET过来反馈信息Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = request.getParameterMap();for (Iterator<String> 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, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名//——请在这里编写您的程序(以下代码仅作参考)——if (signVerified) {//商户订单号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 total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");// 修改叮当状态,改为 支付成功,已付款; 同时新增支付流水  这里放在 异步 业务 处理
//            ordersService.updateOrderStatus(out_trade_no, trade_no, total_amount);//页面  展示Orders order = ordersService.getOrderById(out_trade_no);Product product = productService.getProductById(order.getProductId());LOGGER.info("********************** 支付成功(支付宝同步通知) **********************");LOGGER.info("* 订单号: {}", out_trade_no);LOGGER.info("* 支付宝交易号: {}", trade_no);LOGGER.info("* 实付金额: {}", total_amount);LOGGER.info("* 购买产品: {}", product.getName());LOGGER.info("***************************************************************");map.put("out_trade_no", out_trade_no);map.put("trade_no", trade_no);map.put("total_amount", total_amount);map.put("productName", product.getName());} else {LOGGER.info("支付, 验签失败...");}//前后分离形式  直接返回页面 记得加上注解@Response  http://login.calidray.com你要返回的网址,再页面初始化时候让前端调用你其他接口,返回信息
//        String result = "<form action=\"http://login.calidray.com/?#/index/depreciation-scrap/depreciation\"  method=\"get\" name=\"form1\">\n" +
//                "</form>\n" +
//                "<script>document.forms[0].submit();</script>";
//
//        return result;//前后不分离的形式,直接返回jsp页面return "alipaySuccess";}/* ** 功能:支付宝服务器异步通知页面   对应官方例子 notify_url.jsp     notify_url必须放入公网* 日期:2017-03-30* 说明:* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。*************************页面功能说明*************************  制作业务处理* 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。* 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。* 如果没有收到该页面返回的 success* 建议该页面只做支付成功的业务逻辑处理,退款的处理请以调用退款查询接口的结果为准。*//*** @Description: 支付宝异步 通知  制作业务处理* @Description TODO* @Date 2020-10-29 15:02* @Author: StarSea99*/@RequestMapping(value = "/alipayNotifyNotice")@ResponseBodypublic String alipayNotifyNotice(HttpServletRequest request, HttpServletRequest response) throws Exception {LOGGER.info("支付成功, 进入异步通知接口...");//获取支付宝POST过来反馈信息Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = request.getParameterMap();for (Iterator<String> 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, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名//——请在这里编写您的程序(以下代码仅作参考)——/* 实际验证过程建议商户务必添加以下校验:1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)4、验证app_id是否为该商户本身。*/if (signVerified) {//验证成功//商户订单号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");//付款金额String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");if (trade_status.equals("TRADE_FINISHED")) {//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意: 尚自习的订单没有退款功能, 这个条件判断是进不来的, 所以此处不必写代码//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知} else if (trade_status.equals("TRADE_SUCCESS")) {//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意://付款完成后,支付宝系统发送该交易状态通知// 修改叮当状态,改为 支付成功,已付款; 同时新增支付流水ordersService.updateOrderStatus(out_trade_no, trade_no, total_amount);//这里不用 查  只是为了 看日志 查的方法应该卸载 同步回调 页面 中Orders order = ordersService.getOrderById(out_trade_no);Product product = productService.getProductById(order.getProductId());LOGGER.info("********************** 支付成功(支付宝异步通知)查询 只是为了 看日志  **********************");LOGGER.info("* 订单号: {}", out_trade_no);LOGGER.info("* 支付宝交易号: {}", trade_no);LOGGER.info("* 实付金额: {}", total_amount);LOGGER.info("* 购买产品: {}", product.getName());LOGGER.info("***************************************************************");}LOGGER.info("支付成功...");} else {//验证失败LOGGER.info("支付, 验签失败...");}return "success";}
}

5、ProductController 类

@Controller
@RequestMapping
public class ProductController {@Autowiredprivate ProductService productService;@Autowiredprivate OrdersService ordersService;//获取产品列表@RequestMappingpublic String products(Map map) {List<Product> pList = productService.getProducts();map.put("pList", pList);return "index";}//首页显示,查询全部产品@RequestMapping("index")public String index(Map map) {List<Product> pList = productService.getProducts();map.put("pList", pList);return "index";}//进入购物车页面@RequestMapping(value = "/goConfirm")public String goConfirm(String productId, Map map) {Product p = productService.getProductById(productId);map.put("p", p);return "goConfirm";}//分段提交,保存订单@RequestMapping(value = "/createOrder")@ResponseBodypublic LeeJSONResult createOrder(Orders order) throws Exception {Product p = productService.getProductById(order.getProductId());Sid sid = new Sid();String orderId = sid.nextShort();//生成16位随机字符串order.setId(orderId);//设置idorder.setOrderNum(orderId);//设置订单号order.setCreateTime(new Date());//设置创建时间order.setOrderAmount(String.valueOf(Float.valueOf(p.getPrice()) * order.getBuyCounts()));//实际支付金额order.setOrderStatus(OrderStatusEnum.WAIT_PAY.key);//订单状态ordersService.saveOrder(order);return LeeJSONResult.ok(orderId);}//分段提交,第二段@RequestMapping(value = "/goPay")public String goPay(String orderId, Map map) {//根据订单号查询订单Orders order = ordersService.getOrderById(orderId);//根据订单号查询产品Product p = productService.getProductById(order.getProductId());map.put("order", order);map.put("p", p);return "goPay";}}

6、想看完成的代码可以查看 Gitee

数据库,页面展示以及业务层调用 这里略过

项目源代码(含数据库):码云Gitee

7、项目效果图展示

说明:此项目只是为了跑通流程,页面不够好可以自行寻找整合。

首页

购物车

确认订单

支付宝支付(使用沙箱)


支付成功回调信息页


如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发。
创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客

SpringBoot(二)集成支付宝 - 电脑网站支付和查询账单案例相关推荐

  1. Spring Boot集成支付宝电脑网站支付功能

    Spring Boot集成支付宝电脑网站支付功能 接入准备 登录 创建应用 添加能力 生成私钥与公钥 开发设置 沙箱环境 示例Demo的使用与学习 下载Demo 启动项目 参数配置 执行测试 Spri ...

  2. Laravel 集成支付宝电脑网站支付

    前期准备: 1.下载SDK,里面还有Demo,可以参照Demo里面的内容快速接入 支付宝电脑网站支付SDK&Demo 2.把下载的zip文件解压,放到项目目录里,这里作者放在app文件夹里,方 ...

  3. 支付宝开放平台开发助手_支付宝:如何创建和接入支付宝电脑网站支付-新手必备...

    1.登录支付宝 1.打开支付宝官网,以"我是支付宝商家"用户登录 https://www.alipay.com/ 2.进入"产品中心",选择并申请支付类型 2. ...

  4. 支付宝电脑网站支付 demo 启动过程

    接支付的这个需求,想了很久,看了官网总是没有头绪,依旧不知道怎么做,于是把demo下载下来跑一下,由于太菜,弄了一天. 准备工作: 支付宝开发平台登录后注册获取APPID,支付宝公钥,私钥 (http ...

  5. 支付宝-电脑网站支付初长成

    前言 企业制定金额生成微信二维码集成完后,客户需要再集成支付宝,经过差文档及看博客终于实现出来(支付宝生成指定金额二维码,需要在"蚂蚁金服开放平台"注册账号,并且开通"电 ...

  6. 支付宝电脑网站支付及回调

    官方文档:https://docs.open.alipay.com/270 支付 电脑网站支付的支付接口 alipay.trade.page.pay 调用时序图如下: 调用顺序如下: 商户系统请求支付 ...

  7. 接入支付宝电脑网站支付实现JAVA版

    简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址,因为我这些服务天天在更新,而我的文章是教大家方法,而让你不是照葫芦画瓢 ...

  8. Laravel 集成支付宝手机网站支付

    前期准备: 1.下载SDK,里面还有Demo,可以参照Demo里面的内容快速接入 支付宝 手机网站支付SDK&Demo 2.把下载的zip文件解压,放到项目目录里,这里作者放在app文件夹里, ...

  9. 支付宝电脑网站支付(新版)

    前言 继前面几篇文章以后,查看了常用的支付方式,发现还有电脑网站的支付方式,因此,这里稍微整理了一下,其实原理和手机网站支付差不多,只是使用沙箱测试的时候可能会遇到一点小坑. 沙箱采坑 因为在本地测试 ...

最新文章

  1. 全球及中国天然香豆素行业竞争态势与投资份额调研报告2022版
  2. 初学__Python——Python数据类型之文件
  3. 系列(三)—Redis
  4. 搜狗拼音输入法大头贴新增几个新的模板,欢迎使用.
  5. 9路棋盘java代码_Java ServiceContext类代码示例
  6. .1 matlab,1 MATLAB集成环境
  7. 校园招聘最重要的有2点 第一个是不要抱死一家公司
  8. PAT乙级(1027 打印沙漏)
  9. Python入门学习笔记(1)
  10. 一次java线程死锁的定位
  11. mysql for 循环删除_Java增强for循环中删除元素抛异常问题
  12. android 今日头条布局,Android今日头条UI适配完善版
  13. 无废话C#设计模式系列文章
  14. Spring IOC中bean标签和管理对象细节
  15. Java语言程序设计 基础篇 编程练习题 12.7
  16. 火狐无法安装扩展_立即安装的前5个Firefox扩展
  17. Charles安卓8手机抓包
  18. SSM毕设项目户籍管理系统jrg02(java+VUE+Mybatis+Maven+Mysql)
  19. 扫描全能王30元/月的OCR文字识别免费使用方法
  20. 150 个 word 常用文书模板 推荐(附下载地址)

热门文章

  1. 亚马逊美国站对CPC认证有什么要求
  2. 2019/11/11 还是没能脱单噻
  3. 配置MXNET、Pytorch、Tensorflow环境详细教程
  4. 財報中的HoH, YoY, MoM, QoQ是什麼意思?
  5. 呱呱学习-专注于线下教育服务的平台
  6. 触摸屏如何防止别人备份,恢复,下载项目
  7. 一木.溪桥学Python-09:函数的返回值、函数的作用域、作用域的优先级、递归函数、内置文件中常用方法、匿名函数lambda、高阶函数
  8. 关于开发证书配置(Certificates Identifiers Provisioning Profiles)IOS发布(转)
  9. 一款桌面英语翻译软件介绍
  10. 跨境物流费用该如何计算?