2015-09-06 72 views
1

我使用the Stripe Android API來處理移動應用程序中的付款。當用戶註冊應用程序時,會根據信用卡信息生成條紋標記。根據項目的要求,應用程序需要拒絕使用預付費信用卡。不幸的是,Android API不允許訪問從條帶標記返回的Card對象的參數funding。該參數指明卡片預付,借記或貸記卡。從Stripe Android API獲取卡資金參數

有誰知道如何在Android上訪問這些信息?如果這不可能使用Stripe Android API,那麼無論如何我可以直接訪問從Stripe API返回的JSON對象?

回答

3

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),但我認爲它實際上不起作用。使用可發佈密鑰調用此端點會導致指示應使用密鑰的錯誤。 (我想這是在某一點取出一個無證的行爲。)

如果是這樣的話,那麼我想你有兩個選擇:

  • 補丁的Android綁定,使從funding財產Android對象中可用的API對象(創建時)或
  • 使檢查服務器端。
+0

難道這沿側使用了Android綁定或我需要專門使用Java綁定? –

+0

你應該可以使用這兩個。據我所知,Java綁定無論如何都是Android綁定的依賴! – Ywain

+0

感謝您的更新。我試圖使用這種方法,但遇到了您在編輯中描述的錯誤。在這一點上,我只是做檢查服務器端。 –

0

這是怎麼回事?我使用Ywain的答案,並將其放入像Stripe SDK那樣的Async。適用於我。

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; 
    } 
}