AliPayController.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /**
  2. * Copyright (c) 2021 Toby All rights reserved.
  3. * <p>
  4. * https://www.scjydz.com
  5. * <p>
  6. * 版权所有,侵权必究!
  7. */
  8. package com.wjp.modules.pay.controller;
  9. import com.alipay.api.AlipayApiException;
  10. import com.alipay.api.domain.AlipayTradePagePayModel;
  11. import com.alipay.api.internal.util.AlipaySignature;
  12. import com.ijpay.alipay.AliPayApi;
  13. import com.ijpay.alipay.AliPayApiConfig;
  14. import com.ijpay.alipay.AliPayApiConfigKit;
  15. import com.wjp.common.constant.Constant;
  16. import com.wjp.common.exception.MyException;
  17. import com.wjp.modules.pay.config.AliPayProperties;
  18. import com.wjp.modules.pay.dto.AlipayNotifyLogDTO;
  19. import com.wjp.modules.pay.entity.OrderEntity;
  20. import com.wjp.modules.pay.service.AlipayNotifyLogService;
  21. import com.wjp.modules.pay.service.OrderService;
  22. import jakarta.servlet.http.HttpServletRequest;
  23. import jakarta.servlet.http.HttpServletResponse;
  24. import lombok.AllArgsConstructor;
  25. import org.springframework.web.bind.annotation.PostMapping;
  26. import org.springframework.web.bind.annotation.RequestMapping;
  27. import org.springframework.web.bind.annotation.RestController;
  28. import java.math.BigDecimal;
  29. import java.util.Map;
  30. /**
  31. * 支付宝支付
  32. *
  33. * @author Toby javatangbin@163.com
  34. */
  35. @AllArgsConstructor
  36. @RestController
  37. @RequestMapping("pay/alipay")
  38. public class AliPayController extends AbstractAliPayApiController {
  39. private final AliPayProperties properties;
  40. private final OrderService orderService;
  41. private final AlipayNotifyLogService alipayNotifyLogService;
  42. @Override
  43. public AliPayApiConfig getApiConfig() throws AlipayApiException {
  44. AliPayApiConfig aliPayApiConfig;
  45. try {
  46. aliPayApiConfig = AliPayApiConfigKit.getApiConfig(properties.getAppId());
  47. } catch (Exception e) {
  48. aliPayApiConfig = AliPayApiConfig.builder()
  49. .setAppId(properties.getAppId())
  50. .setAliPayPublicKey(properties.getPublicKey())
  51. .setAppCertPath(properties.getAppCertPath())
  52. .setAliPayCertPath(properties.getAliPayCertPath())
  53. .setAliPayRootCertPath(properties.getAliPayRootCertPath())
  54. .setCharset("UTF-8")
  55. .setPrivateKey(properties.getPrivateKey())
  56. .setServiceUrl(properties.getServerUrl())
  57. .setSignType("RSA2")
  58. // 普通公钥方式
  59. //.build();
  60. // 证书模式
  61. .buildByCert();
  62. }
  63. return aliPayApiConfig;
  64. }
  65. /**
  66. * Web支付
  67. */
  68. @RequestMapping(value = "/webPay")
  69. public void webPay(HttpServletResponse response, Long orderId) throws Exception {
  70. OrderEntity order = orderService.getByOrderId(orderId);
  71. if (order == null) {
  72. throw new MyException("订单不存在");
  73. }
  74. if (order.getStatus() != Constant.OrderStatus.WAITING.getValue()) {
  75. throw new MyException("订单已失效");
  76. }
  77. AlipayTradePagePayModel model = new AlipayTradePagePayModel();
  78. model.setOutTradeNo(order.getOrderId() + "");
  79. //固定值
  80. model.setProductCode("FAST_INSTANT_TRADE_PAY");
  81. model.setTotalAmount(order.getPayAmount().toString());
  82. model.setSubject(order.getProductName());
  83. //公用回传参数,没有则无需设置
  84. //model.setPassbackParams("passback_params");
  85. AliPayApi.tradePage(response, model, properties.getNotifyUrl(), properties.getReturnUrl());
  86. }
  87. /**
  88. * 支付宝异步通知接口
  89. */
  90. @PostMapping("notify_url")
  91. public String notifyUrl(HttpServletRequest request) throws Exception {
  92. //支付宝异步通知内容
  93. Map<String, String> params = AliPayApi.toMap(request);
  94. //秘钥模式
  95. //boolean verifyResult = AlipaySignature.rsaCheckV1(params, properties.getPublicKey(), "UTF-8", "RSA2");
  96. //证书模式
  97. boolean verifyResult = AlipaySignature.rsaCertCheckV1(params, properties.getAliPayCertPath(), "UTF-8", "RSA2");
  98. //验签失败
  99. if (!verifyResult) {
  100. return "failure";
  101. }
  102. //保存异步通知记录
  103. AlipayNotifyLogDTO alipayNotifyLog = new AlipayNotifyLogDTO();
  104. alipayNotifyLog.setNotifyId(params.get("notify_id"));
  105. alipayNotifyLog.setBuyerId(params.get("buyer_id"));
  106. alipayNotifyLog.setSellerId(params.get("seller_id"));
  107. alipayNotifyLog.setTradeNo(params.get("trade_no"));
  108. alipayNotifyLog.setOutTradeNo(Long.parseLong(params.get("out_trade_no")));
  109. alipayNotifyLog.setTotalAmount(new BigDecimal(params.get("total_amount")));
  110. alipayNotifyLog.setBuyerPayAmount(new BigDecimal(params.get("buyer_pay_amount")));
  111. alipayNotifyLog.setReceiptAmount(new BigDecimal(params.get("receipt_amount")));
  112. alipayNotifyLog.setInvoiceAmount(new BigDecimal(params.get("invoice_amount")));
  113. alipayNotifyLog.setTradeStatus(params.get("trade_status"));
  114. alipayNotifyLogService.save(alipayNotifyLog);
  115. //查询订单信息
  116. OrderEntity order = orderService.getByOrderId(alipayNotifyLog.getOutTradeNo());
  117. //重复通知,不再处理
  118. if (order.getStatus() == Constant.OrderStatus.FINISH.getValue()) {
  119. return "success";
  120. }
  121. //处理业务逻辑
  122. orderService.paySuccess(order);
  123. return "success";
  124. }
  125. }