Kotlin 应用程序中的 Stripe 集成 -- IllegalStateException

问题描述 投票:0回答:3

我正在将 Stripe for Java 集成到 Kotlin 应用程序中。

这是我写给

create a Charge

的代码

createCharge 函数:

fun createCharge(charge: Charge, testApiKey: String): Charge? {
        //met

        // On your server, grab the Stripe token in the POST parameters submitted by your form. From there, it’s one simple API call to charge the card
        Stripe.apiKey = testApiKey

        try {
            val chargeParams = mutableMapOf<String, Any?>()

            chargeParams["amount"] = charge.amount
            chargeParams["currency"] = charge.currency
            chargeParams["description"] = charge.description
            chargeParams["source"] = charge.source
            chargeParams["customer"] = charge.customer
            chargeParams["receipt_email"] = charge.receiptEmail

            val requestOptions = idempotencyKeySetter()

            val initialMetadata = mutableMapOf<String, String?>()
            initialMetadata["start_date"] = charge.metadata["start_date"]
            initialMetadata["end_date"] = charge.metadata["end_date"]

            chargeParams["metadata"] = initialMetadata

            return Charge.create(chargeParams, requestOptions)

        } catch (e: StripeException) {

            e.printStackTrace()
            return null
        }
    }

以及调用createCharge函数的函数:

var formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
fun checkCreateCharge() {
        val chargeParams: Charge = Charge()

        chargeParams.amount = 2000
        chargeParams.currency = "usd"
        chargeParams.description = description
        chargeParams.source = PaymentSource { "" }
        chargeParams.customer = customerId
        chargeParams.receiptEmail = testEmail

        chargeParams.metadata["start_date"] = LocalDate.parse("2018-12-31", formatter).toString()
        chargeParams.metadata["end_date"] = LocalDate.parse("2019-03-31", formatter).toString()

        val newCharge: Charge? = createCharge(chargeParams, testApiKey)
    }

当我运行函数

checkCreateCharge
时,它会发送以下错误:
java.lang.IllegalStateException: chargeParams.metadata must not be null

有谁知道为什么会这样吗?

java date kotlin stripe-payments illegalstateexception
3个回答
0
投票

因此,虽然这是“可能的”,但你绝对不应该这样做。这是一个非常大的安全漏洞。拥有您的应用程序的任何人都可以嗅探您的 Stripe Secret API 密钥并做出许多坏事。例如,他们可以测试信用卡,甚至从您的帐户中提取资金。

在 Android 上实现 Stripe 时,您应该使用您的可发布 API 密钥,并且仅使用该密钥来创建令牌/源。所有其他操作都应在安全后端上利用您的秘密 API 密钥。


0
投票

我从 API 文档中可以看出,您正在访问

getMetadata()
,它返回 null(因为您从未在其上设置过值)。基本上,这条线:

chargeParams.metadata["start_date"] = LocalDate.parse("2018-12-31", formatter).toString()

相当于Java代码:

chargeParams.getMetadata().put("start_date", LocalDate.parse("2018-12-31", formatter).toString())

并且在您的情况下

getMetadata()
为空。我相信将其更改为:

chargeParams.setMetadata(
    mapOf(
        "start_date" to LocalDate.parse("2018-12-31", formatter).toString(),
        "end_date" to LocalDate.parse("2019-03-31", formatter).toString()
    )
)

将解决问题。


0
投票

您似乎在访问

metadata
对象的
chargeParams
属性时遇到了问题。错误消息
java.lang.IllegalStateException: chargeParams.metadata must not be null
表示
metadata
属性预计为非 null,但在运行时发现为 null。

在您的

createCharge
函数中,您尝试直接从
metadata
对象访问
chargeParams
属性,而无需显式初始化它。 Kotlin 不会自动初始化可变映射,因此您需要在访问它之前初始化
metadata

您可以像这样初始化

metadata

val chargeParams = mutableMapOf<String, Any?>()
chargeParams["metadata"] = mutableMapOf<String, String?>()

这将确保当您稍后在代码中尝试访问它时,

metadata
不为空。这是
createCharge
函数经过初始化后的修改部分:

val chargeParams = mutableMapOf<String, Any?>()

// Initialize metadata here
chargeParams["metadata"] = mutableMapOf<String, String?>()

chargeParams["amount"] = charge.amount
chargeParams["currency"] = charge.currency
chargeParams["description"] = charge.description
chargeParams["source"] = charge.source
chargeParams["customer"] = charge.customer
chargeParams["receipt_email"] = charge.receiptEmail

val requestOptions = idempotencyKeySetter()

val initialMetadata = mutableMapOf<String, String?>()
initialMetadata["start_date"] = charge.metadata["start_date"]
initialMetadata["end_date"] = charge.metadata["end_date"]

chargeParams["metadata"] = initialMetadata

return Charge.create(chargeParams, requestOptions)

通过此修改,当您尝试访问它时,

metadata
不应该为空,并且错误应该得到解决。

© www.soinside.com 2019 - 2024. All rights reserved.