首页 文章

从Stripe Android API获取卡资金参数

提问于
浏览
1

我使用the Stripe Android API来处理移动应用程序中的付款 . 当用户注册该应用程序时,将根据其信用卡信息生成条带令牌 . 根据项目的要求,应用程序需要拒绝使用预付信用卡 . 不幸的是,Android API无法访问条带标记返回的 Card 对象的 funding 参数 . 此参数表示卡已预付,借记或贷记的天气 .

有谁知道如何在Android上访问此信息?如果使用Stripe Android API无法做到这一点,那么我是否可以直接访问从Stripe API返回的JSON对象?

2 回答

  • 0

    Stripe Android bindings不直接从API(具有您感兴趣的 funding 属性)公开card object,但您可以使用Java bindings通过令牌ID检索它 . 这样的事情应该有效:

    public void onSuccess(Token token) {
        com.stripe.model.Token stripeToken = com.stripe.model.Token.retrieve(token.getId(), publishableKey);
        com.stripe.model.Card stripeCard = stripeToken.getCard();
        if (stripeCard.getFunding().equals("prepaid") {
            // Reject card
        }
    }
    

    请注意,这基本上是Android绑定在创建令牌时所做的事情(请参阅here) .

    编辑:经过进一步调查后,我不太确定上述内容是否有效 . 虽然Android绑定中有一个 requestToken() 方法,它使用可发布的密钥调用retrieve token API(请参阅here),但我认为它实际上并不起作用 . 使用可发布密钥调用此 endpoints 会导致错误,指示应使用密钥 . (我想这是一个未记录的行为,在某些时候被删除了 . )

    如果是这种情况,那么我想你有两个选择:

    • 修补Android绑定以从Android对象中可用的API对象创建 funding 属性(在创建时),或者

    • 检查服务器端 .

  • 3

    那这个呢?我使用了Ywain的答案并将其放入Async中,就像Stripe SDK一样 . 适合我 .

    private class CreateStripeTokenTask extends AsyncTask<Void, Void, com.stripe.model.Token> {
    
        private Map<String, Object> mMap;
        protected CreateStripeTokenTask(Card card) {
            mMap = hashMapFromCard(card);
        }
    
        @Override
        protected com.stripe.model.Token doInBackground(Void... params) {
            try
            {
                RequestOptions requestOptions = RequestOptions.builder().setApiKey(<YOUR_STRIPE_PUBLISHABLE_KEY>).build();
                com.stripe.model.Token stripeToken = com.stripe.model.Token.create(mMap, requestOptions);
                return stripeToken;
            }
            catch (Exception e)
            {
                return null;
            }
    
        }
    
        protected void onPostExecute(com.stripe.model.Token stripeToken) {
            if (stripeToken != null && stripeToken.getCard() != null)
            {
                if ("prepaid".equals(stripeToken.getCard().getFunding()))
                {
                    //error - prepaid cards are not eligible
    
                }
                else
                {
                    //card is fine
                }
            }
        }
    
        private Map<String, Object> hashMapFromCard(Card card) {
            Map<String, Object> tokenParams = new HashMap<>();
    
            Map<String, Object> cardParams = new HashMap<>();
            cardParams.put("number", TextUtils.nullIfBlank(card.getNumber()));
            cardParams.put("cvc", TextUtils.nullIfBlank(card.getCVC()));
            cardParams.put("exp_month", card.getExpMonth());
            cardParams.put("exp_year", card.getExpYear());
            cardParams.put("name", TextUtils.nullIfBlank(card.getName()));
            cardParams.put("currency", TextUtils.nullIfBlank(card.getCurrency()));
            cardParams.put("address_line1", TextUtils.nullIfBlank(card.getAddressLine1()));
            cardParams.put("address_line2", TextUtils.nullIfBlank(card.getAddressLine2()));
            cardParams.put("address_city", TextUtils.nullIfBlank(card.getAddressCity()));
            cardParams.put("address_zip", TextUtils.nullIfBlank(card.getAddressZip()));
            cardParams.put("address_state", TextUtils.nullIfBlank(card.getAddressState()));
            cardParams.put("address_country", TextUtils.nullIfBlank(card.getAddressCountry()));
    
            // Remove all null values; they cause validation errors
            for (String key : new HashSet<>(cardParams.keySet())) {
                if (cardParams.get(key) == null) {
                    cardParams.remove(key);
                }
            }
    
            tokenParams.put("card", cardParams);
            return tokenParams;
        }
    }
    

相关问题