1、进入支付宝开放平台
支付宝开发者平台开放平台
1.1 登录支付宝账号后下拉选择网页/移动应用开发

1.2 创建网页应用

1.3 创建成功后进入沙箱
沙箱比较不好找到 沙箱地址在这里:
登录 - 支付宝
欢迎登录支付宝,支付宝-全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验以及转账收款/水电煤缴费/信用卡还款等生活服务应用;为广大为从事电子商务的网站提供支付产品/支付服务的在线订购和技术支持等服务,帮助商家快速接入支付工具,高效、安全、快捷地开展电子商务。

1.4 点击启用公钥(有重要作用!springboot整合时会用到)

2、开始springboot与支付宝沙箱的整合
2.1导入支付宝api的依赖
<!--引入支付宝支付 -->
<dependency>
<groupid>com.alipay.sdk</groupid>
<artifactid>alipay-easysdk</artifactid>
<version>2.2.1</version>
</dependency>
<dependency>
<groupid>com.alipay.sdk</groupid>
<artifactid>alipay-sdk-java</artifactid>
<version>4.22.113.all</version>
</dependency>2.2 配置 application.yml 沙箱参数
#支付宝 alipay: appid: appprivatekey: alipaypublickey: notifyurl: returnurl:
这五个参数都是什么意思呢?
appid: 沙箱中的应用id
appprivatekey: 应用私钥
alipaypublickey: 支付宝公钥
notifyurl: 调用支付宝支付接口后产生的回调,需要内网穿透,后面详细讲,先不配置
returnurl: 支付成功后的页面跳转,设置成你项目中的成功支付界面(可不填)
appprivatekey: 应用私钥与 alipaypublickey: 支付宝公钥在这里:点击查看


import com.alipay.api.defaultalipayclient;
/**
* @method: $
* @description:
* @date: $
* @author: myth
* @return $
*/
public class alipayutils {
public static alipayclient alipayclient;
static {
alipayclient =
new defaultalipayclient(
"https://openapi-sandbox.dl.alipaydev.com/gateway.do",
"123123123",
"miievgibadanbgkq.......",
"json",
//utf-8编码格式
"utf-8",
"miibijanbgkqhk......",
//rsa非对称加密
"rsa2");
}
public static alipayclient getalipayclient() {
return alipayclient;
}
}2.3 在过滤器和拦截器中忽略掉alipay的系列端口
package com.gyp.studytour.common;
import com.gyp.studytour.common.jwtinterceptor;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.web.servlet.config.annotation.interceptorregistry;
import org.springframework.web.servlet.config.annotation.resourcehandlerregistry;
import org.springframework.web.servlet.config.annotation.webmvcconfigurationsupport;
@configuration
public class interceptorconfig extends webmvcconfigurationsupport {
@override
protected void addinterceptors(interceptorregistry registry) {
registry.addinterceptor(jwtinterceptor())
.addpathpatterns("/**").excludepathpatterns("/alipay/**");
super.addinterceptors(registry);
}
@bean
public jwtinterceptor jwtinterceptor() {
return new jwtinterceptor();
}
}2.4 新建alipaycontroller.java,定义了支付接口与支付回调接口:
import javax.annotation.resource;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import java.time.localdatetime;
import java.util.date;
import java.util.hashmap;
import java.util.map;
/**
* @author myth
* @date created in 2024/4/23 15:23
* @description:
* @version v1.0
*/
@restcontroller
@requestmapping("alipay")
@transactional(rollbackfor = exception.class)
public class alipaycontroller {
@resource
alipayconfig alipayconfig;
@resource
addressbookmapper addressbookmapper;
@autowired
orderserviceimpl orderserviceimpl;
private static final string gateway_url ="https://openapi-sandbox.dl.alipaydev.com/gateway.do";
private static final string format ="json";
private static final string charset ="utf-8";
private static final string sign_type ="rsa2";
@getmapping("/pay") // 前端路径参数格式?subject=xxx&traceno=xxx&totalamount=xxx
public void pay(alipay alipay, httpservletresponse httpresponse) throws exception {
alipayclient alipayclient = new defaultalipayclient(gateway_url, alipayconfig.getappid(),
alipayconfig.getappprivatekey(), format, charset, alipayconfig.getalipaypublickey(), sign_type);
alipaytradepagepayrequest request = new alipaytradepagepayrequest();
request.setnotifyurl(alipayconfig.getnotifyurl());
request.setreturnurl(alipayconfig.getreturnurl());
request.setbizcontent("{\"out_trade_no\":\"" + alipay.gettraceno() + "\","
+ "\"total_amount\":\"" + alipay.gettotalamount() + "\","
+ "\"subject\":\"" + alipay.getsubject() + "\","
+ "\"product_code\":\"fast_instant_trade_pay\"}");
string form = "";
try {
// 调用sdk生成表单
form = alipayclient.pageexecute(request).getbody();
} catch (alipayapiexception e) {
e.printstacktrace();
}
httpresponse.setcontenttype("text/html;charset=" + charset);
// 直接将完整的表单html输出到页面
httpresponse.getwriter().write(form);
httpresponse.getwriter().flush();
httpresponse.getwriter().close();
}
@postmapping("/notify") // 注意这里必须是post接口
public string paynotify(httpservletrequest request) throws exception {
if (request.getparameter("trade_status").equals("trade_success")) {
map<string, string> params = new hashmap<>();
map<string, string[]> requestparams = request.getparametermap();
for (string name : requestparams.keyset()) {
params.put(name, request.getparameter(name));
}
string tradeno = params.get("out_trade_no");
string gmtpayment = params.get("gmt_payment");
string alipaytradeno = params.get("trade_no");
// 支付宝验签
if (factory.payment.common().verifynotify(params)) {
// 验签通过
system.out.println("交易名称: " + params.get("subject"));
system.out.println("交易状态: " + params.get("trade_status"));
system.out.println("支付宝交易凭证号: " + params.get("trade_no"));
system.out.println("商户订单号: " + params.get("out_trade_no"));
system.out.println("交易金额: " + params.get("total_amount"));
system.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
system.out.println("买家付款时间: " + params.get("gmt_payment"));
system.out.println("买家付款金额: " + params.get("buyer_pay_amount"));
// 更新订单已支付的逻辑代码
}
}
return "success";
}
}前端页面调用
async function handlebuy(){ window.open('http://localhost:80/alipay/pay') }2.5 编写alipay.java 接收前端传来的参数
package com.songqiao.waimai.alipay.payparameter;
import lombok.data;
/**
* @author myth
* @date created in 2024/4/23 15:26
* @description: alipay接口参数
* @version v1.0
*/
@data
public class alipay {
//订单编号
private string traceno;
//商品金额
private double totalamount;
//商品名称
private string subject;
//订单追踪号,商户自己生成,可已不使用
private string alipaytraceno;
}在application.yml中还有一个重要的参数 notifyurl 没有配置,这个参数是支付成功后支付宝的回调函数访问本地系统的路径,需要以内网穿透的方式让支付宝访问本地系统。
3、使用natapp进行内网穿透
3.1 进入natapp官网注册账号,并进行实名认证、与支付宝账号进行绑定。
natapp-内网穿透 基于ngrok的国内高速内网映射工具
natapp是基于ngrok的国内高速内网穿透专业服务商,独家彻底解决ngrok1.7内存泄漏问题.稳定拒绝掉线,适用于微信开发调试,本地架设演示服务器,外网可以访问,远程服务器,远程桌面,远程办公,游戏联机等
natapp-内网穿透 基于ngrok的国内高速内网映射工具
3.2 下载指定版本的natapp应用

