支付宝支付——沙箱环境支付
沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境,开发者在沙箱环境中调用接口无需具备所需的商业资质,无需绑定和开通产品,同时不会对生产环境中的数据造成任何影响。
合理使用沙箱环境,可以让研发流程与商业流程并行,降低联调资损风险,加速项目的交付。
准备工作
- 进入到支付宝开放平台 :https://open.alipay.com/
- 登录支付宝账号
- 点击控制台,如果没有可以点击搜索控制台
- 点击下面的沙箱环境

- 如何设置公钥模式?
- 点击设置
- 下载支付宝 密钥工具:https://opendocs.alipay.com/common/02kipk?pathHash=0d20b438


- 复制公钥到里面


集成Springboot
pom
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-easysdk</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.34.0.ALL</version> </dependency> </dependencies>
|
application.yaml
spring: application: name: alibaba_pay server: port: 9090 alipay: app_id: 你的appid appPrivateKey: 你的私钥 alipayPublicKey: 你的公钥 notifyUrl: 支付成功回调地址
|
配置支付宝的参数
package com.lazy.alibaba_pay.config;
import com.alipay.easysdk.factory.Factory; import com.alipay.easysdk.kernel.Config; import jakarta.annotation.PostConstruct; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;
@Data @Component @ConfigurationProperties(prefix = "alipay") public class AliPayConfig { private String appId; private String appPrivateKey; private String alipayPublicKey; private String notifyUrl; private String returnUrl; private String signType = "RSA2"; private String charset = "utf-8"; private String gatewayUrl = "https://openapi.alipay.com/gateway.do";
@PostConstruct public void init() { Config config = new Config(); config.protocol = "https"; config.gatewayHost = "openapi.alipaydev.com"; config.appId = this.appId; config.merchantPrivateKey = this.appPrivateKey; config.alipayPublicKey = this.alipayPublicKey; config.notifyUrl = this.notifyUrl; config.signType = this.signType; Factory.setOptions(config); System.out.println("=======支付宝SDK初始化成功======="); } }
|
AliPay
package com.lazy.alibaba_pay.pojo;
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;
@Data @AllArgsConstructor @NoArgsConstructor public class AliPay { private String traceNo; private double totalAmount; private String subject; private String alipayTraceNo; }
|
controller
package com.lazy.alibaba_pay.controller;
import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayTradePagePayRequest; import com.alipay.easysdk.factory.Factory; import com.lazy.alibaba_pay.config.AliPayConfig; import com.lazy.alibaba_pay.pojo.AliPay; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*;
import java.util.HashMap; import java.util.Map;
@RestController @RequestMapping("/alipay") public class AliPayController {
@Resource AliPayConfig aliPayConfig;
private static final String GATEWAY_URL ="https://openapi-sandbox.dl.alipaydev.com/gateway.do"; private static final String FORMAT ="JSON"; private static final String CHARSET ="utf-8"; private static final String SIGN_TYPE ="RSA2"; @PostMapping("/pay") public void pay(@RequestBody AliPay aliPay, HttpServletResponse httpResponse) throws Exception { AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, aliPayConfig.getAppId(), aliPayConfig.getAppPrivateKey(), FORMAT, CHARSET, aliPayConfig.getAlipayPublicKey(), SIGN_TYPE); AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); request.setNotifyUrl(aliPayConfig.getNotifyUrl()); request.setBizContent("{\"out_trade_no\":\"" + aliPay.getTraceNo() + "\"," + "\"total_amount\":\"" + aliPay.getTotalAmount() + "\"," + "\"subject\":\"" + aliPay.getSubject() + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); String form = ""; try { form = alipayClient.pageExecute(request).getBody(); } catch (AlipayApiException e) { e.printStackTrace(); } httpResponse.setContentType("text/html;charset=" + CHARSET); httpResponse.getWriter().write(form); httpResponse.getWriter().flush(); httpResponse.getWriter().close(); } @PostMapping("/notify") public String payNotify(HttpServletRequest request) throws Exception { if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) { System.out.println("=========支付宝异步回调========");
Map<String, String> params = new HashMap<>(); Map<String, String[]> requestParams = request.getParameterMap(); for (String name : requestParams.keySet()) { params.put(name, request.getParameter(name)); }
String tradeNo = params.get("out_trade_no"); String gmtPayment = params.get("gmt_payment"); String alipayTradeNo = params.get("trade_no"); if (Factory.Payment.Common().verifyNotify(params)) { System.out.println("交易名称: " + params.get("subject")); System.out.println("交易状态: " + params.get("trade_status")); System.out.println("支付宝交易凭证号: " + params.get("trade_no")); System.out.println("商户订单号: " + params.get("out_trade_no")); System.out.println("交易金额: " + params.get("total_amount")); System.out.println("买家在支付宝唯一id: " + params.get("buyer_id")); System.out.println("买家付款时间: " + params.get("gmt_payment")); System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));
} } return "success"; }
}
|

成功了
支付回调接口需要使用内网穿透