StripeService.java 6.2 KB

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