java - 如何解决 Stripe xamarin 绑定(bind)错误? (CS0103 名称 'Start' 在当前上下文中不存在)

标签 java c# android xamarin stripe-payments

我正在尝试为 Stripe Android SDK 建立新的绑定(bind),因为现有的绑定(bind)已经过时并且缺乏 SCA 身份验证,而 SCA 身份验证是最近发布的一项新功能,欧盟市场将需要该功能。

Stripe 信息:https://stripe.com/docs/mobile/android Stripe 存储库:https://github.com/stripe/stripe-android

我使用的是今天可用的最后一个版本,即 10.2.1,并且只剩下一个错误:

Error CS0103 The name 'Start' does not exist in the current context

我有一些为 Android 进行绑定(bind)的经验,但这个问题很难解决:

如果我转到报告错误的自动生成的类 -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));
    }

但是那里没有 Start 的代码。这是预期的,因为 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 方法的痕迹。该接口(interface)已声明并具有预期的 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>

另一方面,如果我使用 JD-GUI(java 反编译器)查看 .aar 类,我可以看到 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.com/guillermo-gerard/stripe.android.sdk.binding/tree/master 非常欢迎您 fork 它并尝试解决这个问题。

最佳答案

好吧,再努力一点之后,我会解决我的问题,但我还不确定为什么会发生这种情况。

这些更改已在存储库中发布,但以防万一它对任何人都有帮助:我必须在 Additions 中添加一个部分类来实现对缺失成员的调用,如下所示:

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 了。 将其包含到项目中后,出现新错误,但现在已解决。

免责声明:我还没有完全测试绑定(bind),我只是确定它可以包含在项目中,并且可以使用 Stripe 小部件输入信用卡信息。我尚未测试 SCA 行为或 3DS 身份验证。因此,如果您打算使用此绑定(bind),请对其进行全面测试,如果出现任何问题请告诉我

关于java - 如何解决 Stripe xamarin 绑定(bind)错误? (CS0103 名称 'Start' 在当前上下文中不存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57504300/

相关文章:

java - 菜鸟问题 - 我可以编写一个脚本来为我们的内部云软件执行操作吗?

java - 快速获取屏幕像素信息

java - 如何在没有 null 的情况下处理链中可能的空值(无模型技巧)?

android - 将数据从 Web 服务加载到 ListView 的最佳方法

java - Apache Beam 管道从 csv 文件读取、拆分、groupbyKey 并写入文本文件时出现 "IllegalStateException"错误。为什么?

java - 如何使用 gl.glTranslatef() 定期更改坐标?

c# - wpf getter 和 setter

c# - 使用 C# 在 webbrowser 控件中获取 HTML 元素的绝对位置

c# - 我想做一个文本框区域,自动剪切一个长段落

javascript - 为什么Android上的javascript执行顺序不一致