Skip to content

6. Поддержка внешней платежной системы

Ansar8 edited this page Feb 14, 2023 · 1 revision

МодульКасса позволяет проводить платежи через другие приложения. После их установки на экране подитога появляется соответствующий пункт оплаты.

Чтобы реализовать приложение платежной системы, необходимо объявить сервис в манифесте:

        <service
            android:name=".DemoPaymentService"
            android:enabled="true"
            android:exported="true"
            android:icon="@drawable/ic_big_logo"
            android:label="С демо счета">
            <intent-filter>
                <action android:name="ru.modulkassa.PAYMENT_SERVICE"/>
            </intent-filter>
        </service>
  • icon - изображение/иконка приложения, которое будет отображаться в приложении МодульКасса
  • label - название вида оплаты в МодульКассе

От МодульКассы может приходить несколько типов запросов:

  • оплата (PayRequest)
  • возврат (RefundRequest)
  • отмена возврата/оплаты (CancelRequest)

Запросы будут приходить в объявленный сервис DemoPaymentService. Его следует унаследовать от PluginService:

class DemoPaymentService : PluginService() {

    override fun createHandlers(): List<OperationHandler> {
        // handlers
    }
}

Каждому запросу соответствует свой обработчик: для оплаты - PayOperationHandler, для возврата - RefundOperationHandler, для отмены - CancelOperationHandler.

Результат обработки запроса должен быть сообщен через callback (см. IPluginServiceCallback.aidl).

В случае, если для обработки запроса необходим UI, то callback можно сериализовать и положить в Intent:

    override fun createHandlers(): List<OperationHandler> {

        return listOf(
            object : PayOperationHandler() {
                override fun handlePay(payRequest: PayRequest, callback: PluginServiceCallbackHolder) {
                    val payIntent = Intent(applicationContext, PayActivity::class.java)
                    callback.putToIntent(payIntent)
                    payIntent.putExtra(KEY_DATA, payRequest.toBundle())
                    payIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
                    startActivity(payIntent)
                }
            }
        )
    }

И вернуть результат:

fun paySucceeded(result: PayResult) {
    PluginServiceCallbackHolder.getFromIntent(activity.intent)?.get()?.succeeded(
        result.toBundle())
    activity.finish()
}

После успешной оплаты требуется вернуть соответствующий объект:

  • для оплаты - PayResult,
  • для возврата - RefundResult,
  • для отмены - CancelResult.

Демонстрационный пример представлен в модуле integration-demo-payments.