2014-01-03 2 views
5

Я работаю над интеграцией платежного шлюза Stripe в Android-приложении, которое я разрабатываю. Я выполнил шаги, перечисленные на https://stripe.com/docs/mobile/android.Интеграция с полосой в Android Studio

Когда я пытаюсь создать новую карту, я получаю ошибки.

я запускаю это в моей деятельности

saveButton.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View view) { 
    Card card = new Card(
    // Get values from the form 
    cardNumber.getText().toString(), 
    getInteger(monthSpinner), 
    getInteger(yearSpinner), 
    cvc.getText().toString() 
); 
} 
}); 

который использует модель карты.

модель карты

package com.stripe.android.model; 

import com.stripe.android.util.DateUtils; 
import com.stripe.android.util.TextUtils; 

public class Card extends com.stripe.model.StripeObject { 
String number; 
String cvc; 
Integer expMonth; 
Integer expYear; 
String name; 
String addressLine1; 
String addressLine2; 
String addressCity; 
String addressState; 
String addressZip; 
String addressCountry; 
String last4; 
String type; 
String fingerprint; 
String country; 

public String getNumber() { 
    return number; 
} 

public void setNumber(String number) { 
    this.number = number; 
} 

public String getCVC() { 
    return cvc; 
} 

public void setCVC(String cvc) { 
    this.cvc = cvc; 
} 

public Integer getExpMonth() { 
    return expMonth; 
} 

public void setExpMonth(Integer expMonth) { 
    this.expMonth = expMonth; 
} 

public Integer getExpYear() { 
    return expYear; 
} 

public void setExpYear(Integer expYear) { 
    this.expYear = expYear; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getAddressLine1() { 
    return addressLine1; 
} 

public void setAddressLine1(String addressLine1) { 
    this.addressLine1 = addressLine1; 
} 

public String getAddressLine2() { 
    return addressLine2; 
} 

public void setAddressLine2(String addressLine2) { 
    this.addressLine2 = addressLine2; 
} 

public String getAddressCity() { 
    return addressCity; 
} 

public void setAddressCity(String addressCity) { 
    this.addressCity = addressCity; 
} 

public String getAddressZip() { 
    return addressZip; 
} 

public void setAddressZip(String addressZip) { 
    this.addressZip = addressZip; 
} 

public String getAddressState() { 
    return addressState; 
} 

public void setAddressState(String addressState) { 
    this.addressState = addressState; 
} 

public String getAddressCountry() { 
    return addressCountry; 
} 

public void setAddressCountry(String addressCountry) { 
    this.addressCountry = addressCountry; 
} 

public String getLast4() { 
    if (!TextUtils.isBlank(last4)) { 
     return last4; 
    } 
    if (number != null && number.length() > 4) { 
     return number.substring(number.length() - 4, number.length()); 
    } 
    return null; 
} 

public String getType() { 
    if (TextUtils.isBlank(type) && !TextUtils.isBlank(number)) { 
     if (TextUtils.hasAnyPrefix(number, "34", "37")) { 
      return "American Express"; 
     } else if (TextUtils.hasAnyPrefix(number, "60", "62", "64", "65")) { 
      return "Discover"; 
     } else if (TextUtils.hasAnyPrefix(number, "35")) { 
      return "JCB"; 
     } else if (TextUtils.hasAnyPrefix(number, "30", "36", "38", "39")) { 
      return "Diners Club"; 
     } else if (TextUtils.hasAnyPrefix(number, "4")) { 
      return "Visa"; 
     } else if (TextUtils.hasAnyPrefix(number, "5")) { 
      return "MasterCard"; 
     } else { 
      return "Unknown"; 
     } 
    } 
    return type; 
} 

public String getFingerprint() { 
    return fingerprint; 
} 

public String getCountry() { 
    return country; 
} 

public Card(String number, Integer expMonth, Integer expYear, String cvc, String name, String addressLine1, String addressLine2, String addressCity, String addressState, String addressZip, String addressCountry, String last4, String type, String fingerprint, String country) { 
    this.number = TextUtils.nullIfBlank(normalizeCardNumber(number)); 
    this.expMonth = expMonth; 
    this.expYear = expYear; 
    this.cvc = TextUtils.nullIfBlank(cvc); 
    this.name = TextUtils.nullIfBlank(name); 
    this.addressLine1 = TextUtils.nullIfBlank(addressLine1); 
    this.addressLine2 = TextUtils.nullIfBlank(addressLine2); 
    this.addressCity = TextUtils.nullIfBlank(addressCity); 
    this.addressState = TextUtils.nullIfBlank(addressState); 
    this.addressZip = TextUtils.nullIfBlank(addressZip); 
    this.addressCountry = TextUtils.nullIfBlank(addressCountry); 
    this.last4 = TextUtils.nullIfBlank(last4); 
    this.type = TextUtils.nullIfBlank(type); 
    this.fingerprint = TextUtils.nullIfBlank(fingerprint); 
    this.country = TextUtils.nullIfBlank(country); 
} 

public Card(String number, Integer expMonth, Integer expYear, String cvc, String name, String addressLine1, String addressLine2, String addressCity, String addressState, String addressZip, String addressCountry) { 
    this(number, expMonth, expYear, cvc, name, addressLine1, addressLine2, addressCity, addressState, addressZip, addressCountry, null, null, null, null); 
} 

public Card(String number, Integer expMonth, Integer expYear, String cvc) { 
    this(number, expMonth, expYear, cvc, null, null, null, null, null, null, null, null, null, null, null); 
    this.type = getType(); 
} 

public boolean validateCard() { 
    if (cvc == null) { 
     return validateNumber() && validateExpiryDate(); 
    } else { 
     return validateNumber() && validateExpiryDate() && validateCVC(); 
    } 
} 

public boolean validateNumber() { 
    if (TextUtils.isBlank(number)) { 
     return false; 
    } 

    String rawNumber = number.trim().replaceAll("\\s+|-", ""); 
    if (TextUtils.isBlank(rawNumber) 
      || !TextUtils.isWholePositiveNumber(rawNumber) 
      || !isValidLuhnNumber(rawNumber)) { 
     return false; 
    } 

    if (!"American Express".equals(type) && rawNumber.length() != 16) { 
     return false; 
    } 

    if ("American Express".equals(type) && rawNumber.length() != 15) { 
     return false; 
    } 

    return true; 
} 

public boolean validateExpiryDate() { 
    if (!validateExpMonth()) { 
     return false; 
    } 
    if (!validateExpYear()) { 
     return false; 
    } 
    return !DateUtils.hasMonthPassed(expYear, expMonth); 
} 

public boolean validateExpMonth() { 
    if (expMonth == null) { 
     return false; 
    } 
    return (expMonth >= 1 && expMonth <= 12); 
} 

public boolean validateExpYear() { 
    if (expYear == null) { 
     return false; 
    } 
    return !DateUtils.hasYearPassed(expYear); 
} 

public boolean validateCVC() { 
    if (TextUtils.isBlank(cvc)) { 
     return false; 
    } 
    String cvcValue = cvc.trim(); 

    boolean validLength = ((type == null && cvcValue.length() >= 3 && cvcValue.length() <= 4) || 
      ("American Express".equals(type) && cvcValue.length() == 4) || 
      (!"American Express".equals(type) && cvcValue.length() == 3)); 


    if (!TextUtils.isWholePositiveNumber(cvcValue) || !validLength) { 
     return false; 
    } 
    return true; 
} 

private boolean isValidLuhnNumber(String number) { 
    boolean isOdd = true; 
    int sum = 0; 

    for (int index = number.length() - 1; index >= 0; index--) { 
     char c = number.charAt(index); 
     if (!Character.isDigit(c)) { 
      return false; 
     } 
     int digitInteger = Integer.parseInt("" + c); 
     isOdd = !isOdd; 

     if (isOdd) { 
      digitInteger *= 2; 
     } 

     if (digitInteger > 9) { 
      digitInteger -= 9; 
     } 

     sum += digitInteger; 
    } 

    return sum % 10 == 0; 
} 

private String normalizeCardNumber(String number) { 
    if (number == null) { 
    return null; 
    } 
    return number.trim().replaceAll("\\s+|-", ""); 
} 
} 

Это ошибка я получаю.

enter image description here

Это ново для меня. Что я могу сделать, чтобы решить эту проблему?

+1

Вы уверены, что используете правильную реализацию "Карточка"? Например, есть ли у вас правильный «импорт»? У вас есть конструктор в коде выше, который, как представляется, соответствует этому списку параметров, что говорит о том, что ваша IDE думает о какой-то другой «Карте». – CommonsWare

+0

Я подумал об этом. Я считаю, что импорт правильный. – localhost

+1

Пожалуйста, не вставляйте гигантский сброс кода в раздел, который не имеет ничего общего с проблемой. То, что мы * * должны видеть, - это конструктор (ы) для «Карты» и фактический импорт для вашей деятельности. – chrylis

ответ

4

Поскольку это самый популярный поиск в Google, «Как интегрировать Stripe в Android Studio», и поскольку студия Android удалила модуль импорта, я решил, что я решил импорт.

