Bande Intégration dans Android Studio
Je suis en train d'intégrer la Bande de la passerelle de paiement dans une application Android que je suis en train d'élaborer. J'ai suivi les étapes indiquées sur https://stripe.com/docs/mobile/android.
Lorsque j'essaie de créer une nouvelle carte, j'obtiens une erreur.
Je l'exécute dans mon activité
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()
);
}
});
Qui utilise le modèle de la Carte.
Modèle de carte
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+|-", "");
}
}
C'est l'erreur que j'obtiens.
C'est nouveau pour moi. Que puis-je faire pour résoudre ce problème?
- Êtes-vous sûr que vous utilisez le bon
Card
mise en œuvre? Par exemple, avez-vous le droitimport
? Vous disposez d'un constructeur dans le code ci-dessus qui semble correspondre à cette liste de paramètres, ce qui suggère que votre IDE est la pensée de certains autresCard
. - J'ai pensé à ça. Je crois que l'importation est correct.
- Merci de ne pas coller un géant du code de vidage de la section qui n'a rien à voir avec la question. Ce que nous avons besoin de voir le constructeur(s) pour
Card
et les importations réelles pour votre activité. - votre commentaire semble inutilement sévère. Combien de fois une affiche d'obtenir réprimandé pour ne pas donner assez de détails? Et, dans tous les cas, le code et la capture d'écran m'a dit que j'avais trouvé exactement le même problème j'ai essayé de résoudre. Bien sûr, après cela, il a fallu une heure de travail acharné à essayer un tas d'options proposées ci-dessous et d'ailleurs, et puis, enfin, qui trébuchent sur les 30 secondes de corriger. (Voir ma réponse ci-dessous.)
- je suis en train de faire la même chose, j'ai un doute, après l'obtention du jeton où le paiement sera effectué, que ce soit du côté client ou côté serveur
- je pense qu'ils ont enlevé les constructeurs de la nouvelle mise à jour. u obtenir toute solution pour cela ? j'ai aussi ce problème...
Vous devez vous connecter pour publier un commentaire.
Puisque c'est un top hit sur la recherche Google pour "Comment intégrer la Bande à Android Studio" et depuis Android studio supprimé le module d'import c'est comment j'ai résolu l'importation.
EDIT 1
Puisque l'envoi de cette réponse, certains changements ont eu lieu. Si vous souhaitez ajouter de la bande dans votre projet de le faire via Maven. Il suffit d'ajouter cette ligne à votre application construire.gradle à l'intérieur de la section des dépendances:
EDIT 2 C'est maintenant la mise en œuvre et de ne pas compiler.
Vous pouvez obtenir plus de détails ici : https://stripe.com/docs/mobile/android
D'accord, alors je crois que ce qui se passe, c'est que vous n'avez pas accès à la Carte appropriée() constructeur parce que vous n'avez pas réglé les choses correctement.
Aller à la page github et télécharger le lien [la bibliothèque]https://github.com/stripe/stripe-android. Décompressez le dossier et de le garder à portée de main.
Maintenant, allez dans android studio, puis cliquez sur "importer le module'. Naviguer dans cette bande-android répertoire que vous venez de décompresser, et cliquez sur ok. Assurez-vous d'avoir la "bande" est cochée lors de l'importation, et non pas "l'exemple" (seulement "exemple" est cochée par défaut: résoudre ce problème.)
Copiez le jarfiles stripe-java-1.12.0.jar le répertoire :libs dans votre projet (où vous auriez d'autres bibliothèques). Que jarfiles devrait s'afficher en vertu de la nouvelle bande-répertoire dans le répertoire android studio.
Allez dans votre répertoire src et de trouver votre app de construire.gradle. Vous allez à ajouter, en vertu de dépendances:
de la compilation du projet(":bande")
Vous risquez de rencontrer un message d'erreur à un certain point, en disant que vous avez besoin d'une version plus récente de créer des outils pour construire le projet. Si c'est le cas, il suffit de commencer à fouiller dans les gradle fichiers et de changer les numéros jusqu'à ce qu'il construit. C'est ce que je fais, au moins.
Espérons que cette aide!
(p.s: n'oubliez pas d'inclure com.rayure.android.* et pas com.de bande.*!)
Edit: Viens de tomber sur un nouveau problème, et il s'avère que vous devez passer à l'étape 3. Il va provoquer des dex de freak que la même classe est définie dans le même jarfiles deux fois. Afin de ne pas le faire.
Si vous n'êtes pas à l'aide de Gradle puis ci-dessous comment j'ai réussi à le faire fonctionner:
Je viens d'avoir exactement le même problème que l'OP. J'ai été de l'importation de certains variante de la Bande de code, mais n'ont pas le multi-argument du constructeur ou de l'un quelconque des méthodes spécifiques que je cherchais, donc je ne s'agissait manifestement pas l'importation de ce que je voulais/nécessaire.
J'ai essayé beaucoup de Module d'Importation ou d'Ajouter de la Bibliothèque des incantations trouvés ici ou ailleurs. Enfin, sur le point d'abandonner, j'ai essayé que la plus désespérée de toutes les mesures: RTFM. Ou, dans ce cas, le fichier README.md qui est venu avec le projet que j'ai téléchargé.
Là, pour Android Studio utilisateurs, a été la solution triviale qui a effectivement travaillé pour moi:
Il a travaillé comme un charme.
Ironiquement, vous n'avez pas à télécharger ou clone d'UTILISER la bibliothèque, mais jusqu'à présent, le seul moyen que je connaisse pour obtenir le fichier README.md est de télécharger les fichiers de bibliothèque à partir d'ici:
https://stripe.com/docs/mobile/android
Mise en garde: j'ai écrit ci-dessus dès que Android Studio a commencé à importer la bibliothèque de droit et mon IDE des erreurs de compilation s'en alla. Mais dès que j'ai essayé de construire et de faire fonctionner mon code, j'ai couru la tête sur l' plusieurs dex horreur pour, je crois, tirer plusieurs copies de la gson bibliothèque de Bande dépend et mon code utilise déjà. Soupir. Je N'ai corrigé le problème en supprimant ma copie locale de la gson jar et, je présume, en fonction de celui qui se trouve avec la bande de package. Tout simplement en supprimant toutes les bin/intermédiaire/dossiers générés n'était pas assez bon. Je ne suis pas vraiment heureux avec cette solution, mais il peut vivre avec elle pour l'instant.
bien, à l'utilisation d'une Bande, vous n'avez pas besoin de télécharger quoi que ce soit à partir de github ou Stripe.com.
Voici comment je le fais.
Depuis je ne peux pas poster d'image (avec seulement 1 réputation), son destribed comme ci-dessous:
1. Clic-droit sur votre projet
2. cliquez sur Ouvrir les Paramètres du Module
3. Cliquez sur les dépendances
4. cliquez sur ajouter
5. cliquez sur choisir les dépendances de la bibliothèque
6. d'entrée "bande"
7. cliquez sur rechercher
8. cliquez sur com.bande de bande de.android 1.0.0
9. cliquez sur OK.
utiliser le présent, le réel et le paramètre formel ne correspondent pas.
Grâce
Pour tous ceux qui ne pouvaient pas trouver une solution avec les réponses ci-dessus.Voici ce que j'ai fait lorsque j'ai été confrontée à la même situation.
Espère que résout le problème.Grâce