yoomoney / yookassa-android-sdk

This library allows implementing payment acceptance into mobile apps on Android. It works as an extension to the YooMoney API.
https://yookassa.ru/developers/payment-forms/android-sdk
MIT License
39 stars 22 forks source link

Падение при обработке результата токенизации #24

Closed ARRR42 closed 5 years ago

ARRR42 commented 5 years ago

Если вызвать 'Checkout.createTokenizationResult(data)' c data == null, или если в data не будет соответствующего Serializable объекта PaymentMethodType, произойдет краш.

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
TokenizationResult tokenizationResult = Checkout.createTokenizationResult(data);
...
}

Краш:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=84, result=84, data=Intent { flg=0x3 (has extras) }} to activity {***.ui.activities.MainActivity}: kotlin.TypeCastException: null cannot be cast to non-null type ru.yandex.money.android.sdk.PaymentMethodType

В Checkout.createTokenizationResult() используется небезопасное приведение типов:

val type = data.getSerializableExtra(EXTRA_PAYMENT_METHOD_TYPE) as PaymentMethodType

drukarev commented 5 years ago

Данные с Activity возвращаются данные в сериализованном виде, поэтому там не может быть безопасного приведения типов. Checkout.createTokenizationResult(data) стоит применять, когда мы уверены, что вернулись с нужного экрана и получили RESULT_OK. Можно сделать, как в примере: https://github.com/yandex-money/yandex-checkout-android-sdk#получение-результата-токенизации

С нашей стороны добавим более подробную информацию об этом методе в Javadoc и README, и сделаем понятный exception в случае, если метод вызывается из java-кода, и в поле data передаётся null.