从Stripe Android API获取卡资金参数

时间:2015-09-06 17:38:58

标签: android stripe-payments

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

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

2 个答案:

答案 0 :(得分:3)

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

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),但我认为它确实无效。使用可发布密钥调用此端点会导致错误,指示应使用密钥。 (我想这是一个未记录的行为,在某些时候被删除了。)

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

  • 修补Android绑定以从Android对象中可用的API对象生成funding属性(在创建时),或
  • 进行服务器端检查。

答案 1 :(得分:0)

这个怎么样?我使用了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;
    }
}