stripe支付 旧版 charge付款方式 demo代码

stripe支付 新版paymentIntent(付款意图) demo代码 可参考.

特点:

1.实现客户绑卡,解卡等
2.全部由服务端进行操作,前端可自定义绑卡,无需使用stripe SDK收集卡信息
3.用户授权进行冻结银行卡的资金,然后 订单结算时进行捕获花费的金额并解冻其余冻结的金额
/**
 * @program: test
 * @description: stripe 支付charge方式 旧版
 * @author: 闲走天涯
 * @create: 2021-09-02 13:48
 */
public class ChargeTest {
	// key格式 sk_test开头为测试环境key,sk_live开头为生产环境key
    private static final String privateKey = "test_key";

    /**
     * 创建token
     * 用于卡信息加密
     * @param creditCard
     * @return
     */
    public static Token createToken(CreditCard creditCard){
        try{
            Stripe.apiKey = privateKey;
            Map<String, Object> cardParam = new HashMap<>();
            Map<String, Object> card = new HashMap<>();
            card.put("exp_month",creditCard.getCardExpiryMonth());
            card.put("exp_year",creditCard.getCardExpiryYear());
            card.put("number",creditCard.getCardNo());
            card.put("cvc",creditCard.getCvv());
            card.put("name",creditCard.getName());
            cardParam.put("card", card);
            Token token = Token.create(cardParam);
            if(token != null && VerifyData.strIsNotNull(token.getId())){
                return token;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 创建stripe客户对象并绑定银行卡信息
     * @param tokenId 加密后的卡信息token对象id
     * @param email
     * @param name
     * @return
     */
    public static Customer createCustomer(String tokenId,String email,String name){
        Stripe.apiKey = privateKey;
        try {
            //创建客户并绑定支付卡信息
            Map<String, Object> customerParams = new HashMap<>();
            customerParams.put("source", tokenId);
            if(VerifyData.strIsNotNull(email)){
                customerParams.put("email",email);
            }
            if(VerifyData.strIsNotNull(name)){
                customerParams.put("name",name);
            }
            Customer customer = Customer.create(customerParams);
            if(customer!=null && VerifyData.strIsNotNull(customer.getId())) {
                return customer;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 删除stripe客户对象
     * @param customerId stripe客户对象id
     * @return
     */
    public static Customer deleteCustomer(String customerId){
        Stripe.apiKey = privateKey;
        try {
            //检索对象
            Customer customer = Customer.retrieve(customerId);
            //删除
            Customer customer1 = customer.delete();
            return customer1;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 创建 支付(授权冻结卡资金或者 直接扣款)
     * @param orderCode 订单编号
     * @param frozenAmount 需要授权的金额
     * @param customerId stripe客户对象id
     * @return
     */
    public static Charge createCharge(String orderCode, Double frozenAmount, String customerId){
        try{
            Stripe.apiKey = privateKey;
            //以分为单位
            BigDecimal decimalAmount = new BigDecimal(frozenAmount);
            decimalAmount = decimalAmount.multiply(new BigDecimal(100));

            Map<String, Object> params = new HashMap<>();
            //金额
            params.put("amount", decimalAmount.intValue());
            //货币符号 巴西雷亚尔
            params.put("currency", "BRL");
            //是否立即扣款
            params.put("capture", false);
            //客户id
            params.put("customer", customerId);
            //描述前缀
            params.put("statement_descriptor_suffix", "c:"+orderCode);
            //完整描述 必须带字母 且不超过22字符
            params.put("statement_descriptor", "amount "+decimalAmount.intValue());
            Charge charge = Charge.create(params);
            System.out.println("create charge请求结果="+ JSON.toJSONString(charge));
            if(charge!=null && VerifyData.strIsNotNull(charge.getId())) {
                return charge;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 捕获金额或撤销冻结
     * @return
     */
    public static Charge captureCharge(String chargeId, Double captureAmount){
        try{
            Stripe.apiKey = privateKey;
            //检索
            Charge charge = Charge.retrieve(chargeId);

            Charge charge2 = null;
            if(captureAmount==0){//撤销
                ChargeTest.cancelCharge(chargeId);
                charge2 = Charge.retrieve(chargeId);
            }else{//捕获
                //以分为单位
                BigDecimal decimalAmount = new BigDecimal(captureAmount);
                decimalAmount = decimalAmount.multiply(new BigDecimal(100));

                Map<String, Object> chargeParam = new HashMap<>();
                chargeParam.put("amount", decimalAmount.intValue());
                charge2 = charge.capture(chargeParam);
            }
            System.out.println("capture charge请求结果="+ JSON.toJSONString(charge2));
            if(charge2!=null && VerifyData.strIsNotNull(charge2.getId())) {
                return charge2;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 取消支付
     * @param chargeId
     * @return
     */
    public static Refund cancelCharge(String chargeId){
        try{
            Stripe.apiKey = privateKey;
            Map<String, Object> refundParam = new HashMap<>();
            refundParam.put("charge", chargeId);
            Refund refund = Refund.create(refundParam);
            System.out.println("退款请求结果="+ JSON.toJSONString(refund));
            if(refund!=null && VerifyData.strIsNotNull(refund.getId())) {
                return refund;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 退款
     * @param chargeId
     * @return
     */
    public static Refund refundCharge(String chargeId,Double amount){
        try{
            if(amount<=0){
                System.out.println("金额不能低于等于0");
                return null;
            }
            Stripe.apiKey = privateKey;
            //以分为单位
            BigDecimal refundAmount = new BigDecimal(amount);
            refundAmount = refundAmount.multiply(new BigDecimal(100));

            Map<String, Object> refundParam = new HashMap<>();
            refundParam.put("charge", chargeId);
            refundParam.put("amount", refundAmount);
            Refund refund = Refund.create(refundParam);
            System.out.println("退款请求结果="+ JSON.toJSONString(refund));
            if(refund!=null && VerifyData.strIsNotNull(refund.getId())) {
                return refund;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 检索
     * @param chargeId
     * @return
     */
    public static Charge retrieveCharge(String chargeId){
        try{
            Stripe.apiKey = privateKey;
            Charge charge = Charge.retrieve(chargeId);
            System.out.println("检索请求结果="+ JSON.toJSONString(charge));
            if(charge!=null && VerifyData.strIsNotNull(charge.getId())) {
                return charge;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) throws StripeException {
        String orderCode = "21163056451908210952";//订单编号
        Double frozenAmount = 100d;//授权冻结的资金
        Double captureAmout = 0d;//需要扣款的金额
        CreditCard creditCard = new CreditCard();
        creditCard.setCardNo("4242424242424242");
        creditCard.setCardExpiryYear("2026");
        creditCard.setCardExpiryMonth("8");
        creditCard.setCvv("123");
        creditCard.setEmail("test_user_123456@testuser");
        creditCard.setName("qatest123456");

        //1.创建token,加密卡信息
        Token token = ChargeTest.createToken(creditCard);
        if(token==null){
            System.out.println("获取token失败");
        }
        //2.创建客户对象 并绑卡
        Customer customer = ChargeTest.createCustomer(token.getId(),creditCard.getEmail(),creditCard.getName());
        if(customer==null){
            System.out.println("获取customer失败");
        }
        //3.创建支付对象
        Charge charge = ChargeTest.createCharge(orderCode,frozenAmount,customer.getId());
        if(charge==null){
            System.out.println("获取charge失败");
        }
        //4.捕获或撤销授权
        Charge charge2 = ChargeTest.captureCharge(charge.getId(),captureAmout);
        //5.退款
        Refund refund = ChargeTest.refundCharge(charge.getId(),captureAmout);

        ChargeTest.retrieveCharge(charge.getId());
    }
}

@Data
class CreditCard {
    private String cardNo; //卡号
    private String cardExpiryYear;//过期年
    private String cardExpiryMonth;//过期月
    private String cvv;
    private String email;//邮箱
    private String name;//名称
}

更多推荐

stripe支付 旧版 charge付款方式 demo代码