现如今的应用都少不了支付业务,本篇文章教你如何将支付宝接入到你的应用中。
准备环境
若是想接入真实的支付宝支付业务,需要大量的材料审核,所以,我们以支付宝提供的沙箱环境为例进行介绍,首先下载官方DEMO,地址为 https://opendocs.alipay.com/open/270/106291/:
将JAVA版的DEMO下载好,它是一个Eclipse的项目,将其导入Eclipse打开,目录结构如下:
在AlipayConfig类中有着大量的配置:
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "";
// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
// 签名方式
public static String sign_type = "RSA2";
// 字符编码格式
public static String charset = "utf-8";
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
// 支付宝网关
public static String log_path = "C:\";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
}
我们需要对这些配置项进行配置,来到支付宝的沙箱环境管理后台 https://openhome.alipay.com/platform/appDaily.htm?tab=info:
在这里可以看到APPID和支付宝网关的相关信息,将这两项配置到AlipayConfig中:
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "2021000116684033";
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
加密方式
但凡涉及到金钱的交易,操作都是相当敏感的,安全问题绝对不容忽视,所以在其它应用与支付宝进行数据传输的过程中一定要将数据进行加密,加密一般分为两种方式:
- 对称加密
- 非对称加密
对称加密指的是对原数据(称为明文)进行加密时所使用的密钥与对密文进行解密所使用的密钥是相同的,如下所示:
这种方式有着很大的安全隐患,当发送方或接收方的某一方密钥泄露后,不法分子便可以拿着这个密钥与发送方和接收方进行无障碍的数据传输,因为它既可以通过该密钥加密数据传给接收方,也可以接收到发送方发送的数据进行解密。
\
第二种加密方式便是非对称加密,与对称加密不同的是,非对称加密在加密数据与解密数据的过程中使用的密钥并不相同,如下:
当发送方使用密钥A对明文进行加密并传输给接收方后,接收方需要使用密钥B进行解密,当接收方想要发送数据给发送方时,就是用密钥D进行加密,发送方再使用密钥C进行解密。
这样做的好处是即使某个密钥泄露了也不会发生安全问题,比如密钥B被不法分析窃取了,那么它将可以对发送方发送过来的数据进行解密,但仅限于解密,它将无法发送消息给发送方,因为发送消息使用的是密钥D,只有四个密钥都掌握了,才能够在发送方和接收方之间无障碍地通信。
\
支付宝使用的便是非对称加密方式:
第三方应用在给支付宝发送数据前会使用私钥A进行加密,这个私钥A是不会对外暴露的,但是第三方应用会提供一个公钥A给支付宝,此时支付宝便可以使用这个公钥对数据进行解密;同理,支付宝在发送数据给应用时也会使用私钥B对数据进行加密,并提供一个公钥B给应用让其能够进行解密;但是支付宝的私钥是没有人能够窃取到的,所以保证了支付的安全。
为了支付流程的绝对安全,支付宝有一个签名环节,当数据准备传输时会使用私钥对其进行签名:
当前数据和签名是对应的,假如有人拦截了这串数据并将金额进行了修改,那么支付宝收到数据之后,便会对数据进行验签,验签过程就能够发现数据被篡改了,因为签名和数据已经不对应了,而不法分子是无法成功得到自己修改后的数据对应的签名的。
接下来就对这四把钥匙进行配置,仍然来到沙箱后台:
点击RSA2密钥后面的 设置/查看
:
选择公钥,并点击支付宝密钥生成器:
此处便可下载支付宝的密钥生成器,下载完成后安装一下,然后打开:
选择RSA2和PKCS8,并点击生成密钥,应用的私钥需要妥善保管,然后将下方的应用公钥告知支付宝:
将其粘贴到此处,点击保存设置:
此时支付宝便会将它的公钥告诉你,将这些内容都配置到AlipayConfig中:
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "2021000116684033";
// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDA+HnzPriAFTLYuk/uHR1wPooA4FdkahthRa/rq/ZmzOgZ+Gn3HmET1qYy7DyOWeGIKCiad7Lpb/a6idRHtEADha2/NTQMgUC+cnPfFnliC97LPwl6imik84GO5XZ0yxNvqzHIurIXBEJegfSSm1mKuDU6DavGSQlRUKDSiLcL/EOKJyWfrcEeZWLy5TbZccdiurb7Gm5wWeaYUSm0qSpZaxrhhkB24UzFEc9DZZvhmtFyZ+WzeImofX9254pNIKXgeDpVO0e2KKXdcdPVpL0pzg/3RjPaZhPcgrOwVLum8Nj8haA0HjkJqbI5JzWU6XiKi889ihYeI/imETXz+wgDAgMBAAECggEAMKy8fhndChnOyJI+ZS6c5VoxD0WHZcHKBEBCvqySq52WEi7x866LCCkFpSSnpbSQSfrvOv9kdrOSRb1MeYXC++B1UhzGcz0LKr7N8YDGv2+FFDljV7Cf8rOlg3jn50/uKCXDmgFVuK6PWy1mlrBu5qnOa0VVhd+YZRV0a4amvXPFDfKisSxMI1+oIgqC9LmyMz5gDhahlFKmpI9EHN0zno/eycw6xo/aCXagAmPU4UMOck1o9S1PhRQvyRlWSll9xuGWiimUi/a1j61hNTkD6XLLnH6cewBeGHKr9mOKBT9PywEj1qeX50AHHaVbX1HlUnOLlRuldYMO+r/B7GKmkQKBgQDoExEuna52PsNbp0SmTid+lqOoVAr5oi5xYABiXa0VruOvR7ZEikWzk1uq4deTwzzWpqy6S1ZHw/j8wxQ1SweZy187W6cFFAbJ4hsZFLE7m95NMGTGmgP0M+WbmDElAQmrQV6cYOXl09rU2d0M1QAqMNItQlLtBwLaT4zk4PZO2wKBgQDU3WBBzvSSQP83OrzHv4um9BDvhLeX8aUOEGjNeGIcYcCe0YABVQVEF+q9rWR6e1C+XRnY50kh0KNYa8xHpglfk9RyvK+k5kBfywnnq2ArbeaDxm2TcjRMhkzWyeVMFgRWmAfzzNk7ZSJv8+rjgEJvETDENftEY8r2Q1VuE9SP+QKBgF583OMI6i5UkX+wk7/OVEAzHwD67tkCkjww5RcnosAQS71iyjAPyB88IPdrKjWMKSoQBIV5BPEFNkvbNVAZc0fHyMdHIrJrm/P4biYBCcQGSzVMPcuqi2+S7aozBddWG9SxMc8jmJbBcfh1l42Q75c992Tb+x1sXFn8R5Ysjbw/AoGAM/zVM31eEhI5wr1fudE4RFA7iqP5SuzDiQnM7tHF9HSTXLaB8tFW9eh5dlXQwnE3qSaH14e1PsL8Ae5h9+W/SE6MhnE63KU3d63Y/3HFjRXMRMbDoE02JLJwNc0daVW/PX7oAk03iOAMZxdFeMascv/ZzzH36h4NRdPwG3BQa9ECgYEAxDcRdAHmpGFGenqqT8Z5eugHrSWz1bCSA9KrWZ7ymIsPfqk96/UpQDD/grB06uIrPahenFqOlWo9KEWl7+nHtPq6RzHHWgDcXKnjpeT4KxqmmTmJt3Vshb4z4znsHV1/wLuPtDC3hV8mDDoXVlpZ6ohgf3niFExQL4oQwT4Vtmo=";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlt4bnL/TPec6FVf0+4v5SE+qYADh5iKPyLYhMXsKPyfETGkxK36fzOyp/lACX7AGLejGGjte7lE964GvfLXyuG0ecd6WWuLOepWZKlgi1XMiMzuZj/Gsb5aqvKPvi2/nWTlTUCceQ2sIpFtbnxQ29Aiq9b36qCIwHSCHH96SJRqT8DmiBTsGgAOEnJzy1knG/mPecD5jwIYP4NtLa0G6Px3EVz7ZFhZmR5LjxaqUpT/hIOG4Umjlkixf6g4Ga7rXXw8kzZBcSYTKq9LeBWqGGP1gt1dYv9m3ADAvd+wJn8U9T6veuawtExMSwyJkI/LzuzxqyaR8qB863C/3Mh+bEwIDAQAB";
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
}
现在就可以启动这个DEMO项目了,启动完成后便可以对支付进行测试:
点击付款会要求登录:
登录信息仍然在沙箱后台中:
最后输入支付密码即可支付成功:
内网穿透
在AlipayConfig配置类中有这么两项配置:
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
它们分别表示支付完成后需要支付宝跳转的页面和接收支付宝响应数据的接口,由于我们处于内网,支付宝是无法找到我们的电脑的,当然也就访问不到我们的应用,而且注释里也说了这两项配置必须外网可以正常访问,所以我们需要使用到内网穿透。
\
支持内网穿透的工具有很多,这里以续断为例,新用户会赠送一条隧道,登录到后台系统,点击安装客户端:
安装完成后再点击建立隧道,输入相关信息:
此时我们就能够得到一个域名:
通过它就能够访问到我们的电脑了,所以修改AlipayConfig中的配置:
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://00ocvc6g0e.52http.tech/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://00ocvc6g0e.52http.tech/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
SpringBoot整合支付宝
创建一个SpringBoot应用,并引入依赖:
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.16.2.ALL</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
编写一个工具类用于生成页面模板:
@ConfigurationProperties(prefix = "alipay")
@Component
@Data
public class AlipayTemplate {
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "2021000116684033";
// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDA+HnzPriAFTLYuk/uHR1wPooA4FdkahthRa/rq/ZmzOgZ+Gn3HmET1qYy7DyOWeGIKCiad7Lpb/a6idRHtEADha2/NTQMgUC+cnPfFnliC97LPwl6imik84GO5XZ0yxNvqzHIurIXBEJegfSSm1mKuDU6DavGSQlRUKDSiLcL/EOKJyWfrcEeZWLy5TbZccdiurb7Gm5wWeaYUSm0qSpZaxrhhkB24UzFEc9DZZvhmtFyZ+WzeImofX9254pNIKXgeDpVO0e2KKXdcdPVpL0pzg/3RjPaZhPcgrOwVLum8Nj8haA0HjkJqbI5JzWU6XiKi889ihYeI/imETXz+wgDAgMBAAECggEAMKy8fhndChnOyJI+ZS6c5VoxD0WHZcHKBEBCvqySq52WEi7x866LCCkFpSSnpbSQSfrvOv9kdrOSRb1MeYXC++B1UhzGcz0LKr7N8YDGv2+FFDljV7Cf8rOlg3jn50/uKCXDmgFVuK6PWy1mlrBu5qnOa0VVhd+YZRV0a4amvXPFDfKisSxMI1+oIgqC9LmyMz5gDhahlFKmpI9EHN0zno/eycw6xo/aCXagAmPU4UMOck1o9S1PhRQvyRlWSll9xuGWiimUi/a1j61hNTkD6XLLnH6cewBeGHKr9mOKBT9PywEj1qeX50AHHaVbX1HlUnOLlRuldYMO+r/B7GKmkQKBgQDoExEuna52PsNbp0SmTid+lqOoVAr5oi5xYABiXa0VruOvR7ZEikWzk1uq4deTwzzWpqy6S1ZHw/j8wxQ1SweZy187W6cFFAbJ4hsZFLE7m95NMGTGmgP0M+WbmDElAQmrQV6cYOXl09rU2d0M1QAqMNItQlLtBwLaT4zk4PZO2wKBgQDU3WBBzvSSQP83OrzHv4um9BDvhLeX8aUOEGjNeGIcYcCe0YABVQVEF+q9rWR6e1C+XRnY50kh0KNYa8xHpglfk9RyvK+k5kBfywnnq2ArbeaDxm2TcjRMhkzWyeVMFgRWmAfzzNk7ZSJv8+rjgEJvETDENftEY8r2Q1VuE9SP+QKBgF583OMI6i5UkX+wk7/OVEAzHwD67tkCkjww5RcnosAQS71iyjAPyB88IPdrKjWMKSoQBIV5BPEFNkvbNVAZc0fHyMdHIrJrm/P4biYBCcQGSzVMPcuqi2+S7aozBddWG9SxMc8jmJbBcfh1l42Q75c992Tb+x1sXFn8R5Ysjbw/AoGAM/zVM31eEhI5wr1fudE4RFA7iqP5SuzDiQnM7tHF9HSTXLaB8tFW9eh5dlXQwnE3qSaH14e1PsL8Ae5h9+W/SE6MhnE63KU3d63Y/3HFjRXMRMbDoE02JLJwNc0daVW/PX7oAk03iOAMZxdFeMascv/ZzzH36h4NRdPwG3BQa9ECgYEAxDcRdAHmpGFGenqqT8Z5eugHrSWz1bCSA9KrWZ7ymIsPfqk96/UpQDD/grB06uIrPahenFqOlWo9KEWl7+nHtPq6RzHHWgDcXKnjpeT4KxqmmTmJt3Vshb4z4znsHV1/wLuPtDC3hV8mDDoXVlpZ6ohgf3niFExQL4oQwT4Vtmo=";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlt4bnL/TPec6FVf0+4v5SE+qYADh5iKPyLYhMXsKPyfETGkxK36fzOyp/lACX7AGLejGGjte7lE964GvfLXyuG0ecd6WWuLOepWZKlgi1XMiMzuZj/Gsb5aqvKPvi2/nWTlTUCceQ2sIpFtbnxQ29Aiq9b36qCIwHSCHH96SJRqT8DmiBTsGgAOEnJzy1knG/mPecD5jwIYP4NtLa0G6Px3EVz7ZFhZmR5LjxaqUpT/hIOG4Umjlkixf6g4Ga7rXXw8kzZBcSYTKq9LeBWqGGP1gt1dYv9m3ADAvd+wJn8U9T6veuawtExMSwyJkI/LzuzxqyaR8qB863C/3Mh+bEwIDAQAB";
// 服务器[异步通知]页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://00ocvc6g0e.52http.tech/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://00ocvc6g0e.52http.tech/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
// 签名方式
private String sign_type = "RSA2";
// 字符编码格式
private String charset = "utf-8";
// 支付宝网关; https://openapi.alipaydev.com/gateway.do
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
public String pay(PayVo vo) throws AlipayApiException {
//AlipayClient alipayClient = new DefaultAlipayClient(AlipayTemplate.gatewayUrl, AlipayTemplate.app_id, AlipayTemplate.merchant_private_key, "json", AlipayTemplate.charset, AlipayTemplate.alipay_public_key, AlipayTemplate.sign_type);
//1、根据支付宝的配置生成一个支付客户端
AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl,
app_id, merchant_private_key, "json",
charset, alipay_public_key, sign_type);
//2、创建一个支付请求 //设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(return_url);
alipayRequest.setNotifyUrl(notify_url);
//商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no = vo.getOut_trade_no();
//付款金额,必填
String total_amount = vo.getTotal_amount();
//订单名称,必填
String subject = vo.getSubject();
//商品描述,可空
String body = vo.getBody();
alipayRequest.setBizContent("{"out_trade_no":"" + out_trade_no + "","
+ ""total_amount":"" + total_amount + "","
+ ""subject":"" + subject + "","
+ ""body":"" + body + "","
+ ""product_code":"FAST_INSTANT_TRADE_PAY"}");
String result = alipayClient.pageExecute(alipayRequest).getBody();
//会收到支付宝的响应,响应的是一个页面,只要浏览器显示这个页面,就会自动来到支付宝的收银台页面
System.out.println("支付宝的响应:" + result);
return result;
}
}
@Data
public class PayVo {
private String out_trade_no; // 商户订单号 必填
private String subject; // 订单名称 必填
private String total_amount; // 付款金额 必填
private String body; // 商品描述 可空
}
配置信息记得修改为自己的配置。
现在有一个页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/pay?orderSn=12345">去支付</a>
</body>
</html>
内容非常简单,有一个超链接,点击它便可以进行订单支付,并且会携带当前订单的订单号,来模拟一个真实的订单支付业务。
编写一个Controller:
@Controller
public class PayController {
@Autowired
private AlipayTemplate alipayTemplate;
@GetMapping({"/","/index"})
public String toIndex(){
return "index";
}
@GetMapping(value = "/pay",produces = "text/html")
@ResponseBody
public String pay(@RequestParam String orderSn) throws AlipayApiException {
// 通过orderSn查询订单的详细信息
PayVo payVo = new PayVo();
payVo.setBody("暂无"); // 订单备注
payVo.setOut_trade_no(orderSn); // 订单号
payVo.setSubject("测试标题"); // 订单标题
payVo.setTotal_amount("1000"); // 订单金额
// 返回的是一个支付页面,直接返回即可
return alipayTemplate.pay(payVo);
}
}
按照真实的业务场景,页面会传递给我们一个订单号,然后拿着这个订单号去数据库查询指定订单的详细信息,并将这些信息设置到PayVo中,这里就简单模拟一下。当调用alipayTemplate的pay方法时,该方法会渲染一个form表单,并通过script脚本自动提交,所以我们只需将该方法的返回值直接作为页面内容返回出去即可。
\
启动项目,点击去支付即可跳转至支付宝的支付页面:
这些内容也确实是我们自己设置的,当输入支付密码成功支付后,我们应该让其自动跳转至支付成功后的页面,修改AlipayTemplate类中的同步跳转地址:
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://localhost:9090/index";
这里也简单模拟一下,让其支付成功后跳转回首页即可。
\
若是想知道支付后的具体信息,也可以通过配置异步通知url来实现:
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://00ocvc6g0e.52http.tech/notify";
需要注意异步通知的url一定要让外网能够访问,否则支付宝是无法发送请求给我们的。
接下来就需要处理这个请求:
@PostMapping("/notify")
public String notifyPay(HttpServletRequest request) {
Map<String, String[]> map = request.getParameterMap();
for (String key : map.keySet()) {
System.out.println(key + "===>" + request.getParameter(key));
}
return "success";
}
这个方法的返回值一定要是success,因为支付宝只有接收到success才会认为应用已经接收到了支付成功的通知,否则支付宝会不停地向应用发送通知,以下便是支付宝提供给我们的所有参数:
gmt_create===>2021-08-13 17:40:35
charset===>utf-8
gmt_payment===>2021-08-13 17:40:45
notify_time===>2021-08-13 17:40:47
subject===>测试标题
sign===>I2FtU9GmmHWQRExJ9q+wYLhOe/50HqFMcQLHLVBQalIGrK3FlEcflCnDO1coFd+Feqp0Pr+xh5EDsyi9aU4fT3huKQhENceLWVNiEiyoV5oykT/73W3FKMbwd8fS4YB1zTiw/tzY0KMNFFJU5p1hgWGioksFmpM11FUGgb6DeDv2L+JJ3tglBmRmVNTd2RCKM6xKKyWkuDenHDfeVLbjjNwEUtAyx6rKCLmEal7R1uFx7pg4gC/gekCWSLOu7Jsv2N/06uvv88F1PlUSJA8vrXyyrKAhA0MATOq4Rx/Yqvvlr3uJMQ/pj7IrG8OgPdoaqnBC2qaBMs3mVtXgwNP0lQ==
buyer_id===>2088622955266335
body===>暂无
invoice_amount===>1000.00
version===>1.0
notify_id===>2021081300222174046066330512882319
fund_bill_list===>[{"amount":"1000.00","fundChannel":"ALIPAYACCOUNT"}]
notify_type===>trade_status_sync
out_trade_no===>123456789
total_amount===>1000.00
trade_status===>TRADE_SUCCESS
trade_no===>2021081322001466330501314710
auth_app_id===>2021000116684033
receipt_amount===>1000.00
point_amount===>0.00
app_id===>2021000116684033
buyer_pay_amount===>1000.00
sign_type===>RSA2
seller_id===>2088621955014522
通过这些属性即可对后续的业务进行相关的操作,关于这些属性的详情可以参照支付宝的官方文档:https://opendocs.alipay.com/open/270/105902
\
为了防止出现用户一直没有付款,导致订单超时关闭之后,用户再去付款的问题,可以为支付功能设置一个超时时间,只需修改AlipayTemplate类中setBizConent的内容即可:
alipayRequest.setBizContent("{"out_trade_no":"" + out_trade_no + "","
+ ""total_amount":"" + total_amount + "","
+ ""subject":"" + subject + "","
+ ""body":"" + body + "","
+ ""timeout_express":"1m","
+ ""product_code":"FAST_INSTANT_TRADE_PAY"}");
添加 ""timeout_express":"1m"
,此时如果打开付款页面后超过1分钟,将无法继续付款。