  • правой кнопкой мыши на проекте и выберите> New> Модуль
  • В ваших каталогах скопировать содержимое под полоской> папку нашивки в папку модуля (Вы должны увидеть вновь созданную папку. Удалить содержимое этой новой папки и вставьте содержимое Stripe> Stripe)
  • Назад к Android Studio перейти к build.gradle под src добавить проект компиляции (": stripe") в зависимости.
  • Обновите свою град.

EDIT 1 После публикации этого ответа произошли некоторые изменения. Если вы хотите добавить полоску в свой проект, сделайте это через Maven. Просто добавьте эту строку в build.gradle вашего приложения в разделе Зависимости:

compile 'com.stripe:stripe-android:2.0.2' 

Вы можете получить более подробную информацию здесь: https://stripe.com/docs/mobile/android

+0

добавление + Нехороший путь! – RobinHood

4

Хорошо, так что я верю, что у вас нет доступа к соответствующему конструктору Card(), потому что вы не правильно настроили его.

  1. Перейти на страницу GitHub и скачать по ссылке [для библиотеки] https://github.com/stripe/stripe-android. Распакуйте эту папку и сохраните ее.

  2. Теперь зайдите в студию android и нажмите «модуль импорта». Перейдите в эту директорию с полосой-андроидом, которую вы только что расстегнули, и нажмите «ОК». Убедитесь, что при импорте отмечен флажок «stripe», а не «пример» (только по умолчанию «пример»: исправить это.)

