1.沙箱环境简介&基础开发配置

1.进入支付宝官网,扫码进入,网址:https://open.alipay.com/platform/home.htm

2.找到开发服务进入下面的研发服务

3.在手机上面下载支付宝沙箱

4.沙箱账号里面有一个商家信息,一个是买家信息

账号余额可以自动更改不过不能太多有上限,可惜这都是假的

5.找到自己的开发信息

6.这是自己的:应用私钥和支付宝公钥

7.支付流程

2.创建Spring Boot项目

创建SpringBoot的流程就不写了

1.1  这里只粘贴一下我的pom.xml依赖:

 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-easysdk</artifactId><version>2.0.2</version></dependency></dependencies>

这个里面只有基本的web、lombok、支付宝的sdk依赖。

1.2   下面就是我的项目结构

结构介绍:

1.PaymentBO是接收controller层的入参,如商品id、购买数量等等,结合具体的业务而定
2.PayController是控制器,负责分发请求,主要是处理用户的支付请求,以及支付宝的回调
3.ProjectInit是项目初始化时执行的一些操作,适合在整个过程中只需要执行一次的业务
4.PayService是真正的服务层,主要的业务代码在这里
5.OrderUtil是一个订单工具类,主要是生成随机订单号
6.index.html是模拟下单支付的页面
7.return.html是支付完成之后的页面

3.编写支付页面和回调页面

在index.html里面的代码:


<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>确认订单</title>
</head>
<body><div>您的订单信息如下,请确认无误后支付:<br />这个里面就是您的订单详细信息,在这里我就不多写了,想写的话可以自己设置一些样式<form enctype="multipart/form-data" action="/payController/confirm" method="get"><button type="submit">确认支付</button></form></div>
</body>
</html>

在return.html里面的代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>支付成功</title>
</head>
<body><div>您已成功购买此商品,感谢您的支持</div>
</body>
</html>

回调地址肯定要外网可以访问,要不然支付宝怎么会调用得到呢?但是我们作为开发者可能没有自己到服务器和域名,所以我们使用内网穿透工具natapp获取临时域名,在这里我就不说怎么搭建内网穿透了

映射完成之后,启动项目,用临时域名测试一下下面的页面:

3.配置Spring Boot项目&初始化支付宝SDK

1.新版本的SDK 把大部分操作都封装到了Factory类中,但是Factory类在使用之前需要我们配置一下参数,且全局配置一次即可,所以我们把这部分代码拿到ProjectInit类中,在项目启动时执行一次:

alipay:appId: 换成自己的APPIDprivateKey: 换成自己的私钥publicKey: 换成自己的公钥#支付网关配置,这一项是写死的,正式环境是openapi.alipay.comgateway: openapi.alipaydev.com#支付成功之后的回调页面,只是一个友好页面。主要换成你自己映射的临时域名returnUrl: http://frnqxw.natappfree.cc/return.html#支付成功的接口回调notifyUrl:

2. 新版本的SDK 把大部分操作都封装到了Factory类中,但是Factory类在使用之前需要我们配置一下参数,且全局配置一次即可,所以我们把这部分代码拿到ProjectInit类中,在项目启动时执行一次:

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;/***  项目初始化** @author xyh* @date 20201-11-21* */
@Component
public class ProjectInit implements ApplicationRunner {//应用id@Value("${alipay.appId}")private String appId;//私钥@Value("${alipay.privateKey}")private String privateKey;//公钥@Value("${alipay.publicKey}")private String publicKey;//支付宝网关@Value("${alipay.gateway}")private String gateway;//支付成功后的接口回调地址,不是回调的友好页面,不要弄混了@Value("${alipay.notifyUrl}")private String notifyUrl;/***  项目初始化事件* */@Overridepublic void run(ApplicationArguments args) throws Exception {//初始化支付宝SDKFactory.setOptions(getOptions());System.out.println("**********支付宝SDK初始化完成**********");}private Config getOptions() {//这里省略了一些不必要的配置,可参考文档的说明Config config = new Config();config.protocol = "https";config.gatewayHost = this.gateway;config.signType = "RSA2";config.appId = this.appId;// 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中config.merchantPrivateKey = this.privateKey;//注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可config.alipayPublicKey = this.publicKey;//可设置异步通知接收服务地址(可选)config.notifyUrl = notifyUrl;return config;}
}

