StripeService.java 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package com.cyksj.service.stripe;
  2. import com.cyksj.common.exception.BusinessRuntimeException;
  3. import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
  4. import com.cyksj.common.util.Jsons;
  5. import com.cyksj.enums.GatewayApiCode;
  6. import com.cyksj.mapper.StripePayConfigMapper;
  7. import com.cyksj.model.entity.OrderDon;
  8. import com.cyksj.model.entity.StripePayConfig;
  9. import com.cyksj.model.request.OrderRefundReq;
  10. import com.cyksj.service.order.OrderDonService;
  11. import com.stripe.Stripe;
  12. import com.stripe.exception.StripeException;
  13. import com.stripe.model.*;
  14. import com.stripe.model.checkout.Session;
  15. import com.stripe.param.RefundCreateParams;
  16. import com.stripe.param.checkout.SessionCreateParams;
  17. import lombok.RequiredArgsConstructor;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.springframework.stereotype.Service;
  20. import java.math.BigDecimal;
  21. import java.math.RoundingMode;
  22. import java.util.Date;
  23. import java.util.HashMap;
  24. /**
  25. * @author zwhui
  26. * @date 2021/6/21 11:03 上午
  27. */
  28. @Service
  29. @Slf4j
  30. @RequiredArgsConstructor
  31. public class StripeService {
  32. private static final GlobalThreadPoolTaskExecutor THREAD_POOL = GlobalThreadPoolTaskExecutor.getInstance();
  33. private final OrderDonService orderDonService;
  34. private final StripePayConfigMapper stripePayConfigMapper;
  35. public String checkOutStripe(Long orderId,String successUrl) throws Exception{
  36. OrderDon orderDon = orderDonService.getById(orderId);
  37. BigDecimal money = orderDon.getMoney();
  38. orderDon.setType(OrderDon.Type.STRIPE);
  39. orderDonService.updateById(orderDon);
  40. HashMap<String, String> responseData = new HashMap<String, String>();
  41. if (OrderDon.Status.hasPayment.equals(orderDon.getStatus())) {
  42. throw new BusinessRuntimeException(GatewayApiCode.METADATA_SYSTEM_ERROR.getCode(),"The donation has been paid");
  43. }
  44. StripePayConfig stripePayConfig = stripePayConfigMapper.selectById(1);
  45. try {
  46. Stripe.apiKey = stripePayConfig.getApiKey();
  47. SessionCreateParams params =
  48. SessionCreateParams.builder()
  49. .setMode(SessionCreateParams.Mode.PAYMENT)
  50. .setSuccessUrl(successUrl)
  51. .setCancelUrl(stripePayConfig.getCancelUrl())
  52. .setClientReferenceId(orderDon.getId().toString())
  53. .addLineItem(
  54. SessionCreateParams.LineItem.builder()
  55. .setQuantity(1L)
  56. .setPriceData(
  57. SessionCreateParams.LineItem.PriceData.builder()
  58. .setCurrency("USD")
  59. .setUnitAmount(money.longValue())
  60. .setProductData(
  61. SessionCreateParams.LineItem.PriceData.ProductData.builder()
  62. .setName("donation")
  63. .setDescription("donation")
  64. .build()).build()).build()).build();
  65. Session session = Session.create(params);
  66. responseData.put("id", session.getId());
  67. } catch (StripeException e) {
  68. e.printStackTrace();
  69. }
  70. return Jsons.toJson(responseData);
  71. }
  72. public void fulfillOrder(Session session) throws Exception{
  73. if (null == session){
  74. log.error("支付回调失败");
  75. return;
  76. }
  77. String orderId = session.getClientReferenceId();
  78. if (!"paid".equals(session.getPaymentStatus())){
  79. return;
  80. }
  81. OrderDon orderDon = orderDonService.getById(orderId);
  82. if (orderDon == null){
  83. return;
  84. }
  85. if (orderDon.getStatus().equals(OrderDon.Status.hasPayment)) {
  86. log.info("已回调,重复修改状态 id:{}", orderDon.getId());
  87. return;
  88. }
  89. String paymentIntentId = session.getPaymentIntent();
  90. PaymentIntent paymentIntent = PaymentIntent.retrieve(paymentIntentId);
  91. String chargeId = paymentIntent.getLatestCharge();
  92. BalanceTransaction balanceTransaction = BalanceTransaction.retrieve(Charge.retrieve(chargeId).getBalanceTransaction());
  93. //更新订单支付状态
  94. orderDon.setTransactionId(chargeId);
  95. orderDon.setAbroadTransactionFee(BigDecimal.valueOf(balanceTransaction.getFee()));
  96. orderDon.setPayTime(new Date());
  97. orderDonService.orderNotify(orderDon);
  98. log.info("支付成功订单:"+orderId+",支付交易号:"+chargeId);
  99. log.info("支付成功订单:"+orderId+",返回参数:"+Jsons.toJson(session));
  100. }
  101. public Boolean refund(OrderRefundReq refundReq, OrderDon orderDon) throws StripeException {
  102. BigDecimal net = refundReq.getRefundMoney().divide(new BigDecimal(7),2, RoundingMode.HALF_DOWN).subtract(orderDon.getAbroadTransactionFee());
  103. log.info("stripe return order:{},money:{}",orderDon.getId(),net);
  104. StripePayConfig stripePayConfig = stripePayConfigMapper.selectById(1);
  105. Stripe.apiKey = stripePayConfig.getApiKey();
  106. RefundCreateParams params =
  107. RefundCreateParams.builder()
  108. .setCharge(orderDon.getTransactionId())
  109. .setAmount(net.longValue())
  110. .build();
  111. Refund refund = Refund.create(params);
  112. log.info("stripe return refund:{}",refund);
  113. if ("succeeded".equals(refund.getStatus())){
  114. orderDon.setStatus(OrderDon.Status.refund);
  115. orderDonService.updateById(orderDon);
  116. return true;
  117. }
  118. return false;
  119. }
  120. }