当前位置:   article > 正文

spring boot版的沙箱支付_springboot沙箱支付

springboot沙箱支付

文章目录


前言

目录

文章目录

前言

一、环境准备

二、使用步骤

1.application.properties配置

2.定义配置类读取文件 

3. 配置支付宝自动生成的信息类

4.配置沙箱支付的控制层

总结



一、环境准备

  1. <!--解决yaml或者properties配置文件注入对象时提示配置,这是官方的配置依赖-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-configuration-processor</artifactId>
  5. </dependency>
  6. <!--完整版的支付jar包 解决subject中文问题-->
  7. <dependency>
  8. <groupId>com.alipay.sdk</groupId>
  9. <artifactId>alipay-sdk-java</artifactId>
  10. <version>4.22.110.ALL</version>
  11. </dependency>
  12. <!--糊涂工具转数据格式使用-->
  13. <dependency>
  14. <groupId>cn.hutool</groupId>
  15. <artifactId>hutool-all</artifactId>
  16. <version>5.7.20</version>
  17. </dependency>

在 登录 - 支付宝申请一个沙箱支付账号,重点一定要私信支付宝客服,开通下商户服务,不然沙箱账号使用不了

二、使用步骤

1.application.properties配置

  1. #配置沙箱支付
  2. // 商户appid
  3. alipay.appId=
  4. // 私钥 pkcs8格式的--java应用程序的私钥 都可以再支付宝的平台上申请
  5. alipay.appPrivateKey=
  6. // 支付宝公钥---也可以再支付平台申请
  7. alipay.alipayPublicKey=
  8. #内网穿透
  9. #natapp地址
  10. #官网:https://natapp.cn/
  11. #先去官网申请免费隧道 并配置要穿透的端口号
  12. #然后复制账号的token值到软件的start.hat里,最后双击修改后的文件
  13. //支付成功后回调的地址---修改订单的状态
  14. alipay.notifyUrl=http://改成自己的项目/alipay/notify
  15. // 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址 这里是前端vue服务的跳转地址
  16. alipay.returnUrl=http://localhost:8000/orders

2.定义配置类读取文件 

  1. @Data
  2. @Component
  3. @ConfigurationProperties(prefix = "alipay")
  4. public class AlipayConfig {
  5. private String appId;
  6. private String appPrivateKey;
  7. private String alipayPublicKey;
  8. private String notifyUrl;
  9. private String returnUrl;
  10. }

3. 配置支付宝自动生成的信息类

  1. @Data
  2. public class AliPay {
  3. private String traceNo;
  4. private double totalAmount;
  5. private String subject;
  6. private String alipayTraceNo;
  7. }

