| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- package com.cyksj.service.stripe;
- import com.cyksj.common.exception.BusinessRuntimeException;
- import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
- import com.cyksj.common.util.Jsons;
- import com.cyksj.enums.GatewayApiCode;
- import com.cyksj.mapper.StripePayConfigMapper;
- import com.cyksj.model.entity.OrderDon;
- import com.cyksj.model.entity.StripePayConfig;
- import com.cyksj.model.request.OrderRefundReq;
- import com.cyksj.service.order.OrderDonService;
- import com.stripe.Stripe;
- import com.stripe.exception.StripeException;
- import com.stripe.model.BalanceTransaction;
- import com.stripe.model.Charge;
- import com.stripe.model.PaymentIntent;
- import com.stripe.model.Refund;
- import com.stripe.model.checkout.Session;
- import com.stripe.param.RefundCreateParams;
- import com.stripe.param.checkout.SessionCreateParams;
- import lombok.RequiredArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.stereotype.Service;
- import java.math.BigDecimal;
- import java.util.Date;
- import java.util.HashMap;
- /**
- * @author zwhui
- * @date 2021/6/21 11:03 上午
- */
- @Service
- @Slf4j
- @RequiredArgsConstructor
- public class StripeService {
- private static final GlobalThreadPoolTaskExecutor THREAD_POOL = GlobalThreadPoolTaskExecutor.getInstance();
- private final OrderDonService orderDonService;
- private final StripePayConfigMapper stripePayConfigMapper;
- public String checkOutStripe(Long orderId,String successUrl) throws Exception{
- OrderDon orderDon = orderDonService.getById(orderId);
- BigDecimal money = orderDon.getMoney();
- orderDon.setType(OrderDon.Type.STRIPE);
- orderDonService.updateById(orderDon);
- HashMap<String, String> responseData = new HashMap<String, String>();
- if (OrderDon.Status.hasPayment.equals(orderDon.getStatus())) {
- throw new BusinessRuntimeException(GatewayApiCode.METADATA_SYSTEM_ERROR.getCode(),"The donation has been paid");
- }
- StripePayConfig stripePayConfig = stripePayConfigMapper.selectById(1);
- try {
- Stripe.apiKey = stripePayConfig.getApiKey();
- SessionCreateParams params =
- SessionCreateParams.builder()
- .setMode(SessionCreateParams.Mode.PAYMENT)
- .setSuccessUrl(successUrl)
- .setCancelUrl(stripePayConfig.getCancelUrl())
- .setClientReferenceId(orderDon.getId().toString())
- .addLineItem(
- SessionCreateParams.LineItem.builder()
- .setQuantity(1L)
- .setPriceData(
- SessionCreateParams.LineItem.PriceData.builder()
- .setCurrency("USD")
- .setUnitAmount(money.longValue())
- .setProductData(
- SessionCreateParams.LineItem.PriceData.ProductData.builder()
- .setName("donation")
- .setDescription("donation")
- .build()).build()).build()).build();
- Session session = Session.create(params);
- responseData.put("id", session.getId());
- } catch (StripeException e) {
- e.printStackTrace();
- }
- return Jsons.toJson(responseData);
- }
- public void fulfillOrder(Session session) throws Exception{
- if (null == session){
- log.error("支付回调失败");
- return;
- }
- String orderId = session.getClientReferenceId();
- if (!"paid".equals(session.getPaymentStatus())){
- return;
- }
- OrderDon orderDon = orderDonService.getById(orderId);
- if (orderDon == null){
- return;
- }
- if (orderDon.getStatus().equals(OrderDon.Status.hasPayment)) {
- log.info("已回调,重复修改状态 id:{}", orderDon.getId());
- return;
- }
- String paymentIntentId = session.getPaymentIntent();
- PaymentIntent paymentIntent = PaymentIntent.retrieve(paymentIntentId);
- String chargeId = paymentIntent.getLatestCharge();
- BalanceTransaction balanceTransaction = BalanceTransaction.retrieve(Charge.retrieve(chargeId).getBalanceTransaction());
- //更新订单支付状态
- orderDon.setTransactionId(chargeId);
- orderDon.setAbroadTransactionFee(BigDecimal.valueOf(balanceTransaction.getFee()));
- orderDon.setPayTime(new Date());
- orderDonService.orderNotify(orderDon);
- log.info("支付成功订单:"+orderId+",支付交易号:"+chargeId);
- log.info("支付成功订单:"+orderId+",返回参数:"+Jsons.toJson(session));
- }
- public static void main(String[] args) throws StripeException {
- Stripe.apiKey = "sk_test_51NATIGJKtCIbVVyCmw3ISCI9mn59oIJ2l767Qn3M3fOi259Y1iWS7eSllMBBmdmfc745hVKmpKYxGofQyMLc8a1U00KgFDGqXL";
- BalanceTransaction balanceTransaction = BalanceTransaction.retrieve(Charge.retrieve("ch_3Ng0C9JKtCIbVVyC0DzkXNsv").getBalanceTransaction());
- System.out.println(balanceTransaction);
- }
- public void refund(OrderRefundReq refundReq, OrderDon orderDon) throws StripeException {
- BigDecimal net = refundReq.getRefundMoney().subtract(orderDon.getAbroadTransactionFee());
- log.info("stripe return order:{},money:{}",orderDon.getId(),net);
- StripePayConfig stripePayConfig = stripePayConfigMapper.selectById(1);
- Stripe.apiKey = stripePayConfig.getApiKey();
- RefundCreateParams params =
- RefundCreateParams.builder()
- .setCharge(orderDon.getTransactionId())
- .setAmount(net.longValue())
- .build();
- Refund refund = Refund.create(params);
- log.info("stripe return refund:{}",refund);
- if (!"succeeded".equals(refund.getStatus())){
- throw BusinessRuntimeException.getInstance("退款失败,e:{0}", refund.getDescription());
- }
- }
- }
|