SpringBoot接入支付宝支付(一)

1 开发前的准备

1.1 密钥的的生成

先去官网下载支付宝平台助手,下载地址:小程序文档 - 支付宝文档中心 ,下载并安装平台助手,使用平台助手生成应用公钥应用私钥

1.2 创建应用配置账号信息

沙箱账号申请地址:登录 - 支付宝

正式账号申请地址:登录 - 支付宝

为了保证交易双方(商户和支付宝)的身份和数据安全,开发者在调用接口前,需要配置双方密钥,对交易数据进行双方校验。密钥包含应用私钥(APP_PRIVATE_KEY)和应用公钥(APP_PUBLIC_KEY)。生成密钥后,开发者需要在开放平台开发者中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY)应用在代码中,对请求内容进行签名。

注意:当设置了应用公钥后,才可以查看支付宝公钥

1.3 开发需要的参数

  • appid: 应用ID

  • private_key:由支付宝开发平台助手生成的应用私钥

  • alipay_public_key:是支付宝公钥,支付宝开发平台助手生成的应用公钥

    这里特别需要注意的是alipay_public_key是蚂蚁金服开放平台获取的支付宝公钥,不是本地平台助手申请的应用公钥,不要弄错了,否则会签名失败

2 支付介绍

2.1 支付逻辑

  1. 用户在商户系统下单

  2. 商户系统调用支付宝的支付接口,发起支付请求

  3. 用户登录,选择支付渠道,输入支付密码

  4. 支付宝get请求returnUrl, 返回同步通知参数

  5. 支付宝post请求notifyUrl,返回异步通知参数

  6. 商户可以通过 交易查询接口查询交易状态

  7. 如果用户或者商户想退款,可以发起退款请求

  8. 如果退款可以调用退款查询接口,查询退款信息

  9. 下载对账单

2.2 关于支付宝中同步通知和异步通知的理解

在调用支付宝接口的时候,确认支付以后我们需要请求两个通知接口:同步通知(returnUrl)和异步通知(notifyUrl)。刚开始看文档的时候也不是很清楚这两个接口有什么区别,从流程图里面描述到的是,同步通知(returnUrl)是GET请求,“支付是否成功以异步通知为准”。异步通知(notifyUrl)是POST请求,但是图里面还是说了一句“支付是否成功以查询接口返回为准”。所以最终支付是否成功还是要看查询接口的返回结果,那同步通知和异步通知有什么用呢?

个人的理解是:只要同步通知和异步通知返回成功一般情况下其实已经可以认为支付成功了,我们就已经可以进行下一步的操作了。同步通知用于前端界面及时反馈给用户,告诉用户支付操作已经完成,然后让前端页面跳转的需要跳转的页面;异步通知用于后台业务逻辑的处理。当然为了保险,后面最好还是调用查询接口,对支付账单进行核对。

001

需要注意的问题:

  1. returnUrlreturnUrl这两个的接口地址必须放在公网上,需要外网能访问到,否则支付宝是调不到这两个接口的。本地测试可以使用 natapp 做内外网穿透。
  2. 经过测试异步通知和同步通知没有很明确的先后顺序,同步通知并不一定在异步通知之前被调用。

2.3 重点看官方的Demo

其实官方的Demo已经写的很详细了,每个接口的调用已经给出了详细的演示。所以后面的代码基本也是照着官方的Demo来的。

### Spring Boot集成支付宝支付功能实现指南 #### 1. 添加依赖项 为了使Spring Boot应用程序能够处理支付宝支付请求,需在`pom.xml`文件中引入必要的依赖库。通常情况下,这涉及到阿里巴巴官方提供的SDK。 ```xml <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>LATEST_VERSION</version> </dependency> ``` 注意替换`LATEST_VERSION`为实际发布的最新版本号[^1]。 #### 2. 配置应用属性 编辑项目的`application.yml`或`application.properties`来定义与支付宝交互所需的关键参数,比如商户ID(app_id),私钥(private_key), 支付宝公钥(alipay_public_key)等安全凭证信息: ```yaml alipay: app-id: YOUR_APP_ID private-key: YOUR_PRIVATE_KEY public-key: ALIPAY_PUBLIC_KEY gateway-url: https://openapi.alipay.com/gateway.do charset: UTF-8 sign-type: RSA2 ``` 上述配置中的字段应根据实际情况填写相应的值。 #### 3. 创建服务类 创建个新的Java类用于封装调用支付宝API的方法逻辑。此类可以命名为`AlipayService.java`,并在此内部编写具体业务流程代码,如发起支付请求、查询订单状态等功能模块。 ```java @Service public class AlipayService { @Value("${alipay.app-id}") private String appId; // ...其他成员变量... /** * 构建支付请求对象. */ public AlipayTradePagePayRequest buildPaymentRequest(Order order){ AlipayClient client = new DefaultAlipayClient( "https://openapi.alipay.com/gateway.do", appId, privateKey, "json", "UTF-8", publicKey, "RSA2"); AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); JSONObject bizContent = new JSONObject(); bizContent.put("out_trade_no", order.getOrderId()); bizContent.put("total_amount", order.getTotalAmount()); bizContent.put("subject", "商品描述"); request.setBizContent(bizContent.toJSONString()); return request; } } ``` 此部分展示了如何通过构建`AlipayClient`实例以及设置交易详情(`biz_content`)的方式向支付宝发送页面支付指令。 #### 4. 控制器层接口设计 最后,在控制器(Controller)层面暴露RESTful API端点供前端或其他系统调用来触发支付操作。这里假设有个名为`OrderController.java`的控制类负责接收HTTP POST请求并将之转发给之前提到的服务组件完成后续工作流。 ```java @RestController @RequestMapping("/orders") public class OrderController { @Autowired private AlipayService alipayService; @PostMapping("/{id}/pay") public ResponseEntity<String> pay(@PathVariable Long id, HttpServletRequest req) throws Exception{ Optional<Order> optionalOrder = orderRepository.findById(id); if (!optionalOrder.isPresent()) { throw new ResourceNotFoundException("找不到指定编号的订单!"); } Order order = optionalOrder.get(); AlipayTradePagePayResponse response = alipayService.buildPaymentRequest(order).pageExecute(client); if(response.isSuccess()){ return ResponseEntity.ok().body(response.getBody()); }else{ log.error("支付失败:" + response.getSubMsg()); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } } ``` 这段代码片段说明了当接收到带有特定路径模式(`/orders/{id}/pay`) 的POST请求时,会尝试获取对应ID下的订单记录,并利用前面定义好的`AlipayService`来进行在线付款过程;成功则返回HTML表单字符串以便重定向至网银界面让用户确认支付细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值