目录
1.注册登录支付宝开放平台
2.配置支付宝密钥
查看沙箱账号
3.工程搭建
使用eclipse创建一个springboot工程
创建好后,在pom文件下添加需要的jar包如下:
编写配置文件application.properties,记得填写自己的私钥,公钥,和支付宝公钥,内容如下:
将支付宝当面付官方demo下载下来
修改jsp文件,这里我们将jsp中的内部样式删除,才用引入外部样式 base.css
base.css
在springboot 2.X之后,静态文件如css、images、js等也会被拦截器拦截,因此需要重写资源映射文件,并且统一配置拦截器。如下图代码
为了能够同时访问到jsp和html页面,需要配置多个视图解析器。编写一个WebViewConfig类,代码如下:
4.工程完成后,进行演示
项目结构如下图:
1.注册登录支付宝开放平台
开发平台链接地址:-->开发平台
点击进入研发服务
2.配置支付宝密钥
这里RSA2和RSA只需要设置一个即可。设置方法,可参照官方提示进行配置,需要下载:--> 密钥生成工具
生成好后,在本地可以看到有以下两个文本文档
将应用公钥里面的内容复制填入到RSA2应用公钥里面,这时候会自动生成支付宝公钥。
查看沙箱账号
可以获取自己的商家和买家测试账号,可以下载安卓版沙箱版支付宝APP进行登录。
3.工程搭建
使用eclipse创建一个springboot工程
创建好后,在pom文件下添加需要的jar包如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- alipay begin -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.4.ALL</version>
</dependency>
<dependency>
<groupId>com.alipay</groupId>
<artifactId>alipay-trade-sdk</artifactId>
<version>20161215</version>
</dependency>
<!-- alipay end -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
</dependencies>
编写配置文件application.properties,记得填写自己的私钥,公钥,和支付宝公钥,内容如下:
# 支付宝网关名、partnerId和appId
open_api_domain = https://openapi.alipaydev.com/gateway.do
mcloud_api_domain = http://mcloudmonitor.com/gateway.do
pid = 沙箱账号中的UID
appid = 沙箱应用中的AppID
# RSA私钥、公钥和支付宝公钥
private_key = 使用工具在本地生成的应用私钥
public_key = 使用工具在本地生成的应用公钥
#SHA256withRsa对应支付宝公钥
alipay_public_key = 页面查看支付宝公钥
# 签名类型: RSA->SHA1withRsa,RSA2->SHA256withRsa
sign_type = RSA2
# 当面付最大查询次数和查询间隔(毫秒)
max_query_retry = 5
query_duration = 5000
# 当面付最大撤销次数和撤销间隔(毫秒)
max_cancel_retry = 3
cancel_duration = 2000
# 交易保障线程第一次调度延迟和调度间隔(秒)
heartbeat_delay = 5
heartbeat_duration = 900
将支付宝当面付官方demo下载下来
官方demo下载地址:-->当面付
pom文件中的以下依赖需要手动安装
<dependency>
<groupId>com.alipay</groupId>
<artifactId>alipay-trade-sdk</artifactId>
<version>20161215</version>
</dependency>
按照方法:cmd,进入DOS命令,进入demo项目目录,输入以下命令进行安装
mvn install:install-file -DgroupId=com.alipay -DartifactId=alipay-trade-sdk -Dversion=20161215 -Dpackaging=jar -Dfile=alipay-trade-sdk20161215.jar
找到WebRoot目录下可以看到如下四个jsp页面,分别是条码付、二维码支付、交易查询,退款申请。
并将post请求修改为get请求,否则会报错([org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported]),将index.html文件放到templates目录下,将demo中images静态文件放到static目录下新建的images下。结构如下图:
修改jsp文件,这里我们将jsp中的内部样式删除,才用引入外部样式 base.css
base.css
@charset "UTF-8";
*{
margin:0;
padding:0;
}
ul,ol{
list-style:none;
}
.title{
color: #ADADAD;
font-size: 14px;
font-weight: bold;
padding: 8px 16px 5px 10px;
}
.hidden{
display:none;
}
.new-btn-login-sp{
border:1px solid #D74C00;
padding:1px;
display:inline-block;
}
.new-btn-login{
background-color: transparent;
background-image: url("../images/new-btn-fixed.png");
border: medium none;
}
.new-btn-login{
background-position: 0 -198px;
width: 82px;
color: #FFFFFF;
font-weight: bold;
height: 28px;
line-height: 28px;
padding: 0 10px 3px;
}
.new-btn-login:hover{
background-position: 0 -167px;
width: 82px;
color: #FFFFFF;
font-weight: bold;
height: 28px;
line-height: 28px;
padding: 0 10px 3px;
}
.bank-list{
overflow:hidden;
margin-top:5px;
}
.bank-list li{
float:left;
width:153px;
margin-bottom:5px;
}
#main{
width:750px;
margin:0 auto;
font-size:14px;
font-family:'宋体';
}
#logo{
background-color: transparent;
background-image: url("../images/new-btn-fixed.png");
border: medium none;
background-position:0 0;
width:166px;
height:35px;
float:left;
}
.red-star{
color:#f00;
width:10px;
display:inline-block;
}
.null-star{
color:#fff;
}
.content{
margin-top:5px;
}
.content dt{
width:160px;
display:inline-block;
text-align:right;
float:left;
}
.content dd{
margin-left:100px;
margin-bottom:5px;
}
#foot{
margin-top:10px;
}
.foot-ul li {
text-align:center;
}
.note-help {
color: #999999;
font-size: 12px;
line-height: 130%;
padding-left: 3px;
}
.cashier-nav {
font-size: 14px;
margin: 15px 0 10px;
text-align: left;
height:30px;
border-bottom:solid 2px #CFD2D7;
}
.cashier-nav ol li {
float: left;
}
.cashier-nav li.current {
color: #AB4400;
font-weight: bold;
}
.cashier-nav li.last {
clear:right;
}
.alipay_link {
text-align:right;
}
.alipay_link a:link{
text-decoration:none;
color:#8D8D8D;
}
.alipay_link a:visited{
text-decoration:none;
color:#8D8D8D;
}
在springboot 2.X之后,静态文件如css、images、js等也会被拦截器拦截,因此需要重写资源映射文件,并且统一配置拦截器。如下图代码
package cn.campusshop.configuration;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
@Override
protected void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/trade_pay").setViewName("jsp/trade_pay");
registry.addViewController("/trade_precreate").setViewName("jsp/trade_precreate");
registry.addViewController("/trade_query").setViewName("jsp/trade_query");
registry.addViewController("/trade_refund").setViewName("jsp/trade_refund");
registry.setOrder(2);
super.addViewControllers(registry);
}
/**
* @Description: 配置静态文件映射
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
为了能够同时访问到jsp和html页面,需要配置多个视图解析器。编写一个WebViewConfig类,代码如下:
package cn.campusshop.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;
@Configuration
@EnableWebMvc
@ComponentScan
public class WebViewConfig implements WebMvcConfigurer {
/**
* @Description: 注册jsp视图解析器
*/
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/"); // 配置放置jsp文件夹
resolver.setSuffix(".jsp");
resolver.setViewNames("jsp/*"); // 重要 setViewNames 通过它识别为jsp页面引擎
resolver.setOrder(2);
return resolver;
}
/**
* @Description: 注册html视图解析器
*/
@Bean
public ITemplateResolver templateResolver() {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setTemplateMode("HTML");
templateResolver.setPrefix("classpath:/templates/");
templateResolver.setSuffix(".html");
templateResolver.setCharacterEncoding("utf-8");
templateResolver.setCacheable(false);
return templateResolver;
}
/**
* @Description: 将自定义tml视图解析器添加到模板引擎并主持到ioc
*/
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
return templateEngine;
}
/**
* @Description: Thymeleaf视图解析器配置
*/
@Bean
public ThymeleafViewResolver viewResolverThymeLeaf() {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setCharacterEncoding("utf-8");
viewResolver.setViewNames(new String[] {"thymeleaf"});
viewResolver.setOrder(1);
return viewResolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/**
* @Description: 配置静态文件映射
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
4.工程完成后,进行演示
项目结构如下图:
点击springbootapplication右键运行
浏览器输入:http://localhost:8080/
条码支付
二维码支付
订单查询
订单退款
经测试,以上功能均能实现,沙箱支付宝可以查询交易明细