com.alipay.sdk
alipay-easysdk
2.2.0
cn.hutool
hutool-all
5.7.20
org.apache.poi
poi-ooxml
4.1.2
org.projectlombok
lombok
true
下面是我们的文件位置
1.新建一个AlipayConfig.java
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Data
@Component
@ConfigurationProperties(prefix = "alipay")
public class AliPayConfig {
private String appId;
private String appPrivateKey;
private String alipayPublicKey;
private String notifyUrl;
@PostConstruct
public void init() {
// 设置参数(全局只需设置一次)
Config config = new Config();
config.protocol = "https";
config.gatewayHost = "openapi.alipaydev.com";
config.signType = "RSA2";
config.appId = this.appId;
config.merchantPrivateKey = this.appPrivateKey;
config.alipayPublicKey = this.alipayPublicKey;
config.notifyUrl = this.notifyUrl;
Factory.setOptions(config);
System.out.println("=======支付宝SDK初始化成功=======");
}
}
2.放入我们的alipay实体类
import lombok.Data;
@Data
public class AliPay {
private String traceNo;
private String totalAmount;
private String subject;
// private String alipayTraceNo;
}
3.然后是我们的控制层Controller
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import com.example.demo.controller.dto.AliPay;
import com.example.demo.mapper.OrdersMapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/alipay")
public class AliPayController {
@Resource
private OrdersMapper ordersMapper;
@GetMapping("/pay") // &subject=xxx&traceNo=xxx&totalAmount=xxx
public String pay(AliPay aliPay) {
AlipayTradePagePayResponse response;
try {
// 发起API调用(以创建当面付收款二维码为例)
response = Factory.Payment.Page()
.pay(aliPay.getSubject(), aliPay.getTraceNo(), aliPay.getTotalAmount(), "");
} catch (Exception e) {
System.err.println("调用遭遇异常,原因:" + e.getMessage());
throw new RuntimeException(e.getMessage(), e);
}
return response.getBody();
}
@PostMapping("/notify") // 注意这里必须是POST接口
public String payNotify(HttpServletRequest request) throws Exception {
if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
System.out.println("=========支付宝异步回调========");
Map params = new HashMap<>();
Map requestParams = request.getParameterMap();
for (String name : requestParams.keySet()) {
params.put(name, request.getParameter(name));
// System.out.println(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"));
// 更新订单未已支付
ordersMapper.updateState(tradeNo, "已支付", gmtPayment, alipayTradeNo);
}
}
return "success";
}
}
然后是我们的数据库
订单表:
CREATE TABLE `orders` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int DEFAULT NULL COMMENT '用户ID',
`alipay_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_turkish_ci DEFAULT NULL COMMENT '支付宝流水号',
`name` varchar(255) COLLATE utf8mb4_turkish_ci DEFAULT NULL COMMENT '名称',
`no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_turkish_ci DEFAULT NULL COMMENT '编号',
`total_price` decimal(10,2) DEFAULT NULL COMMENT '总金额',
`state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_turkish_ci DEFAULT '待付款' COMMENT '状态',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '订单创建时间',
`pay_time` varchar(255) COLLATE utf8mb4_turkish_ci DEFAULT NULL COMMENT '订单付款时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_turkish_ci;
做完这些我们就开始进行支付,在支付之前我们要先到支付宝平台申请一下开放
支付宝开放平台 (alipay.com)
进入到界面,我们登录然后进行获取
以上内容按照步骤进行就可以,然后是我们的配置application.yml
alipay:
appId: 你的AppId
appPrivateKey: 应用私钥
alipayPublicKey: 应用公钥
notifyUrl: natapp获取
然后我们还需要一个工具natapp,内网穿透:https://natapp.cn/
申请一个免费的隧道然后进行配置
本地端口号就是你的后台的端口号,我这里是9090
然后下好工具之后,复制我们的authtoken
在外面的bat里面换成我们自己的这个authtoken
当你看见下面的内容时就说明连接成功了
然后将我们的这个http放入刚刚的配置里面
记住,一定要加上/alipay/notify !!!!!!!!!!!!!!!!!
然后我们就配置成功了,就可以进行支付
首页
收货
查看商品
取消
支付
核心代码:进行调用我们的支付宝沙箱支付接口
pay(row) {
// window.open('http://localhost:9090/alipay/pay?subject=${row.name}&traceNo=${row.no}&totalAmount=${row.totalPrice}');
window.open("http://localhost:9090/alipay/pay?subject=" + row.name + "&traceNo=" + row.no + "&totalAmount=" + row.totalPrice)
this.load()
},
然后我们访问URL进行测试,测试的url格式:http://localhost:9090/alipay/pay?subject=商品名称&traceNo=一个订单号&totalAmount=1000
(totalAmount为订单支付价格)
如何我们的账号在我们的页面有提供
输入账号和密码就可以进行付款了
然后我们就可以看见有一个接口回调:
代码回调在我们的Controller里面有:
@PostMapping("/notify") // 注意这里必须是POST接口
public String payNotify(HttpServletRequest request) throws Exception {
if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
System.out.println("=========支付宝异步回调========");
Map params = new HashMap<>();
Map requestParams = request.getParameterMap();
for (String name : requestParams.keySet()) {
params.put(name, request.getParameter(name));
// System.out.println(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"));
// 更新订单未已支付
ordersMapper.updateState(tradeNo, "已支付", gmtPayment, alipayTradeNo);
}
}
return "success";
}
最后在我们的数据库就可以看见信息了
然后我们的前台页面也可以看见信息
用户:
然后用户就可以进行操作啦!!!
管理员:
就可以进行订单操作,用户也可以看见信息啦!!!!
好了!完结撒花花,以上内容就是我进行支付宝支付的一些方法,有问题的可以私聊我,当然也希望大家在觉得内容不错的时候进行鼓励,关注走起来!!!!
后续也会进行其他的更新哦,敬请期待吧!!!!