我这里选用的是windows 64位下载,下载并解压成功后的内容为:

3.2.1 运行natapp.exe
出现以下界面

3.2.2 配置natapp中的隧道
回到natapp官网,点击购买隧道->免费隧道->创建隧道并配置程序中的端口等信息

创建成功后点击我的隧道->点击配置->点击复制获取authtoken


3.2.3 启动自己本机的web服务
在natapp.exe启动后的命令行输入natapp -authtoken=刚刚复制的token,就会与本机的8080端口映射成功!

出现如图所示状态后,那么恭喜你!外网即可访问你的本机的8080端口,支付宝api支付成功后即可完成回调!
3.3 配置application.yml中notifyurl参数

4、支付宝沙箱支付前端vue代码
调用后端接口并拼接get请求的参数,完成
async gotopaysuccess(){
//在这里我选择了window.open(url,'_self')形式,也就是不跳转新的页面,在本页面直接跳转
window.open("http://127.0.0.1:8080/alipay/pay?subject="+"鱼头,"+this.note+"&traceno="+math.floor(math.random() * 900000) + 100000+"&totalamount="+this.goodsprice,'_self')
},5、启动项目并测试功能
点击支付按钮后跳转支付界面,为了避免被当做违规图片,我把二维码遮盖了。

注意!大坑!此时要求你登录的支付宝账号密码是支付宝沙箱的账号密码!不要混淆!
支付宝沙箱账号密码在沙箱中查看!
登录 - 支付宝
欢迎登录支付宝,支付宝-全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验以及转账收款/水电煤缴费/信用卡还款等生活服务应用;为广大为从事电子商务的网站提供支付产品/支付服务的在线订购和技术支持等服务,帮助商家快速接入支付工具,高效、安全、快捷地开展电子商务。

输入账号密码后即可进行付款

确认付款后会有两种结果:1.付款成功界面 2.付款成功后跳转到你指定的页面(在前面的application.yml的配置中设置) 如果没有配置就会展示成功界面,配置了就会在几秒后跳转到你配置的界面中去!

以上就是springboot实现支付宝沙箱支付的完整步骤的详细内容,更多关于springboot沙箱支付的资料请关注代码网其它相关文章!
发表评论