3.1 编写下单支付接口

既然要下单,肯定少不了传参,所以我们这里简单的声明一个PaymentBO类

import lombok.Data;import java.math.BigDecimal;/***  发起支付时的参数** @author xyh* @date 2021-11-21* */
@Data
public class PaymentBO {//省略其他的业务参数,如商品id、购买数量等//商品名称private String subject;//总金额private BigDecimal total = BigDecimal.ZERO;
}

然后在OrderUtil编写如下代码:

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;/**** @author xyh* @date 2021-11-21* *
public class OrderUtil {/***  根据时间戳生成订单号* */public static String getOrderNo () {DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");LocalDateTime localDateTime = Instant.ofEpochMilli(System.currentTimeMillis()).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();return df.format(localDateTime);}
}

接下来我们只需要Factory.Payment.Page.pay就可以发起一个支付请求,所以我们在PayService编写以下代码:

​mport com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.payment.facetoface.models.AlipayTradePayResponse;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import com.course.java.alipay.bo.PaymentBO;
import com.course.java.alipay.util.OrderUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import java.math.BigDecimal;/***  支付宝支付,业务实现** @author xyh* @date 2021-11-21* */
@Service
public class PayService {//支付成功后要跳转的页面@Value("${alipay.returnUrl}")private String returnUrl;/***  下单支付* */public Object pay (PaymentBO bo) throws Exception {//从存储介质(如MySQL、Redis)查询商品信息、总金额等敏感信息//…………省略相关代码,这里直接赋值…………bo.setSubject("游戏充值")bo.setTotal(new BigDecimal(648.00));//调用sdk,发起支付AlipayTradePagePayResponse response = Factory.Payment//选择网页支付平台.Page()//调用支付方法,设置订单名称、我们自己系统中的订单号、金额、回调页面.pay(bo.getSubject() , OrderUtil.getOrderNo(), bo.getTotal().toString() , returnUrl);//这里的response.body,就是一个可以直接加载的html片段,// 这里为了简单我直接返回这个片段,前端直接return response.body;}
}[点击并拖拽以移动]
​

再往下,编写PayController:

import com.course.java.alipay.bo.PaymentBO;
import com.course.java.alipay.service.PayService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;import java.util.Map;/***  支付宝支付,控制器** @author xyh* @date 2021-11-21* */
@RestController
@RequestMapping(value = "/payController")
@AllArgsConstructor
public class PayController {private PayService payService;/***  下单支付* */@GetMapping(value = "/confirm" , produces = {"text/html;charset=UTF-8"})public Object pay (@RequestParam(required = false) PaymentBO bo) throws Exception {//这个接口其实应该是post方式的,但是我这里图方便,直接以get方式访问,//且返回格式是text/html,这样前端页面就能直接显示支付宝返回的html片段//真实场景下由post方式请求,返回code、msg、data那种格式的标准结构,让前端拿到data里的        //html片段之后自行加载//由于我这里并没有真正的传参数,所以象征性的new一下,避免空指针bo = new PaymentBO();return payService.pay(bo);}
}

4. 支付测试

在手机上打开沙箱版支付宝,登录买家帐号,扫码支付:

到这里支付宝支付流程就完了

Spring Boot 集成支付宝 沙箱支付相关推荐

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

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

  2. Spring Boot集成支付宝(最新版SDK)—— 手机支付

    前言 前些日子写了一篇关于H5网页集成支付宝的文章: Spring Boot集成支付宝(最新版SDK)-- H5/网页支付 当时写了好久,往那一坐就是俩小时,写完直接就发布了,发布之后才感觉少点啥-- ...

  3. springboot集成支付宝沙箱支付

    pom.xml <!-- 支付宝支付 --><dependency><groupId>com.alipay.sdk</groupId><artif ...

  4. java后端实现集成支付宝APP支付(沙箱环境)

