支付宝支付
目前最为主流第三方支付平台
申请支付宝账号,详情参考:https://opendocs.alipay.com/open/200/105310?pathHash=7f6d049a
使用电脑网页支付,详情参考:https://opendocs.alipay.com/open/270/105898?pathHash=b3b2b667
支付宝的支付相关接口:
支付宝支付的实现步骤:
1.依赖jar
xml
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.39.175.ALL</version>
</dependency>
2.封装工具类
内部把支付宝常用的操作封装成方法
在 SDK 调用具体的接口前需要进行 alipayClient 对象初始化。alipayClient 对象只需要初始化一次,后续调用不同的接口都可以使用同一个 alipayClient 对象。
java
public class AlipayUtil {
/**
* 商户签约时,对应的应用id*/
private static final String APP_ID="";
/**
* 商户签约时,自己生成的私钥(RSA)*/
private static final String PRIVATE_KEY="";
/**
* 商户签约时,支付包提供的公钥(RSA)*/
public static final String ALIPAY_PUBLIC_KEY="";
private static AlipayClient client;
static {
AlipayConfig alipayConfig = new AlipayConfig();
//支付宝网关(固定)
alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
//APPID 即创建应用后生成。
alipayConfig.setAppId(APP_ID);
//开发者私钥
alipayConfig.setPrivateKey(PRIVATE_KEY);
//参数返回格式,只支持 JSON(固定)
alipayConfig.setFormat("json");
//编码集,支持 GBK/UTF-8
alipayConfig.setCharset("UTF-8");
//支付宝公钥
alipayConfig.setAlipayPublicKey(ALIPAY_PUBLIC_KEY);
//生成签名字符串所使用的签名算法类型,目前支持 RSA2 算法。
alipayConfig.setSignType("RSA2");
//构造client
try {
client = new DefaultAlipayClient(alipayConfig);
} catch (AlipayApiException e) {
throw new RuntimeException(e);
}
}
/**
* 创建支付
* @param title 订单标题
* @param money 订单支付金额
* @param no 订单号 唯一
* @return 对应的支付页面*/
public static String createPay(String title,String no,double money){
//1.创建接口对应的请求对象
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
//2.设置请求参数
//支付成功的回调接口地址 -要求公网可访问
request.setNotifyUrl("http://y192580h27.goho.co/pay/alipay/cb");
//设置用户支付成功之后跳转页面 --
request.setReturnUrl("http://y192580h27.goho.co/paysuccess.html");
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
// 设置订单标题
model.setSubject(title);
// 设置产品码
model.setProductCode("FAST_INSTANT_TRADE_PAY");
// 设置商户订单号
model.setOutTradeNo(no);
// 设置订单总金额
model.setTotalAmount(money+"");
request.setBizModel(model);
//3.执行请求 获取响应
AlipayTradePagePayResponse response = null;
try {
response = client.pageExecute(request, "POST");
if(response.isSuccess()){
//请求成功 返回支付页面
return response.getBody();
}
} catch (AlipayApiException e) {
throw new RuntimeException(e);
}
return null;
}
/**
* 查询支付状态
* @param no 订单号
* @return 支付结果*/
public static String queryPay(String no){
//1.创建请求对象
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
//2.设置请求参数
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
// 设置订单支付时传入的商户订单号
model.setOutTradeNo(no);
request.setBizModel(model);
//3.执行请求 获取响应
try {
AlipayTradeQueryResponse response = client.execute(request);
if(response.isSuccess()){
return response.getTradeStatus();
}
} catch (AlipayApiException e) {
throw new RuntimeException(e);
}
return null;
}
/**
* 发起退款
* @param no 订单号
* @param money 退款金额
* @return 是否退款成功*/
public static boolean refoundPay(String no,double money){
//1.创建请求对象
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
//2.请求参数赋值
AlipayTradeRefundModel model = new AlipayTradeRefundModel();
// 设置商户订单号
model.setOutTradeNo(no);
// 设置退款金额
model.setRefundAmount(money+"");
request.setBizModel(model);
//3.执行请求 获取响应
try {
AlipayTradeRefundResponse response = client.execute(request);
if(response.isSuccess()){
return "Y".equals(response.getFundChange());
}
} catch (AlipayApiException e) {
throw new RuntimeException(e);
}
return false;
}
/**
* 关闭支付
* 针对未支付的才可以关闭
* @param no 订单号
* @return 订单关闭是否成功
* */
public boolean closePay(String no){
//1.创建对应的请求对象
AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();
//2.设置请求参数
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", no);
request.setBizContent(bizContent.toString());
//3.执行请求 获取响应
try {
AlipayTradeCloseResponse response = client.execute(request);
if(response.isSuccess()){
return response.getMsg().equals("Success");
}
} catch (AlipayApiException e) {
throw new RuntimeException(e);
}
return false;
}
/**
* 获取对账单的url地址
* @param date 账单日期 T+1
* @return 返回账单的下载地址*/
public static String queryBillUrl(String date){
//1.创建请求对象
AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest();
//2.设置请求参数
AlipayDataDataserviceBillDownloadurlQueryModel model = new AlipayDataDataserviceBillDownloadurlQueryModel();
//账单类型
model.setBillType("trade");
//账单日期
model.setBillDate(date);
request.setBizModel(model);
//3.执行请求 获取响应
try {
AlipayDataDataserviceBillDownloadurlQueryResponse response = client.execute(request);
if(response.isSuccess()){
return response.getBillDownloadUrl();
}
} catch (AlipayApiException e) {
throw new RuntimeException(e);
}
return null;
}
}
需要实现2个回调通知:
1.支付成功的异步回调
官网地址:https://opendocs.alipay.com/open/270/105902?pathHash=d5cd617e
对于 PC 网站支付的交易,在用户支付完成之后,支付宝会根据 API 中商家传入的 notify_url,通过 POST 请求的形式将支付结果作为参数通知到商家系统。
接口实现:
java
@Slf4j //日志
@Controller
public class PayCallBackController {
/**
* 支付宝支付成功的回调接口*/
@PostMapping("/pay/alipay/cb")
public void alipayCb(HttpServletRequest request, HttpServletResponse response) throws IOException {
//1.获取回调的内容
String no=request.getParameter("out_trade_no");
String status=request.getParameter("trade_status");
log.info("支付宝回调,订单号={},支付状态={}",no,status);
//2.实现充值成功的操作
//3.返回成功
response.getWriter().println("success");
}
}
同时:
因为回调接口,需要公网才可以访问,所以使用内网穿透工具,例如:花生壳
2.支付成功的页面回调
页面代码:
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>千锋教育</title>
</head>
<body>
<h1>恭喜你,支付已完成,请查阅你的余额!</h1>
</body>
</html>
设置页面回调地址:
java
//设置用户支付成功之后跳转页面 --
request.setReturnUrl("http://y192580h27.goho.co/paysuccess.html");
3.运行测试
java
@Test
public void t1(){
//创建支付
System.err.println(AlipayUtil.createPay("来千锋学Java","202408150002",0.01));
}
把接口返回的结果放到一个网页中
访问pay.html网页,就可以看到下面的支付页面
然后用户扫码支付
点击进行支付,页面会自动变化
会自动跳转到自定义的支付成功页面
同时查看后台的运行日志,会发现,支付宝已完成支付成功回调
pay.html网页,就可以看到下面的支付页面
[外链图片转存中...(img-WI2USo27-1723789642285)]
然后用户扫码支付
[外链图片转存中...(img-6sJBJa0O-1723789642286)]
点击进行支付,页面会自动变化
[外链图片转存中...(img-ZNEI6Ggm-1723789642287)]
[外链图片转存中...(img-xQ0jzT4i-1723789642288)]
会自动跳转到自定义的支付成功页面
[外链图片转存中...(img-NBqVR9v6-1723789642288)]
同时查看后台的运行日志,会发现,支付宝已完成支付成功回调