Я пытаюсь создать новую привязку для Stripe Android SDK, потому что привязки устарели и не имеют аутентификации SCA, недавно выпущенной новой функции, которая потребуется на рынках ЕС.
Информация о полосах: https://stripe.com/docs/mobile/android Репозиторий полос: https://github.com/stripe/stripe-android
Я использую последнюю версию, доступную сегодня, 10.2.1, и у меня осталась только одна ошибка:
Ошибка CS0103 Имя «Пуск» не существует в текущем контексте
У меня есть некоторый опыт создания привязок для Android, но этот трудно решить:
Если я иду в автоматически сгенерированный класс, где сообщается об ошибке -PaymentAuthWebViewStarter- я вижу это:
// This method is explicitly implemented as a member of an instantiated Com.Stripe.Android.View.IAuthActivityStarter
void global::Com.Stripe.Android.View.IAuthActivityStarter.Start (global::Java.Lang.Object p0)
{
Start (global::Java.Interop.JavaObjectExtensions.JavaCast<global::Com.Stripe.Android.PaymentAuthWebViewStarter.Data>(p0));
}
Но там нет кода для запуска. Ожидается, потому что api.xml покажет мне следующий код для этого класса:
<class abstract="false" deprecated="not deprecated" extends="java.lang.Object" extends-generic-aware="java.lang.Object" jni-extends="Ljava/lang/Object;" final="false" name="PaymentAuthWebViewStarter" static="false" visibility="public" jni-signature="Lcom/stripe/android/PaymentAuthWebViewStarter;">
<implements name="com.stripe.android.view.AuthActivityStarter" name-generic-aware="com.stripe.android.view.AuthActivityStarter<com.stripe.android.PaymentAuthWebViewStarter.Data>" jni-type="Lcom/stripe/android/view/AuthActivityStarter<Lcom/stripe/android/PaymentAuthWebViewStarter$Data;>;">
</implements>
<field deprecated="not deprecated" final="true" name="EXTRA_AUTH_URL" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value=""auth_url"" visibility="public" volatile="false">
</field>
<field deprecated="not deprecated" final="true" name="EXTRA_CLIENT_SECRET" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value=""client_secret"" visibility="public" volatile="false">
</field>
<field deprecated="not deprecated" final="true" name="EXTRA_RETURN_URL" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value=""return_url"" visibility="public" volatile="false">
</field>
<field deprecated="not deprecated" final="true" name="EXTRA_UI_CUSTOMIZATION" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value=""ui_customization"" visibility="public" volatile="false">
</field>
</class>
Как видите, нет никакого следа от любого метода Start. интерфейс объявлен и имеет ожидаемую сигнатуру метода Start, как показано ниже:
<interface abstract="true" deprecated="not deprecated" final="false" name="AuthActivityStarter" static="false" visibility="public" jni-signature="Lcom/stripe/android/view/AuthActivityStarter;">
<typeParameters>
<typeParameter name="StartDataType" classBound="java.lang.Object" jni-classBound="Ljava/lang/Object;"></typeParameter>
</typeParameters>
<method abstract="true" deprecated="not deprecated" final="false" name="start" jni-signature="(Ljava/lang/Object;)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
<parameter name="p0" type="StartDataType" jni-type="TStartDataType;">
</parameter>
</method>
</interface>
С другой стороны, если я смотрю на классы .aar с помощью JD-GUI (декомпилятор java), я вижу, что Start определен в классе PaymentAuthWebViewStarter:
public void start(@NonNull Data data)
{
Bundle extras = new Bundle();
extras.putString("client_secret", data.mClientSecret);
extras.putString("auth_url", data.mUrl);
extras.putString("return_url", data.mReturnUrl);
extras.putParcelable("ui_customization", this.mToolbarCustomization);
this.mHost.startActivityForResult(PaymentAuthWebViewActivity.class, extras, this.mRequestCode);
}
Мои вопросы:
Почему этот метод не генерируется как любой другой метод в любом другом классе?
Как решить эту проблему?
Я оставил свой код здесь: https: // github. ком / Гильермо - Gerard / stripe.android.sdk.binding / дерево / мастер Вы более чем приветствуете его и попытаетесь решить эту проблему.
2 ответа
Что ж, после еще нескольких попыток я исправлю свою проблему, но пока не знаю, почему это произошло.
Изменения уже опубликованы в репо, но на всякий случай это кому-нибудь поможет: мне нужно добавить частичный класс в дополнениях, чтобы реализовать вызов отсутствующего члена, например так:
namespace Com.Stripe.Android
{
// This class fixes the Error CS0103 The name 'Start' does not exist in the current context
public partial class PaymentAuthWebViewStarter : global::Java.Lang.Object
{
internal new static readonly JniPeerMembers _members1 = new XAPeerMembers("com/stripe/android/PaymentAuthWebViewStarter", typeof(PaymentAuthWebViewStarter));
// Metadata.xml XPath method reference: path="/api/package[@name='com.stripe.android']/class[@name='PaymentAuthWebViewStarter']/method[@name='start' and count(parameter)=1 and parameter[1][@type='com.stripe.android.PaymentAuthWebViewStarter.Data']]"
[Register("start", "(Lcom/stripe/android/PaymentAuthWebViewStarter$Data;)V",
"GetStart_Lcom_stripe_android_PaymentAuthWebViewStarter_Data_Handler")]
public virtual unsafe void Start(global::Com.Stripe.Android.PaymentAuthWebViewStarter.Data data)
{
const string __id = "start.(Lcom/stripe/android/PaymentAuthWebViewStarter$Data;)V";
try
{
JniArgumentValue* __args = stackalloc JniArgumentValue[1];
__args[0] = new JniArgumentValue(
(data == null) ? IntPtr.Zero : ((global::Java.Lang.Object) data).Handle);
_members1.InstanceMethods.InvokeVirtualVoidMethod(__id, this, __args);
}
finally
{
}
}
}
}
И это все, это решает проблему компиляции, и я смог сгенерировать dll. После включения его в проект появляются новые ошибки, но теперь они устранены.
Отказ от ответственности: Я еще не полностью протестировал привязку, я только уверен, что она может быть включена в проект и что информация о кредитной карте может быть введена с помощью виджета полос. Я еще не проверял ни поведение SCA, ни аутентификацию 3DS. Поэтому, если вы собираетесь использовать эту привязку, пожалуйста, проверьте ее полностью и дайте мне знать, если что-то пойдет не так
Собираетесь ли вы создать привязку для iOS?
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.