    沙箱环境集成支付宝APP支付后端实现 前言 获取支付宝相关信息 整体开发流程 1.获取核心参数 2.将支付宝SDK集成到项目中 3.后台使用支付宝SDK与支付宝进行交互逻辑 1.将支付宝公共信息参数写 ...

  5. SpringBoot集成支付宝沙箱手机网站支付详细流程和踩坑分享

    描述 本文主要讲解SpringBoot集成支付宝沙箱手机网站支付,即网页点击按钮发起支付,跳转到沙箱app付款 由于其他博客的流程大多笼统,有时候并不能找到正确的集成方式,本文尽可能详细的阐述付款,异 ...

  6. Java web集成支付宝电脑支付接口(沙箱环境)

    前言 这篇博客主要介绍如何在Java web项目中集成支付宝的电脑支付接口(会稍微介绍一下服务器集成APP支付接口).目前支付宝接口更新很快,在博主查找资料的时候,很多都是即时到账接口,APP支付则是 ...

  7. 基于SpringBoot vue的电脑商城平台源码和论文含支付宝沙箱支付

    演示视频: 基于SpringBoot vue的电脑商城平台源码和论文含支付宝沙箱支付演示视频 支付宝沙箱: package com.java.controller;import java.util.* ...

  8. SpringBoot+Vue整合支付宝沙箱支付

    SpringBoot+Vue2整合实现支付宝沙箱支付 原创不易,转载请注明!!原创不易,转载请注明!!原创不易,转载请注明!!原创不易,转载请注明!!原创不易,转载请注明!! 在进行电脑网站开发时我们 ...

  9. 基于SpringBoot vue的茶叶商城平台源码和论文含支付宝沙箱支付

    此项目是前后端分离的 后台项目:shop 前端项目:Vue-shop 后端项目启动步骤: 1.先把sql导入数据库 2.把后台项目导入编辑器 3.修改数据库配置 4.启动项目   前端项目启动步骤: ...

最新文章

  1. 宜信开源|数据库审核软件Themis的规则解析与部署攻略
  2. 服务器信号分析,服务器及其讯号解析装置 Server and its signal analysis apparatus
  3. wxWidgets:wxEditableListBox类用法
  4. Redis应用场景(转)
  5. transforms.Compose()函数
  6. CS224N刷题——Assignment2.3_RNN:Language Modeling
  7. Atitit 登录模块常见的安全措施条例与攻击行为表 目录 1. 安全目标 1 2. 常见安全措施 2 2.1. 修改密码需要验证员密码 2 2.2. 密码Salt加盐机制 2 2.3. Sql防注
  8. 吉利车机安装第三方软件教程(win10笔记本详细操作方法)
  9. NLP论文阅读1--More Data, More Relations, More Context and More Openness: A Review and Outlook for Relati
  10. 机器学习笔记 - 深度学习的预处理和图像白化
  11. HDU - 6070
  12. 笔记本连接显示器后没有声音_笔记本外接显示器后没声音怎么回事
  13. laravel 项目笔记之SendCloud 驱动
  14. 2020牛客暑期多校训练营(第七场)J.Pointer Analysis
  15. 知乎 高级操作系统_一款假的国产操作系统被吹上知乎热榜:浮夸只会害了科技创新...
  16. 【爬虫】关于企业信用信息公示系统-加速乐最新反爬虫机制
  17. 二、数据模型和关系模型
  18. Java处理Excel文件工具包-easyexcel使用详解
  19. 轮播图图片大小不统一
  20. 最吸引人的引流话术_抖音流广告引流【日引312人小白】

热门文章

  1. 如何用Modis模拟WAP上网
  2. 萧洁云:SAP中国重上快车道
  3. 清华大学出版社与SAP签署战略合作协议
  4. 测试技术提升建议(测试必看)
  5. 实用Maven插件 - 打包
  6. 活体检测 Face Anti-Spoofing Using TransformersWith Relation-Aware Mechanism 学习笔记
  7. ROS kinetic 连接实体机器人UR10(使用ur_morden_driver) catkin_make 时报错
  8. 网约车和社交融合靠不靠谱?
  9. we learn考试能切屏吗_螺蛳粉闻臭师年薪50万,你想挑战吗?
  10. erdas查看灰度直方图_ERDAS图像的基本操作