SpringBoot集成支付宝沙箱支付
个人账号未申请上架的App/网站是无法接入支付宝支付的,但是可以使用支付宝沙箱版进行练手。沙箱版就相当于不不涉及现实金额交易的一个支付宝模拟环境,其中交易的金额都是虚假的内容。
准备步骤
接入SpringBoot
SpringBoot版本
<parent> <artifactId>spring-boot-starter-parent</artifactId> <groupId>org.springframework.boot</groupId> <version>2.4.12</version> <relativePath/> </parent>
|
依赖版本
<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>4.16.2.ALL</version> </dependency>
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
|
在resources目录编写alipay.properties配置文件
alipay.appId=你的appid
alipay.appPrivateKey=你的应用私钥,在C:\Users\用户名\Documents\支付宝开放平台密钥工具\日期(前提是你用的支付宝工具生成的公私钥)
alipay.alipayPublicKey=你的支付宝公钥,在支付宝沙箱管理平台
alipay.notifyUrl=http://xxxx.xxx/xxx
alipay.returnUrl=http://xxxx.xxx/xxx
alipay.gatewayUrl=https://openapi.alipaydev.com/gateway.do
alipay.signType=RSA2
alipay.redirectUrl=http://xxxx.xxx/xxx
|
编写AlipayConfig.java用于读取配置文件
@Configuration @PropertySource("classpath:alipay.properties") @ConfigurationProperties(prefix = "alipay") @Data public class AlipayConfig { private String appId; private String appPrivateKey; private String alipayPublicKey; private String notifyUrl; private String returnUrl; private String gatewayUrl; private String signType; private String redirectUrl;
}
|
在需要支付的方法上调用如下方法
@Resource private AlipayConfig alipayConfig;
private String sendRequestToAlipay(String outTradeNo, String totalAmount, String subject) { AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getGatewayUrl(), alipayConfig.getAppId(), alipayConfig.getAppPrivateKey(), "JSON", "UTF-8", alipayConfig.getAlipayPublicKey(), alipayConfig.getSignType());
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setReturnUrl(alipayConfig.getReturnUrl()); alipayRequest.setNotifyUrl(alipayConfig.getNotifyUrl()); alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"total_amount\":\"" + totalAmount + "\"," + "\"subject\":\"" + subject + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
String result = null; try { result = alipayClient.pageExecute(alipayRequest).getBody(); } catch (AlipayApiException e) { e.printStackTrace(); } return result; }
|
异步回调
@ApiOperation("付款成功异步回调") @PostMapping("asyncNotify") public String notifyUrl(HttpServletRequest request) throws AlipayApiException { return orderService.notifyUrl(request); }
public String notifyUrl(HttpServletRequest request) throws AlipayApiException { logger.info("=================================异步回调====================================="); Map<String, String> params = new HashMap<>(); Map<String, String[]> requestParams = request.getParameterMap(); for (String name : requestParams.keySet()) { params.put(name, request.getParameter(name)); } boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipayPublicKey(), "UTF-8", alipayConfig.getSignType()); if (signVerified) { logger.info("交易名称: " + params.get("subject")); logger.info("交易状态: " + params.get("trade_status")); logger.info("支付宝交易凭证号: " + params.get("trade_no")); logger.info("商户订单号: " + params.get("out_trade_no")); logger.info("交易金额: " + params.get("total_amount")); logger.info("买家在支付宝唯一id: " + params.get("buyer_id")); logger.info("买家付款时间: " + params.get("gmt_payment")); logger.info("买家付款金额: " + params.get("buyer_pay_amount")); logger.info("重定向URL: " + params.get("body"));
Integer res = orderMapper.toBuy(order); if (res >= 1) { return "ok"; } return "no"; } else { return "no"; } }
|
同步回调
@ApiOperation("付款成功同步回调") @GetMapping("syncNotify") public void returnUrl(HttpServletRequest request, HttpServletResponse response) throws IOException { orderService.returnUrl(request, response); }
public void returnUrl(HttpServletRequest request, HttpServletResponse response) throws IOException { logger.info("=================================同步回调====================================="); }
|
以上配置完后,点击支付url,跳转到支付宝沙箱扫码支付页面,使用:支付宝沙箱软件支付
登录账号密码:
