当前位置:   article > 正文

SprinBoot支付宝沙箱支付H5/web(表单支付/二维码支付/订单查询/退全部退款/部分退款)

SprinBoot支付宝沙箱支付H5/web(表单支付/二维码支付/订单查询/退全部退款/部分退款)

程序员必备网站(tmxkj.top)

序言:

支付宝的相关信息请到官网去查看,在配置过程中遇到问题可以咨询小编

1.pom.xm 依赖坐标

  1. <!--支付宝支付相关依赖-->
  2. <dependency>
  3. <groupId>com.alipay.sdk</groupId>
  4. <artifactId>alipay-sdk-java</artifactId>
  5. <version>4.34.47.ALL</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-configuration-processor</artifactId>
  10. <optional>true</optional>
  11. </dependency>

2.yml配置信息

  1. #支付宝信息
  2. alipay:
  3. #APPID
  4. appId: ""
  5. #应用私钥 是用支付宝密匙工具生成的 下载支付宝密匙工具
  6. appPrivateKey: ""
  7. #沙箱应用-->应用信息-->开发信息-->接口加签方式-->系统默认密钥-->公钥模式-->查看-->支付宝公钥
  8. alipayPublicKey: ""
  9. #回调地址
  10. notifyUrl: "域名地址或者网络穿透地址/alipay/notify"
  11. #网关地址 # 现在是正式地址 如果需要测试地址 网络搜索沙箱测试账户
  12. serverUrl: "https://openapi.alipay.com/gateway.do"
  13. #数据格式,推荐:json
  14. format: "JSON"
  15. #编码格式 推荐:utf-8
  16. charset: "UTF-8"
  17. #签名方式,签名算法,推荐:RSA2
  18. signType: "RSA2"

3.AlipayConfig 配置类

  1. @Data
  2. @Component
  3. @ConfigurationProperties(prefix = "alipay")
  4. public class AlipayConfig {
  5. /**
  6. * APPID
  7. */
  8. private String appId;
  9. /**
  10. * 应用私钥
  11. */
  12. private String appPrivateKey;
  13. /**
  14. * 阿里公钥
  15. */
  16. private String alipayPublicKey;
  17. /**
  18. * 阿里调用我们的地址【内网穿透/或者域名】
  19. */
  20. private String notifyUrl;
  21. /**
  22. * 网关地址
  23. */
  24. private String serverUrl;
  25. /**
  26. * 数据格式
  27. */
  28. private String format;
  29. /**
  30. * 编码格式
  31. */
  32. private String charset;
  33. /**
  34. * 签名方式,签名算法
  35. */
  36. private String signType;
  37. }

4.实体类

   1.AliPay 发起支付实体类

  1. @Data
  2. public class AliPay {
  3. private String outTradeNo;//商户订单我们的订单号
  4. private Double totalAmount;//总金额
  5. private String subject;//标题
  6. private String alipayTraceNo;//阿里的流水号
  7. private String[] queryOptions;//指定需要返回的参数
  8. private String backUrl;//支付成功后返回前端页面地址
  9. private String refundAmount;//退款金额
  10. private String refundReason;//退款原因
  11. private String outRequestNo;//部分退款使用 部分退款选择 HZ01RF001
  12. private String storeName = "天梦星";// 公司名称
  13. }

 2.AliReturnPay 支付宝返回实体类

  1. @Data
  2. @ToString
  3. @AllArgsConstructor
  4. @NoArgsConstructor
  5. public class AliReturnPay implements Serializable {
  6. private static final long serialVersionUID = 8683949075381016639L;
  7. // 开发者的app_id
  8. private String app_id;
  9. // 商户订单号
  10. private String out_trade_no;
  11. // 签名
  12. private String sign;
  13. // 交易状态
  14. private String trade_status;
  15. // 支付宝交易号
  16. private String trade_no;
  17. // 交易的金额
  18. private String total_amount;
  19. }

 3.AlipayLog 支付日志实体类

  1. @Data
  2. @TableName("pay_alipay_log")
  3. public class AlipayLog {
  4. @TableId(type = IdType.AUTO)
  5. private Integer id;
  6. // 开发者的app_id
  7. private String app_id;
  8. // 商户订单号
  9. private String out_trade_no;
  10. // 签名
  11. private String sign;
  12. // 交易状态
  13. private String trade_status;
  14. // 支付宝交易号
  15. private String trade_no;
  16. // 交易的金额
  17. private String total_amount;
  18. }

4.Order 订单实体类

  1. @Data
  2. @TableName(value = "tab_order")
  3. public class Order implements Serializable {
  4. @TableId(value = "order_id",type = IdType.AUTO)
  5. private String orderId; // 订单id
  6. private String orderName; // 订单名称
  7. private Double totalPrice; // 商品总价格
  8. private String userId; // 下单用户id
  9. private Double paidPrice; // 实付价格
  10. private Integer quantity; // 购买数量
  11. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  12. private Date orderTime; // 下单时间
  13. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  14. private Date payTime; // 支付时间
  15. private String alipayTraceNo;//支付流水号
  16. private String payStatus; // 支付状态
  17. private String payStatusName;//支付状态名称
  18. private String orderStatus; // 订单状态
  19. private String orderStatusName; // 订单状态名称
  20. private String orderRemark; // 订单备注
  21. }

5.AlipayController 

  1. @RestController
  2. @RequestMapping("/alipay")
  3. public class AlipayController {
  4. @Resource
  5. private AlipayConfig alipayConfig;
  6. @Resource
  7. private AlipayLogDao alipayLogDao;
  8. @Resource
  9. private OrderDao orderDao;
  10. /**
  11. * 请求支付宝支付
  12. * 返货from表单
  13. */
  14. @GetMapping("/pay")
  15. public void pay(AliPay aliPay, HttpServletResponse response) {
  16. try {
  17. Order order = new Order();
  18. order.setOrderId(aliPay.getOutTradeNo());
  19. order =orderDao.selectById(order);
  20. if (!(order==null)){
  21. //1.创建client,通过阿里SDK提供的client,负责调用支付宝的API
  22. AlipayClient alipayClient = new DefaultAlipayClient(
  23. alipayConfig.getServerUrl(),
  24. alipayConfig.getAppId(),
  25. alipayConfig.getAppPrivateKey(),
  26. alipayConfig.getFormat(),
  27. alipayConfig.getCharset(),
  28. alipayConfig.getAlipayPublicKey(),
  29. alipayConfig.getSignType()
  30. );
  31. //2.创建request,并设置request参数
  32. AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
  33. request.setNotifyUrl(alipayConfig.getNotifyUrl());//设置异步地址
  34. //支付时候前端把地址传过来
  35. request.setReturnUrl(aliPay.getBackUrl());
  36. JSONObject jsonObject = new JSONObject();
  37. //商户订单号
  38. jsonObject.put("out_trade_no", order.getOrderId());
  39. //商品价格
  40. jsonObject.put("total_amount", order.getPaidPrice());
  41. //商品标题
  42. jsonObject.put("subject", order.getOrderName());
  43. //产品编码
  44. jsonObject.put("product_code", "FAST_INSTANT_TRADE_PAY");
  45. request.setBizContent(jsonObject.toString());
  46. //执行请求,拿到响应的结果,返回给浏览器
  47. String form = "";
  48. form = alipayClient.pageExecute(request).getBody();
  49. //设置响应结果,将返回的内容写出到浏览器
  50. response.setContentType("text/html;charset=" + alipayConfig.getCharset());
  51. response.getWriter().write(form);//直接将完整的表单html输出到页面
  52. response.getWriter().flush();
  53. response.getWriter().close();
  54. }
  55. } catch (Exception e) {
  56. e.printStackTrace();
  57. }
  58. }
  59. /**
  60. *二维码支付
  61. * 返回二维码
  62. */
  63. @PostMapping("/sandPay")
  64. public String sandboxPay(AliPay aliPay) {
  65. try {
  66. Order order = new Order();
  67. order.setOrderId(aliPay.getOutTradeNo());
  68. order =orderDao.selectById(order);
  69. if (!(order==null)){
  70. //1.创建client,通过阿里SDK提供的client,负责调用支付宝的API
  71. AlipayClient alipayClient = new DefaultAlipayClient(
  72. alipayConfig.getServerUrl(),
  73. alipayConfig.getAppId(),
  74. alipayConfig.getAppPrivateKey(),
  75. alipayConfig.getFormat(),
  76. alipayConfig.getCharset(),
  77. alipayConfig.getAlipayPublicKey(),
  78. alipayConfig.getSignType()
  79. );
  80. AlipayTradePrecreateRequest alipayRequest = new AlipayTradePrecreateRequest();
  81. alipayRequest.setNotifyUrl(alipayConfig.getNotifyUrl());
  82. JSONObject jsonObject = new JSONObject();
  83. jsonObject.put("out_trade_no", order.getOrderId());// 商户订单号
  84. jsonObject.put("total_amount", aliPay.getTotalAmount());// 商品价格
  85. jsonObject.put("subject", aliPay.getSubject());// 商品标题
  86. jsonObject.put("store_id", aliPay.getStoreName());//组织或公司名
  87. // jsonObject.put("timeout_express","5m");// 订单有效时间
  88. alipayRequest.setBizContent(jsonObject.toString());
  89. AlipayTradePrecreateResponse response = alipayClient.execute(alipayRequest);
  90. System.out.println("创建订单结果:" + response.getBody());
  91. System.out.println("订单编号是" + response.getOutTradeNo());
  92. String qrCode = response.getQrCode();
  93. // AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
  94. return qrCode;
  95. }else {
  96. return "订单错误";
  97. }
  98. } catch (Exception e) {
  99. return null;
  100. }
  101. }
  102. /**
  103. * 支付宝回调
  104. */
  105. @PostMapping("/notify")
  106. public void call(HttpServletRequest request, HttpServletResponse response, AliReturnPay aliReturnPay) {
  107. response.setContentType("type=text/html;charset=UTF-8");
  108. AlipayLog alipayLog = JSON.parseObject(JSON.toJSONString(aliReturnPay), AlipayLog.class);
  109. //插入日志操作
  110. alipayLogDao.insert(alipayLog);
  111. //更新订单信息
  112. Order order =new Order();
  113. //支付流水号
  114. order.setAlipayTraceNo(aliReturnPay.getTrade_no());
  115. //更新时间
  116. order.setPayTime(new Date());
  117. //已支付状态
  118. order.setPayStatus("Y");
  119. order.setPayStatusName("已支付");
  120. //更新订单状态
  121. order.setOrderStatus("Y");
  122. order.setOrderStatusName("已支付");
  123. orderDao.updateById(order);
  124. }
  125. /**
  126. *查询支付宝支付的订单
  127. */
  128. @PostMapping("/order")
  129. public String selectArder(AliPay aliPay){
  130. try {
  131. Order order = new Order();
  132. order.setOrderId(aliPay.getOutTradeNo());
  133. order =orderDao.selectById(order);
  134. if (!(order==null)){
  135. //1.创建client,通过阿里SDK提供的client,负责调用支付宝的API
  136. AlipayClient alipayClient = new DefaultAlipayClient(
  137. alipayConfig.getServerUrl(),
  138. alipayConfig.getAppId(),
  139. alipayConfig.getAppPrivateKey(),
  140. alipayConfig.getFormat(),
  141. alipayConfig.getCharset(),
  142. alipayConfig.getAlipayPublicKey(),
  143. alipayConfig.getSignType()
  144. );
  145. AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
  146. JSONObject jsonObject = new JSONObject();
  147. jsonObject.put("out_trade_no",order.getOrderId());// 商户订单号
  148. jsonObject.put("trade_no",order.getAlipayTraceNo());//支付宝订单编号
  149. jsonObject.put("query_options",aliPay.getQueryOptions());//指定需要返回那些信息
  150. request.setBizContent(jsonObject.toString());
  151. AlipayTradeQueryResponse response = alipayClient.execute(request);
  152. if(response.isSuccess()){
  153. System.out.println("调用成功");
  154. System.out.println(response.getBody());
  155. }else {
  156. response.getBody();
  157. System.out.println("调用失败");
  158. }
  159. }
  160. }catch (Exception e){
  161. e.printStackTrace();
  162. }
  163. return null;
  164. }
  165. /**
  166. * 全额退款
  167. */
  168. @PostMapping("/refundAll")
  169. public String refundAll(@RequestBody AliPay aliPay) {
  170. try {
  171. //1.创建client,通过阿里SDK提供的client,负责调用支付宝的API
  172. AlipayClient alipayClient = new DefaultAlipayClient(
  173. alipayConfig.getServerUrl(),
  174. alipayConfig.getAppId(),
  175. alipayConfig.getAppPrivateKey(),
  176. alipayConfig.getFormat(),
  177. alipayConfig.getCharset(),
  178. alipayConfig.getAlipayPublicKey(),
  179. alipayConfig.getSignType()
  180. );
  181. //2.创建request,并设置request参数
  182. AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
  183. JSONObject jsonObject = new JSONObject();
  184. jsonObject.put("out_trade_no",aliPay.getOutTradeNo());// 商户订单号
  185. jsonObject.put("trade_no",aliPay.getAlipayTraceNo());//支付宝交易号
  186. jsonObject.put("refund_amount",aliPay.getRefundAmount());//退款金额
  187. jsonObject.put("refund_reason",aliPay.getRefundReason());//退款原因
  188. request.setBizContent(jsonObject.toString());
  189. //执行请求,拿到响应的结果,返回给浏览器
  190. AlipayTradeRefundResponse response = alipayClient.execute(request);
  191. System.out.println(response.getBody());
  192. if (response.isSuccess()) {
  193. System.out.println(response.getBody());
  194. return "退款成功";
  195. } else {
  196. return "退款失败";
  197. }
  198. } catch (Exception e) {
  199. e.printStackTrace();
  200. return "退款异常";
  201. }
  202. }
  203. /**
  204. * 部分退款
  205. */
  206. @PostMapping("/refund")
  207. public String refund(@RequestBody AliPay aliPay) {
  208. try {
  209. //1.创建client,通过阿里SDK提供的client,负责调用支付宝的API
  210. AlipayClient alipayClient = new DefaultAlipayClient(
  211. alipayConfig.getServerUrl(),
  212. alipayConfig.getAppId(),
  213. alipayConfig.getAppPrivateKey(),
  214. alipayConfig.getFormat(),
  215. alipayConfig.getCharset(),
  216. alipayConfig.getAlipayPublicKey(),
  217. alipayConfig.getSignType()
  218. );
  219. //2.创建request,并设置request参数
  220. AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
  221. JSONObject jsonObject = new JSONObject();
  222. jsonObject.put("out_trade_no",aliPay.getOutTradeNo());// 商户订单号
  223. jsonObject.put("trade_no",aliPay.getAlipayTraceNo());//支付宝交易号
  224. jsonObject.put("refund_amount",aliPay.getRefundAmount());//退款金额
  225. jsonObject.put("refund_reason",aliPay.getRefundReason());//退款原因
  226. jsonObject.put("out_request_no","HZ01RF001");//部分退款
  227. request.setBizContent(jsonObject.toString());
  228. //执行请求,拿到响应的结果,返回给浏览器
  229. AlipayTradeRefundResponse response = alipayClient.execute(request);
  230. if (response.isSuccess()) {
  231. System.out.println(response.getBody());
  232. return "退款成功";
  233. } else {
  234. return "退款失败";
  235. }
  236. } catch (Exception e) {
  237. e.printStackTrace();
  238. return "退款异常";
  239. }
  240. }

6.调用示例

备注:拉起支付时候请保证订单表里面有数据

1.拉起支付:

https://4fa48cd8.r8.cpolar.top/alipay/pay?outTradeNo=24020800290010000001&backUrl=https://xn--rsso51ap1b.top/

2.全部退款:

http://localhost:8082/alipay/refundAll

参数: 

  1. {
  2. "outTradeNo": "24020723590010000001",
  3. "alipayTraceNo": "2024020822001441601457495589",
  4. "refundAmount": "0.10",
  5. "refundReason": "无",
  6. "outRequestNo": "897"
  7. }

3.部分退款

http://localhost:8082/alipay/refund

参数 全部退款和部分退款可以合并成一个接口 这边方便区分就放两个接口

  1. {
  2. "outTradeNo": "24020800290010000001",
  3. "alipayTraceNo": "2024020822001441601456419097",
  4. "refundAmount": "0.06",
  5. "refundReason": "无"
  6. }

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

闽ICP备14008679号