项目结构:
项目依赖:
<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>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.0.0</version>
</dependency>
配置信息类:
package com.learn.alipay;
/**
* @author honor
*/
public class AliPayConfig {
// 应用ID,您的APPID
public static String APP_ID = "2021000117610611";
// 商户私钥 就是生成的运用私钥
public static String APP_PRIVATE_KEY = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCXJ4bpE0Ppa2muWjmUcKKcnbxmU8QwMt0EulqvtaiAggvrQgANViP3B/BQGhlbypagoJjKIhWkmhIB36FngiUnGtnw2PkSLvhlHlFP+p3z1pGX4qaOeEqcUhkL8ZX14eBNWolFb7qKtwABj3grHMkzR59H2bVnAQHVJFTYT946rKFZhoooReSXzviixp1EI1CDo7LGbH96SPlyrb1IInG2bV7el9OrKvVnuCE1mQwnzfn4Oc945yuRvg7obVVTyiFoAAfiQqaQ1/oSgzU90cVNJgIZ15Tzi5Sa8OJR79zo9RfdMCr7Xmj/bLuPz2CqwEPkv5K0XjPDsvdbtFk7xP0DAgMBAAECggEALAk696pCLb26Uy47+i/6X/BgU9txm60l0NvN0cT1q0K34DkhNMF0xuJMM7n2y1QxH+jJupHFhmfQeTVCm5pB4qui9NTxc0e13BfCDq/v1nsbfYlthrIq4nHUlDM0wialJ0QKG+2aBhGccdfvZXgEceka0V7ux2x2sTbddQuHrcXscbSdlzHNrxYHxwy4Ya7auBzgTLyY4PuKCkdhPMV7zpgNFF6PRLRZhOE22VchDjCbz6G42Mf7W4EXF0eWnqF0hsNrfrooOMALRg1aNNjDqWF1OxCH9Jk0HQccJ6/qvkrTGV7kwV51zqbq/2hVmdBqlcKNA+BeoLFh3xXFGYI32QKBgQDS902vShBoHsQE80Vc3vshxGUVbyDfM5c7ZAygbeXgsTy9jiQszKYpH0tELw1n+In/jNEOYMPZpLJeu3+/x6NaXw6mxpbIsWzn+L0vtYjdVDdIdDzuLMRznymKDwXcGAOTziaJgmPdN6vddd3WxpCdAE0hgSrgydtcrKGVwG6J1wKBgQC3a6/32GlPWy/W22+4r9LBJmleC/hoTZt1Oh6UD70MUdiA3HM6RhnhD/Q/hvD5YAj/A+sucZJuQ5ognElIgHjYmLfa9WHy4meZAuCo8nM98WHWqxdYmxQwVSde7YtE/kuV/wBuXvbUYiac05mzzY2YyOREJKk24p6LntBrBm24tQKBgFr/u62px+vxoWH1QW0u7aqCGYwmVEqS6V//5wZogSjrqqSlJGuClwXT7tZpaWH4riXiKucFzFUcGqiMPi2OQqMfr6U2siG9jpl9DLYAmxnFUtdY9FNUUiUBeZyIoGFwplJiMPNNoB/y/JpZVihnnEdsstiJ6+HskEeoW0bKK6QfAoGAYjGPcgL0Vdx+Xur5A4l1LZwvun50DPrHJ9nmduN6FLdYTZw3P9I5lohg/QVzyj1Ec6mYZTO97bPZNm4UuXC1wVb4zoqhVlMonPyyYx/w3A92jmLny7Kx+zILMsG+1j/BHVr30x6Zy5eEDl8loOGBVXLu6SArSsvFjv+FmlZFtSUCgYBJKx2tIhfoBlowAIs6cEFV/d3UCw34yfrITc4iQJ/R8LVmhW0BRGSB9UPIjg7dpiE3kc3KDk135v6ssrP4j0wzjPLkHDRgGBYn12jv0aX31KK/yVhnOqG93UPXA59daw+3r+wPv75wcF4h3EOBjDVlxk3CrErLHWsY484i+oQ8KQ==";
// 支付宝公钥
public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp4Ypy2nDfxgtUL23h+2mlaHJDCvT4IoHFcbQ4Jck/E/YYc6HgLIWgtbsalxpXUioz3v/t5k+ULw+gvn8X0QcGBA5Q5SJFlNc+aVrB8P/TACOfoKrS11IQ9/ovjKVfPRswBVJJOsIOnKXy6ts8U3CX+UI6te8u+2VC8q5X7GIFstFaUxqGVaePLuLmjO3/7KghYqzO+aeSkCxV3bbwMh+mN/CpylQhWHXqCL0e7PNy7ZsS2Hagn0ZoRgKT9VMa+IeNZWEDUkxyL9otcQs27+GiOuyji73IViArnjuXRY647ORhRJpjVojx3C4Ut6Pvrh5gn9PshAgpwC8MdhZulH28QIDAQAB";
// 服务器异步通知页面路径 需http://格式的完整路径,必须外网可以正常访问
public static String notify_url = "http://localhost:8080/notify_url";
// 页面跳转同步通知页面路径 需http://格式的完整路径,必须外网可以正常访问(其实就是支付成功后返回的页面)
public static String return_url = "http://localhost:8080/return_url";
// 签名方式
public static String sign_type = "RSA2";
// 字符编码格式
public static String CHARSET = "UTF-8";
// 支付宝网关,这是沙箱的网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
}
支付宝订单支付接口
package com.learn.alipay;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.Calendar;
/**
* @author honor
*/
@Controller
public class PayController {
//支付宝支付确认付款跳转页面
@RequestMapping("/order")
public void oderConfirm(HttpServletRequest request, HttpServletResponse response) {
//虚拟一个订单,将其信息定义如下
String title = "支付订单";
String total = "300";
String message = "这是一个新的订单";
//生成订单号
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String orderSn = simpleDateFormat.format(Calendar.getInstance().getTime());
AlipayClient alipayClient=new DefaultAlipayClient(
AliPayConfig.gatewayUrl,
AliPayConfig.APP_ID,
AliPayConfig.APP_PRIVATE_KEY,
"json",
AliPayConfig.CHARSET
,AliPayConfig.ALIPAY_PUBLIC_KEY,
AliPayConfig.sign_type);
//设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AliPayConfig.return_url);
alipayRequest.setNotifyUrl(AliPayConfig.notify_url);
//商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no = orderSn;
//付款金额,必填
String total_amount = total;
//订单名称,必填
String subject = title;
//商品描述,可空
String body = message;
alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\""
+ total_amount + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
AlipayTradePagePayResponse alipayResponse = null;
try {
alipayResponse=alipayClient.pageExecute(alipayRequest);
response.setContentType("text/html;charset=" + AliPayConfig.CHARSET);
response.getWriter().write(alipayResponse.getBody());//直接将完整的表单html输出到页面
} catch (AlipayApiException e) {
e.printStackTrace();
}
catch (Exception e){
System.out.println("error");
e.printStackTrace();
}
}
@GetMapping("/notify_url")
public String notify_url(){
return "notify_url";
}
@GetMapping("/return_url")
public String return_url(){
return "return_url";
}
}
需要的页面:
notify_url.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>支付宝异步通知!</h1>
</body>
</html>
return_url.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>支付成功!</h1>
</body>
</html>
测试:
-
浏览器输入:
localhost:8080/order
即可出现下面页面
-
使用沙箱支付宝进行扫码支付
-
进行手机支付
支付密码默认111111 -
出现这个页面说明支付成功