我使用the Stripe Android API来处理移动应用中的付款。当用户注册该应用程序时,将根据其信用卡信息生成条带令牌。根据项目的要求,应用程序需要拒绝使用预付信用卡。遗憾的是,Android API无法访问条带标记返回的funding
对象的Card
参数。此参数表示卡已预付,借记或贷记的天气。
有谁知道如何在Android上访问此信息?如果使用Stripe Android API无法做到这一点,那么我是否可以直接访问从Stripe API返回的JSON对象?
答案 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),但我认为它确实无效。使用可发布密钥调用此端点会导致错误,指示应使用密钥。 (我想这是一个未记录的行为,在某些时候被删除了。)
如果是这种情况,那么我想你有两个选择:
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;
}
}