Я пытаюсь создать новую привязку для 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&lt;com.stripe.android.PaymentAuthWebViewStarter.Data&gt;" jni-type="Lcom/stripe/android/view/AuthActivityStarter&lt;Lcom/stripe/android/PaymentAuthWebViewStarter$Data;&gt;;">
  </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="&quot;auth_url&quot;" 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="&quot;client_secret&quot;" 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="&quot;return_url&quot;" 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="&quot;ui_customization&quot;" 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 / дерево / мастер Вы более чем приветствуете его и попытаетесь решить эту проблему.

0
Guillermo Gerard 15 Авг 2019 в 05:47

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. Поэтому, если вы собираетесь использовать эту привязку, пожалуйста, проверьте ее полностью и дайте мне знать, если что-то пойдет не так

0
Guillermo Gerard 17 Авг 2019 в 16:26

Собираетесь ли вы создать привязку для iOS?

0
Paulo Ortins 28 Авг 2019 в 12:47