1.登录支付宝沙箱
点击控制台
滑到最下面点击沙箱
点击查看公钥模式并复制
复制公钥和私钥,并编写配置类
# ID
alipay.appId=9021。。。
# 公钥
alipay.alipayPublicKey。。。
# 私钥
alipay.privateKey。。。
# 回调地址?# https://www.baidu.com/
alipay.notifyUrl=http://127.0.0.1:8081/paySuccess
alipay.returnUrl=http://127.0.0.1:8081/paySuccess
alipay.charset=UTF-8
alipay.signType=RSA2
# 响应地址
alipay.gatewayUrl=https://openapi-sandbox.dl.alipaydev.com/gateway.do
alipay.logPath="F:\\alipay\\log"
所需要jar包
<!--
个人版本踩坑:
不加这个依赖的话,当在配置类中
使用@ConfigurationProperties(prefix = "aliyun")注解时,
我这个版本的spring boot会提示有问题-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</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>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.31</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.74</version>
</dependency>
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.22.110.ALL</version>
</dependency>
编写配置类
AliPay:
package com.cskt.springboot_aliyun.baen;
import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.cskt.springboot_aliyun.config.AliPayConfig;
import com.cskt.springboot_aliyun.domian.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author 26846
*/
@Component
public class AliPay {
@Autowired
private AliPayConfig aliPayConfig;
public String pay(Order order) throws AlipayApiException {
//支付网关
String serverUrl = aliPayConfig.getGatewayUrl();
// AppId
String appId = aliPayConfig.getAppId();
// 用户密钥(私钥),即PKCS8格式RSA2私钥
String privateKey = aliPayConfig.getPrivateKey();
//格式化为json格式
String format = "json";
//编码
String charset = aliPayConfig.getCharset();
//支付宝公钥,即对应Appid下的支付宝公钥
String alipayPublicKey = aliPayConfig.getAlipayPublicKey();
//签名方式
String signType = aliPayConfig.getSignType();
//页面跳转同步通知页面路径
String returnUrl = aliPayConfig.getReturnUrl();
//服务器异步通知页面路径
String notifyUrl = aliPayConfig.getNotifyUrl();
//1、获取初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(
serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType);
//2、设置请求参数
AlipayTradePagePayRequest alipayTradePagePayRequest = new AlipayTradePagePayRequest();
// 页面跳转同步通知页面路径
alipayTradePagePayRequest.setReturnUrl(returnUrl);
alipayTradePagePayRequest.setNotifyUrl(notifyUrl);
//封装参数(json格式)
alipayTradePagePayRequest.setBizContent(JSON.toJSONString(order));
// 3、请求支付宝进行付款,并获取支付结果
String body = alipayClient.pageExecute(alipayTradePagePayRequest).getBody();
//放回信息
return body;
}
}
AliPayConfig:
package com.cskt.springboot_aliyun.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/**
* @author 26846
*/
@Configuration
@PropertySource(value = "classpath:application-alipay.properties")
@ConfigurationProperties(prefix = "alipay") //前缀
@Data
public class AliPayConfig {
private String appId;
private String privateKey;
private String alipayPublicKey;
private String notifyUrl;
private String returnUrl;
private String charset;
private String signType;
private String gatewayUrl;
}
service层:
接口:
/**
* 支付宝支付接口
*/
String aliPay(Order order) throws AlipayApiException;
/**
* 查询订单信息
* @return
*/
List<Order> orderAll();
/**
* 新增订单信息
* @param order
* @return
*/
int orderAdd(Order order);
/**
* 修改订单状态
*/
int revise(String out_trade_no);
实现类:
package com.cskt.springboot_aliyun.service.impl;
import com.alipay.api.AlipayApiException;
import com.cskt.springboot_aliyun.baen.AliPay;
import com.cskt.springboot_aliyun.domian.Order;
import com.cskt.springboot_aliyun.mapper.OrderMapper;
import com.cskt.springboot_aliyun.service.AliPayService;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author 26846
* @date 2023/3/23 10:47
*/
@Service
public class AliPayServiceImpl implements AliPayService {
@Autowired
private AliPay aliPay;
@Autowired
private OrderMapper orderMapper;
@Override
public String aliPay(Order order) throws AlipayApiException {
System.out.println("order----service--:"+order);
return aliPay.pay(order);
}
/**
* 查询信息
* @return
*/
@Override
public List<Order> orderAll() {
return orderMapper.orderAll();
}
@Override
public int orderAdd(Order order) {
return orderMapper.orderAdd(order);
}
@Override
public int revise(String out_trade_no) {
return orderMapper.revise(out_trade_no);
}
}
控制层:
package com.cskt.springboot_aliyun.controller;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.cskt.springboot_aliyun.domian.Order;
import com.cskt.springboot_aliyun.service.AliPayService;
import com.cskt.springboot_aliyun.service.impl.AliPayServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
@RestController
public class AliPayController {
@Autowired
private AliPayService aliPayService;
@Autowired
private AliPayServiceImpl aliPay;
/**
* 进入支付主页
* @return
*/
@GetMapping("/")
public ModelAndView index(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("testAliPay");
return modelAndView;
}
/**
* 提交订单
* @param outTradeNo
* @param subject
* @param totalAmount
* @return
* @throws AlipayApiException
*/
@PostMapping("/order/alipay")
public String aliPay(String outTradeNo,String subject,
String totalAmount) throws AlipayApiException {
System.out.println("--------进入提交支付----------");
Order order = new Order();
order.setOut_trade_no(outTradeNo);
order.setSubject(subject);
order.setTotal_amount(totalAmount);
order.setState("支付成功");
System.out.println("order-----:"+order);
if (order.getOut_trade_no()!=null){
int i = aliPay.orderAdd(order);
}
return aliPayService.aliPay(order);
}
/**
* 查询信息
*/
@GetMapping("/paySuccess")
public ModelAndView All(){
//如果支付成功,订单就要新增到数据库
//如果取消支付,也要新增订单到数据库,取消订单-状态
//订单查询能够查出订单状态 信息
ModelAndView modelAndView = new ModelAndView();
List<Order> orders = aliPay.orderAll();
modelAndView.addObject("ordersList",orders);
modelAndView.setViewName("success");
return modelAndView;
}
/**
* 退款订单
* @param outTradeNo
* @param subject
* @return
* @throws AlipayApiException
*/
@GetMapping("/refund")
public ModelAndView refund( String outTradeNo, String subject) {
System.out.println("--------进入提交退款----------");
// 支付宝沙箱环境的gateway和appid
String gateway = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
String appId = "9021000129651143";
// 应用私钥和支付宝公钥
// 商户私钥,您的PKCS8格式RSA2私钥
String merchant_private_key ="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCWjBTeJqomgK19q8x17V2CpovMIz/kXf4ejack43RLvG4+DCzKAtDrBLd62WbqXvj5A5pLBOveBQH/I8PxTDOZCJfh3R1f2Qjz19vavhujf76nSowpaNWL9IAd29pAE2RuM3w4brCktkB7TMnfPv+kowcWIf5h2SFabC6l1tPh7l5XBvwz9A6qEJW+Rflc81WvqAvUBKJWZ1VEmH2oiy1eeLnm6ZV2Boop3YjZrNCs0qvfKcKG6kRXZCuDDCkosHfYJwaMc8a8Bn6HbB3iRuaHuBfMCcbfe6Zb9zx5DbE5PsLazNX2a+0TfpUZGMemr3L52Q3UfW6hlTPtKCdeS0YlAgMBAAECggEAJuUiLxMGOtRb/m/4by9YTX0B+UfSJgoysWofmOQ7E6YnRViX6ck4eL/LN64bbMoEwTExF9i5p67biTOQWDM70Xnq46vg/vZv3bATWTxsn51NgKM9+yTepz4QK6a1iIB6Hg6nNV1DvgpoNnLsZQU9vydvmURHGLikaVwx4R7TtzccSzkPaAgnqGI/69yfZQoU9au5NebfilGYhBSUQrr/b1Wj0mBX1UAg14Z+Cz9AOjG6of2HnvQ4sNSQskdKCyh2QD+MfdzSAffY3YCiFpo3XnMpoFp4qrVSCNFh99/ccucTsVg9mhTXGfSWnZ0ZiFUDJUVjFzm+goArS3IcUnlSsQKBgQDgIzq3ScvqoxCSH27Z/AZ9c/lGznsjQBn6yiiam6/ZdYDZlZLRL+b8cHzYDAjQRpK2iLms3gDc7fX8o/orsuYkwP108uuJ28SQlQbY96R75okiKR+5dKR1CVMkYzcsv7mGg5OeqEa50un+ffH/e9DnTzqN4L5E7cNR0jier+4v/wKBgQCr8sOzwLyOdYYG6i/LG9Z/k8mjbqUsVhajoV4pdMSOPDqn5GrAUZ1QhsSyOnrij/MUTmRT4i+flEotExS06TQT8QjW4qEYjCqK3WMon/DD4kdzniKVSrJ4xkg/YGDx5Yo3UJJvkw1qLwv2L+4BuFj1lohcFHPINZ+4cTckdifJ2wKBgD6heYHIDEQnhrTeNbKR2xppMsnXXs9N1TSgEtKJGI1SaUvjoN/1W71EjY4tZrUUU2DQOdoVOvaBRBBxnbFiTy8MAocQbkLad0XTbtNn971rgPxbs3K2JlJR5bqwQrWtaWEuGSznZsP8LMihVuMGLSzFld4ZY/GM4txVOt8U2CDvAoGAZs/HOGmb1MpskyHf5eAFR08El9YGqRXof3pzJPKOvEVDBTRMqCWknIuYfMD+zQ0pWRDuaEGsHAy8tWrdTLbLzsimcmYb0OOuZE2vhpDrkxRviLAbGY0KXbChblOgY8LN+/kPNeuFb+IlktRhyWGCv4V8jyIjgKifkdcQE5sae1UCgYEA2UL67oEe3cvDCKoQZeu28ieinRxPuqK+4f3eVQuR81rnvoN7RHcmTLWnd3Zjl8H4SnWBrODWRDX7UjTobchMsYDG33Wxxk3iX02V0QuwJM9uFd2mrGBD42wK0sESQVz/rbp88FVAcX5Or2U+0X+ex0CKhX36NBOSRrxJyB6LxZg=";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
String alipay_public_key ="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoNhWdNjR75qo3F/FnTyCEEDnmoUy7TX2Si0L0vMURfbdDAKtg7q8kO2GZnEANluqED2yf6zdXc0soiuSfMSN3GC+8nVRmBpxVJvVTXs8dkxdqEByWSS8qFB+tE2eYtd7A8D0EWzYeZZHVc5PZaqGsUz9QeFqgW/XGpgLokAzzb0rVQKq8o5cQ0HxvRcVZoHOr6/WZlPSko31MXzzr2mhH6aci+I3ofdrDexwwOC6qM4zt7Usz7gTtgU0dzu5pwvNrF+yCpcjPX2d6nAz78OMi8K8xHQYdYL5d34ecbrfjt1bq3j4zFJIRr54xdOjFIjKBC/Ye2Gp3joRvoFW8qRnuwIDAQAB";
// 创建AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(gateway, appId, merchant_private_key, "json", "UTF-8", alipay_public_key, "RSA2");
// 创建退款请求
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
request.setBizContent("{" +
"\"out_trade_no\":\""+outTradeNo+"\"," + // 商户订单号
"\"refund_amount\":\""+subject+"\"," + // 退款金额
"\"refund_reason\":\"没有原因\"," + // 退款原因
"\"out_request_no\":\"your_out_request_no\"" + // 退款请求号,保证唯一性
"}");
try {
// 发送退款请求,并获取响应
AlipayTradeRefundResponse response = alipayClient.execute(request);
System.out.println( response.getOutTradeNo());
// 判断退款是否成功
if(response.isSuccess()){
int revise = aliPay.revise(outTradeNo);
if (revise>0){
System.out.println("退款成功");
}
} else {
System.out.println("退款失败:" + response.getSubMsg());
}
} catch (AlipayApiException e) {
System.out.println("退款请求异常:" + e.getErrMsg());
}
ModelAndView modelAndView = new ModelAndView();
List<Order> orders = aliPay.orderAll();
modelAndView.addObject("ordersList",orders);
modelAndView.setViewName("success");
return modelAndView;
}
}
实体类:
package com.cskt.springboot_aliyun.domian;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* @author 26846
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true) //链式
public class Order {
/**
* 商户订单号
*/
private String out_trade_no;
/**
* 订单名称
*/
private String subject;
/**
* 付款金额
*/
private String total_amount;
/**
* 状态
*/
private String state;
/**
* 超时时间参数
*/
private String timeout_express = "10m";
/**
* 产品编号
*/
private String product_code = "FAST_INSTANT_TRADE_PAY";
}
项目结构: