没有适合 Stripe 的构造函数

Posted

技术标签:

【中文标题】没有适合 Stripe 的构造函数【英文标题】:No suitable constructor for Stripe 【发布时间】:2020-01-06 12:57:44 【问题描述】:

我得到的错误是 错误:没有找到适合 Stripe(StripeFormActivity,String) 的构造函数 构造函数 Stripe.Stripe() 不适用 (实际参数列表和形式参数列表的长度不同) 构造函数 Stripe.Stripe(String) 不适用 (实际参数列表和形式参数列表的长度不同)

Stripe stripe=new Stripe(StripeFormActivity.this,PUBLISHABLE_KEY);
                    stripe.createToken(
                    card,

                    new TokenCallback() 
                        public void onSuccess(Token token) 
                            //getTokenList().addToList(token);

                            ProgressDialog.cancel();
                            cusRotateLoading.stop();

                            Log.d("token", "token = " + token.getId());
                            Intent ri = new Intent();
                            ri.putExtra("stripe_id", token.getId());
                            setResult(2, ri);
                            finish();
                        




                            public void onError(Exception error) 
                                ProgressDialog.cancel();
                                cusRotateLoading.stop();
                                Common.showMkError(StripeFormActivity.this, error.getLocalizedMessage());
                            
                        );

【问题讨论】:

嗯,你为什么要通过StripeFormActivity.this?据我所知,这个论点应该是Context。例如,尝试传递new Stripe(getApplicationContext(),PUBLISHABLE_KEY);,但基本上你应该传递一个上下文。 【参考方案1】:

这里是 kotlin 版本

Stripe(this, stripePublicKey).createToken(card, object : ApiResultCallback<Token> 
                override fun onSuccess(token: Token) 

                    if (token.card != null) 

                     else 
                        Utils.showToast(getString(R.string.something_went_wrong), this)
                    
                

                override fun onError(error: Exception) 
                    Utils.showToast(error.localizedMessage, this)
                
            )

这里是java版本

new Stripe(this, stripePublicKey).createToken(card, new ApiResultCallback<Token> 
                        override onSuccess(Token:token) 

                            if (token.card != null) 

                             else 
                                Utils.showToast(getString(R.string.something_went_wrong), this)
                            
                        

                        override onError(Exception:error) 
                            Utils.showToast(error.localizedMessage, this)
                        
                    )

【讨论】:

【参考方案2】:

TokenCallback() 更改为新的ApiResultCallback&lt;Token&gt;()。导入com.stripe.android.ApiResultCallback 并获取当前最新版本的11.1.3

所以修改后会是这样的

Stripe stripe=new Stripe(StripeFormActivity.this,PUBLISHABLE_KEY);

                        stripe.createToken(
                                cardToSave,
                                new ApiResultCallback<Token>() 
                                    public void onSuccess(@NonNull Token token) 
                                        //getTokenList().addToList(token);

                                        ProgressDialog.cancel();
                                        cusRotateLoading.stop();

                                        Log.d("token", "token = " + token.getId());
                                        Intent ri = new Intent();
                                        ri.putExtra("stripe_id", token.getId());
                                        setResult(2, ri);
                                        finish();
                                    
                                    public void onError(@NonNull Exception error) 
                                        ProgressDialog.cancel();
                                        cusRotateLoading.stop();
                                        Common.showMkError(StripeFormActivity.this, error.getLocalizedMessage());
                                    
                                
                        );

【讨论】:

错误:不兼容的类型:> 无法转换为 TokenCallbac 在你的 app.gradle 中添加这个 (implementation 'com.stripe:stripe-android:11.1.3') 依赖并同步你的项目。 与第一个错误相同【参考方案3】:

在最新版本12.8.2中,有几个API已经被弃用,请看下面我的解决方案。

第 1 步:在 gradle 文件中使用最新的依赖项

def stripe_version = "12.8.2"
implementation "com.stripe:stripe-android:$stripe_version"

第 2 步:StripeFormActivity 中的代码更改为

Stripe stripe = new Stripe(StripeFormActivity.this, PUBLISHABLE_KEY);
stripe.createCardToken(card, new ApiResultCallback<Token>() 
    @Override
    public void onSuccess(Token token) 
        //getTokenList().addToList(token);

        ProgressDialog.cancel();
        cusRotateLoading.stop();

        Log.d("token", "token = " + token.getId());
        Intent ri = new Intent();
        ri.putExtra("stripe_id", token.getId());
        setResult(2, ri);
        finish();
    

    @Override
    public void onError(@NotNull Exception e) 
        ProgressDialog.cancel();
        cusRotateLoading.stop();
        Common.showMkError(StripeFormActivity.this, error.getLocalizedMessage());
    
);

【讨论】:

以上是关于没有适合 Stripe 的构造函数的主要内容,如果未能解决你的问题,请参考以下文章

使用杰克逊的 JSON 反序列化:没有找到适合类型的构造函数 - 可以提供默认构造函数或注释构造函数 [重复]

杰克逊错误:没有适合简单类的构造函数

Jackson ObjectMapper 无法反序列化 POJO,抛出异常:没有找到适合类型 [...] 的构造函数:无法从 JSON 对象实例化

在构造函数中存储DbSet而不是调用DbContext.Set 适合各种用途

构造函数和析构函数的区别

PHP中构造函数和析构函数解析