4.配置沙箱支付的控制层

  1. @RestController
  2. @RequestMapping("/alipay")
  3. public class AliPayController {
  4. /**
  5. * 配置支付宝沙箱支付的格式 和签证
  6. */
  7. private static final String GATEWAY_URL = "https://openapi.alipaydev.com/gateway.do";
  8. private static final String FORMAT = "JSON";
  9. private static final String CHARSET = "UTF-8";
  10. //签名方式
  11. private static final String SIGN_TYPE = "RSA2";
  12. @Resource
  13. private AlipayConfig aliPayConfig;
  14. @Resource
  15. private OrdersMapper ordersMapper;
  16. /**
  17. * 支付的接口方法
  18. * @param aliPay
  19. * @param httpResponse
  20. * @throws Exception
  21. */
  22. @GetMapping("/pay") // &subject=xxx&traceNo=xxx&totalAmount=xxx
  23. public void pay(AliPay aliPay, HttpServletResponse httpResponse) throws Exception {
  24. // 1. 创建Client,通用SDK提供的Client,负责调用支付宝的API
  25. AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, aliPayConfig.getAppId(),
  26. aliPayConfig.getAppPrivateKey(), FORMAT, CHARSET, aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);
  27. // 2. 创建 Request并设置Request参数
  28. AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); // 发送请求的 Request类
  29. request.setNotifyUrl(aliPayConfig.getNotifyUrl());
  30. request.setReturnUrl(aliPayConfig.getReturnUrl());
  31. JSONObject bizContent = new JSONObject();
  32. bizContent.set("out_trade_no", aliPay.getTraceNo()); // 我们自己生成的订单编号
  33. bizContent.set("total_amount", aliPay.getTotalAmount()); // 订单的总金额
  34. bizContent.set("subject", aliPay.getSubject()); // 支付的名称
  35. bizContent.set("product_code", "FAST_INSTANT_TRADE_PAY"); // 固定配置
  36. request.setBizContent(bizContent.toString());
  37. // 执行请求,拿到响应的结果,返回给浏览器
  38. String form = "";
  39. try {
  40. form = alipayClient.pageExecute(request).getBody(); // 调用SDK生成表单
  41. } catch (AlipayApiException e) {
  42. e.printStackTrace();
  43. }
  44. httpResponse.setContentType("text/html;charset=" + CHARSET);
  45. httpResponse.getWriter().write(form);// 直接将完整的表单html输出到页面
  46. httpResponse.getWriter().flush();
  47. httpResponse.getWriter().close();
  48. }
  49. @PostMapping("/notify") // 注意这里必须是POST接口
  50. public String payNotify(HttpServletRequest request) throws Exception {
  51. if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
  52. System.out.println("=========支付宝异步回调========");
  53. Map<String, String> params = new HashMap<>();
  54. Map<String, String[]> requestParams = request.getParameterMap();
  55. for (String name : requestParams.keySet()) {
  56. params.put(name, request.getParameter(name));
  57. // System.out.println(name + " = " + request.getParameter(name));
  58. }
  59. String outTradeNo = params.get("out_trade_no");
  60. String gmtPayment = params.get("gmt_payment");
  61. String alipayTradeNo = params.get("trade_no");
  62. String sign = params.get("sign");
  63. String content = AlipaySignature.getSignCheckContentV1(params);
  64. boolean checkSignature = AlipaySignature.rsa256CheckContent(content, sign, aliPayConfig.getAlipayPublicKey(), "UTF-8"); // 验证签名
  65. // 支付宝验签
  66. if (checkSignature) {
  67. // 验签通过
  68. System.out.println("交易名称: " + params.get("subject"));
  69. System.out.println("交易状态: " + params.get("trade_status"));
  70. System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
  71. System.out.println("商户订单号: " + params.get("out_trade_no"));
  72. System.out.println("交易金额: " + params.get("total_amount"));
  73. System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
  74. System.out.println("买家付款时间: " + params.get("gmt_payment"));
  75. System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));
  76. // 查询订单 这里是支付的业务代码
  77. QueryWrapper<Orders> queryWrapper = new QueryWrapper<>();
  78. queryWrapper.eq("order_id", outTradeNo);
  79. Orders orders = ordersMapper.selectOne(queryWrapper);
  80. if (orders != null) {
  81. orders.setAlipayNo(alipayTradeNo);
  82. orders.setPayTime(new Date());
  83. orders.setState("已支付");
  84. ordersMapper.updateById(orders);
  85. }
  86. }
  87. }
  88. return "success";
  89. }
  90. @GetMapping("/return")
  91. public Result returnPay(AliPay aliPay) throws AlipayApiException {
  92. // 7天无理由退款
  93. String now = DateUtil.now();
  94. LambdaQueryWrapper<Orders> wrapper = new LambdaQueryWrapper<Orders>();
  95. wrapper.eq(Orders::getAlipayNo, aliPay.getTraceNo());
  96. //返回查询结果
  97. Orders orders = ordersMapper.selectOne(wrapper);
  98. if (orders != null) {
  99. // hutool工具类,判断时间间隔
  100. long between = DateUtil.between(
  101. DateUtil.parseDateTime(DateFormatUtil.DateToString(orders.getPayTime())),
  102. DateUtil.parseDateTime(now),
  103. DateUnit.DAY);
  104. if (between > 7) {
  105. return new Result(-1,"该订单已超过7天,不支持退款",null);
  106. }
  107. }
  108. // 1. 创建Client,通用SDK提供的Client,负责调用支付宝的API
  109. AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL,
  110. aliPayConfig.getAppId(), aliPayConfig.getAppPrivateKey(), FORMAT, CHARSET,
  111. aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);
  112. // 2. 创建 Request,设置参数
  113. AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
  114. JSONObject bizContent = new JSONObject();
  115. bizContent.set("trade_no", aliPay.getAlipayTraceNo()); // 支付宝回调的订单流水号
  116. bizContent.set("refund_amount", aliPay.getTotalAmount()); // 订单的总金额
  117. bizContent.set("out_request_no", aliPay.getTraceNo()); // 我的订单编号
  118. // 返回参数选项,按需传入
  119. //JSONArray queryOptions = new JSONArray();
  120. //queryOptions.add("refund_detail_item_list");
  121. //bizContent.put("query_options", queryOptions);
  122. request.setBizContent(bizContent.toString());
  123. // 3. 执行请求
  124. AlipayTradeRefundResponse response = alipayClient.execute(request);
  125. if (response.isSuccess()) { // 退款成功,isSuccess 为true
  126. System.out.println("调用成功");
  127. // 4. 更新数据库状态
  128. UpdateWrapper<Orders> wrapper1=new UpdateWrapper<>();
  129. //这表示给指定的一条数据修改,不然就给所有数据修改了
  130. wrapper1.eq("id",orders.getId())
  131. .set("state","已退款");
  132. ordersMapper.update(null, wrapper);
  133. return new Result(200,"退款成功");
  134. } else { // 退款失败,isSuccess 为false
  135. System.out.println(response.getBody());
  136. return new Result(4041, response.getBody(),"退款失败");
  137. }
  138. }
  139. }

关于沙箱支付的配置就完成了,其他的正常写,支付的时候调用该接口,就行


总结

待补充

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/742808
推荐阅读
相关标签
  

闽ICP备14008679号