  3. Скопируйте jarfile stripe-java-1.12.0.jar в каталог: libs в вашем проекте (где у вас будут другие библиотеки). Этот jarfile должен появиться в новом каталоге «stripe» в студии Android.

  4. Зайдите в свою директорию src и найдите файл build.gradle вашего приложения. Вы собираетесь хотите добавить, при зависимостях:

    проект компиляции («:») полоса

Вы можете столкнуться с ошибкой в ​​какой-то момент о том, что вам нужна новая версия сборки инструментов для создания проекта. Если это так, просто начинайте рыться в файлах градиентов и менять числа до тех пор, пока они не строятся. Это то, что я делаю, по крайней мере.

Надеюсь, это поможет!

(пс: не забудьте включить com.stripe.android * и не com.stripe *..!)

Edit: Просто столкнулся с новой проблемой, и оказывается, что вы должны пропустить шаг 3. 'll заставит dex угадать, что один и тот же класс определяется в одном и том же файле jarfile дважды. Так что не делай этого.

2

Если вы не используете Gradle, то ниже, как я получил его на работу :

  1. Скачать зип из полосовой GitHub (полосового-андроид-мастера)
  2. импорта JUST папка нашивки в качестве модуля в ваш проект. Тебе не нужно ничего делать.
  3. Он добавлен в мой проект как «основной». Перейдите в структуру проекта -> модули и добавьте «главное» в качестве зависимости от модуля к вашему рабочему модулю.
  4. Нажмите на «основной» (stripe) модуль и установите флажок «Экспорт» в lib, чтобы ваш рабочий модуль имел доступ к нему
  5. ????
  6. Profit
0

Я только что точно такая же проблема, как ОП. Я импортировал некоторый вариант кода Stripe, но у меня не было конструктора с несколькими аргументами или каких-либо конкретных методов, которые я искал, поэтому я явно не импортировал то, что я хотел/нуждался.

Я пробовал многие из модулей импорта или добавления библиотек, найденных здесь или в другом месте. Наконец, собираюсь сдаться, я попытался отбить все меры: RTFM. Или, в этом случае README.md, который пришел с проектом, который я загрузил.

Там, для пользователей Android Studio, было тривиальное решение, что на самом деле работал на меня:

No need to clone the repository or download any files -- just add this line to your app's `build.gradle` inside the `dependencies` section: 

    compile 'com.stripe:stripe-android:+' 

Он работал как шарм.

Как ни странно, вы не должны загружать или клон использовать библиотеку, но до сих пор единственный способ, которым я знаю, чтобы получить README.md, чтобы загрузить файлы библиотеки отсюда: https://stripe.com/docs/mobile/android

РИСКОВАННАЯ: Я написал выше, как только Android-студия начала импортировать нужную библиотеку, и мои ошибки компиляции среды IDE исчезли. Но как только я попытался на самом деле построить и запустить свой код, я побежал в multiple dex horror, поскольку, по-моему, вытащил несколько копий библиотеки gson, от которой зависит Stripe, и мой код уже использует. Вздох.Я решил проблему, удалив свою локальную копию gson jar и, я полагаю, в зависимости от того, который находится в пакете stripe. Просто удалить все папки bin/intermediate/generated недостаточно. Я не очень доволен этим решением, но могу жить с ним на данный момент.

0

ну, для использования Stripe, вам не нужно ничего загружать с github или Stripe.com. Вот как я это делаю. Поскольку я не могу отправить изображение (только с 1 репутацией), ее destribed, как показано ниже:
1. Щелкните правую кнопку мыши на вашем проекте
2. нажмите Настройку Открыть модуль
3. Нажмите зависимости
4. Нажмите кнопку Добавить
5. нажмите выбрать Зависимости библиотек
6. вход "полоса"
7. поиск нажмите
8. нажмите com.stripe: stripe.android 1.0.0
9. нажмите кнопку OK.

+0

Спасибо, Тони. –

0
Card card = new Card(cardNumber.getText().toString(),getInteger(this.monthSpinner),getInteger(this.yearSpinner),cvc.getText().toString()); 

использовать это, фактический и формальный параметры не совпадают.

Благодаря

0

Для всех тех, кто не смог найти исправление с выше answers.Here, что я сделал, когда я столкнулся с такой же ситуацией.

  • Убедитесь, что вы Gradle зависимости как: компиляции 'com.stripe: полоса-андроид: +
  • В классе, где вы используете карты модельны удалить все операторы импорта полосы и затем нажмите на карты и убедитесь, что импорт из -

"com.stripe.android.model"

Надежность, что исправление проблемы. Спасибо.

Смежные вопросы