liujie
2023-05-26 f9de931c4457c2a6bfe395879e3b2f2bfd7d9692
src/main/java/com/stylefeng/guns/modular/system/utils/PaymentProcessor.java
@@ -1,87 +1,147 @@
package com.stylefeng.guns.modular.system.utils;
import com.alibaba.fastjson.JSON;
import com.stripe.Stripe;
import com.stripe.exception.SignatureVerificationException;
import com.stripe.exception.StripeException;
import com.stripe.exception.*;
import com.stripe.model.Customer;
import com.stripe.model.PaymentIntent;
import com.stripe.model.PaymentMethod;
import com.stripe.model.PaymentMethodCollection;
import com.stripe.net.Webhook;
import com.stripe.param.CustomerCreateParams;
import com.stripe.param.PaymentIntentCreateParams;
import com.stripe.param.PaymentIntentUpdateParams;
import com.stripe.param.PaymentMethodListParams;
import java.util.HashMap;
import java.util.logging.Logger;
public class PaymentProcessor {
    public static String getMethod(String customer) throws StripeException {
        PaymentMethodListParams params =
                PaymentMethodListParams.builder()
                        .setCustomer(customer)
                        .setType(PaymentMethodListParams.Type.CARD)
                        .build();
        PaymentMethodCollection paymentMethods = PaymentMethod.list(params);
        String s = JSON.toJSONString(paymentMethods);
        return s;
    }
    public static Boolean pay(String cus,String method,Long money) throws StripeException {
        Stripe.apiKey = "sk_test_51Mu5D0KDN0sswRVwUNL5998QrX1VJkNrLsflVUXkEFH0cY2l9StrCc5O4c9gtzs7tLbVmeaTfyNL6pnrtw1tRClA00ZVfbNb3d";
        PaymentIntentCreateParams params =
                PaymentIntentCreateParams.builder()
                        .setCurrency("usd")
                        .setAmount(money)
                        .setCustomer(cus)
                        .setPaymentMethod(method)
                        .setErrorOnRequiresAction(true)
                        .setConfirm(true)
                        .build();
        try {
            PaymentIntent paymentIntent = PaymentIntent.create(params);
            return true;
        } catch (CardException err) {
            // Error code will be authentication_required if authentication is needed
            String paymentIntentId = err.getStripeError().getPaymentIntent().getId();
            PaymentIntent paymentIntent = PaymentIntent.retrieve(paymentIntentId);
            System.out.println(paymentIntent.getId());
            return false;
        }catch (RateLimitException e) {
            // Too many requests made to the API too quickly
            return false;
        } catch (InvalidRequestException e) {
            // Invalid parameters were supplied to Stripe's API
            return false;
        } catch (AuthenticationException e) {
            // Authentication with Stripe's API failed
            // (maybe you changed API keys recently)
            return false;
        } catch (StripeException e) {
            // Display a very generic error to the user, and maybe send
            // yourself an email
            return false;
        } catch (Exception e) {
            // Something else happened, completely unrelated to Stripe
            return false;
        }
    }
    // 定义 Stripe API 密钥
    private static final String STRIPE_API_KEY = "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";
    public PaymentProcessor() {
        // 初始化 Stripe 对象并设置 API 密钥
        Stripe.apiKey = STRIPE_API_KEY;
    }
    /**
     * 创建一个 Stripe 客户,并保存他们的信用卡信息,以备将来使用。
     * 支持多种付款方式,例如支付宝、微信等。这里只是演示如何使用信用卡进行支付。
     *
     * @param email     客户电子邮件地址
     * @param cardToken 由 Stripe.js 获取的信用卡令牌
     * @return Stripe 客户对象
     * @throws StripeException 如果创建客户或付款交易时出现错误
     */
    public Customer createCustomer(String email, String cardToken) throws StripeException {
        // 构造付款交易参数
        PaymentIntentCreateParams params = PaymentIntentCreateParams.builder()
                .setAmount(1000L) // 设置要收取的金额,以美分为单位(例如 $10.00 = 1000 美分)
                .setCurrency("usd") // 设置货币类型:USD(美元)
                .setPaymentMethod(cardToken) // 设置由 Stripe.js 获取的信用卡令牌
                .build();
        // 创建付款交易
        PaymentIntent paymentIntent = PaymentIntent.create(params);
        // 创建一个 Stripe 客户,将他们的付款方法与 Stripe 帐户关联在一起
        Customer customer = Customer.create(
                CustomerCreateParams.builder()
                        .setEmail(email) // 设置客户的电子邮件地址
                        .setPaymentMethod(paymentIntent.getPaymentMethod()) // 将付款方法与客户端 Stripe 帐户相关联
                        .build()
        );
        // 返回创建的 Stripe 客户对象
        return customer;
    }
    /**
     * 从一个 Stripe 客户处收取付款。
     *
     * @param customerId Stripe 客户 ID
     * @param amount     要收取的金额,以美分为单位
     * @return Stripe 付款交易对象
     * @throws StripeException 如果捕获到 Stripe API 返回的错误
     */
    public static PaymentIntent charge(String customerId, long amount) throws StripeException {
        // 构造付款交易参数
        PaymentIntentCreateParams params = PaymentIntentCreateParams.builder()
                .setCustomer(customerId) // 使用客户 ID 作为付款目标
                .setAmount(amount) // 设置要收取的金额,以美分为单位
                .setCurrency("usd").setDescription("1").setReturnUrl("") // 设置货币类型:USD(美元)
                .build();
        // 创建付款交易
        PaymentIntent paymentIntent = PaymentIntent.create(params);
        // 确认付款
        paymentIntent.confirm();
        // 返回创建的 Stripe 付款交易对象
        return paymentIntent;
    }
//    private static final String STRIPE_API_KEY = "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";
//
//    public PaymentProcessor() {
//        // 初始化 Stripe 对象并设置 API 密钥
//        Stripe.apiKey = STRIPE_API_KEY;
//    }
//
//    /**
//     * 创建一个 Stripe 客户,并保存他们的信用卡信息,以备将来使用。
//     * 支持多种付款方式,例如支付宝、微信等。这里只是演示如何使用信用卡进行支付。
//     *
//     * @param email     客户电子邮件地址
//     * @param cardToken 由 Stripe.js 获取的信用卡令牌
//     * @return Stripe 客户对象
//     * @throws StripeException 如果创建客户或付款交易时出现错误
//     */
//    public Customer createCustomer(String email, String cardToken) throws StripeException {
//
//        // 构造付款交易参数
//        PaymentIntentCreateParams params = PaymentIntentCreateParams.builder()
//                .setAmount(1000L) // 设置要收取的金额,以美分为单位(例如 $10.00 = 1000 美分)
//                .setCurrency("usd") // 设置货币类型:USD(美元)
//                .setPaymentMethod(cardToken) // 设置由 Stripe.js 获取的信用卡令牌
//                .build();
//
//        // 创建付款交易
//        PaymentIntent paymentIntent = PaymentIntent.create(params);
//
//        // 创建一个 Stripe 客户,将他们的付款方法与 Stripe 帐户关联在一起
//        Customer customer = Customer.create(
//                CustomerCreateParams.builder()
//                        .setEmail(email) // 设置客户的电子邮件地址
//                        .setPaymentMethod(paymentIntent.getPaymentMethod()) // 将付款方法与客户端 Stripe 帐户相关联
//                        .build()
//        );
//
//        // 返回创建的 Stripe 客户对象
//        return customer;
//    }
//
//    /**
//     * 从一个 Stripe 客户处收取付款。
//     *
//     * @param customerId Stripe 客户 ID
//     * @param amount     要收取的金额,以美分为单位
//     * @return Stripe 付款交易对象
//     * @throws StripeException 如果捕获到 Stripe API 返回的错误
//     */
//    public static PaymentIntent charge(String customerId, long amount) throws StripeException {
//
//        // 构造付款交易参数
//        PaymentIntentCreateParams params = PaymentIntentCreateParams.builder()
//                .setCustomer(customerId) // 使用客户 ID 作为付款目标
//                .setAmount(amount) // 设置要收取的金额,以美分为单位
//                .setCurrency("usd").setDescription("1").setReturnUrl("") // 设置货币类型:USD(美元)
//                .build();
//
//        // 创建付款交易
//        PaymentIntent paymentIntent = PaymentIntent.create(params);
//
//        // 确认付款
//        paymentIntent.confirm();
//
//        // 返回创建的 Stripe 付款交易对象
//        return paymentIntent;
//    }
}