Для того, чтобы добавить библиотеку PayKeeper в существующее приложение для Android, необходимо установить её в качестве зависимости в настройках вашего приложения для Android в режиме исходного кода, либо библиотеки AAR.
Для добавления зависимости в режиме исходного кода, добавьте следующие директивы в файл settings.gradle:
1 2 3 4 5 6 7 |
rootProject.name = "paykeeper_sdk_debug" include ':app' setBinding(new Binding([gradle: this])) evaluate(new File( settingsDir.parentFile, '<название директории с исходным кодом библиотеки PayKeeper>/.android/include_flutter.groovy' )) |
При этом папка с исходным кодом библиотеки PayKeeper должна находиться в одной корневой директории с вашим проектом на Android. В файл build.gradle добавьте:
1 |
implementation project(':flutter') |
Для корректной работы библиотеки PayKeeper в вашей среде разработки Android Studio должны быть установлены плагины Flutter и Dart.
Вы можете подключить mSDK PayKeeper в виде заранее скомпилированной библиотеки AAR. Актуальную версию архива с библиотекой AAR можно скачать здесь. Для подключения библиотеки в Ваше приложение необходимо добавить в настройки файла app/build.gradle следующие параметры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
repositories { maven { url '<относительный к местоположению файла build.gradle путь к директории repo из архива AAR библиотеки PayKeeper>' } maven { url 'https://storage.googleapis.com/download.flutter.io' } } dependencies { // ... debugImplementation 'com.example.flutter_module:flutter_debug:1.0' profileImplementation 'com.example.flutter_module:flutter_profile:1.0' releaseImplementation 'com.example.flutter_module:flutter_release:1.0' } |
Вышеперечисленных действий достаточно для подключения mSDK PayKeeper. После подключения можно использовать функционал оплаты платёжной платформы.
Чтобы инициализировать процедуру оплаты с помощью библиотеки PayKeeper, в приложение для Android необходимо добавить реализацию активности, которая будет содержать обработчик сообщений, отправляемых библиотекой PayKeeper. Обмен сообщениями реализован при помощи класса MethodChannel платформы Flutter, поэтому активность с обработчиком сообщений будем называть активностью Флаттера. Пример вызова активности Флаттера (MainFlutterActivity) — например, по нажатию на кнопку «Оплатить» в приложении — ниже:
1 2 3 |
startActivity( new FlutterActivity.NewEngineIntentBuilder(MainFlutterActivity.class).build(getApplicationContext()) ); |
Пример реализации активности MainFlutterActivity ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
public class MainFlutterActivity extends FlutterActivity { private static final String TAG = "MethodChannel"; private static final String CHANNEL = "org.paykeeper.msdk/json"; @Override public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { super.configureFlutterEngine(flutterEngine); Log.i(TAG, "Running configureFlutterEngine"); final BinaryMessenger messenger = flutterEngine.getDartExecutor().getBinaryMessenger(); new MethodChannel(messenger, CHANNEL).setMethodCallHandler((call, result) -> { // Note: this method is invoked on the main thread. Log.i(TAG, "method: " + call.method); if (!call.method.equals("json")) return; String res = json(call.arguments.toString()); result.success(res); }); } private String json(String msg) { Type stringMap = new TypeToken<Map<String, String>>(){}.getType(); Log.i(TAG, "json: " + msg); Gson g = new Gson(); Map<String, String> req = g.fromJson(msg, stringMap); Log.i(TAG, "req: " + req); Map<String, String> data = new HashMap<String, String>(); switch (req.get("type")) { case "1": // init Map<String, Object> res = new HashMap<String, Object>(); res.put("type", 2); Map<String, Object> resData = new HashMap<String, Object>(); resData.put("paykeeperServer", "homesklad-kih.server.paykeeper.ru"); resData.put("publicKeyId", "example-1"); resData.put("publicKey", "AqaaksWbiALMc1CeCkJstiK6T+8m95RY7ydcPZnWzk4="); Map<String, Object> resPaymentData = new HashMap<String, Object>(); resPaymentData.put("sum", cart.getCartSum()); resPaymentData.put("clientid", "Ivanov Ivan"); resPaymentData.put("orderid", "007"); resPaymentData.put("client_email", "mk@paykeeper.ru"); resPaymentData.put("cart", cart.getCartJson()); resData.put("payment", resPaymentData); res.put("data", resData); String resStr = g.toJson(res); Log.w(TAG, "res json: " + resStr); return resStr; case "3": // success Log.w(TAG, "Success!"); startActivity(new Intent(MainFlutterActivity.this, SuccessPaymentActivity.class)); break; case "4": // error data = g.fromJson(req.get("data"), stringMap); Log.e(TAG, "error: " + data.get("error")); Log.e(TAG, "stackTrace: " + data.get("stackTrace")); break; case "5": // redirect data = g.fromJson(req.get("data"), stringMap); Log.w(TAG, "redirect: " + data.get("url")); break; } Log.i(TAG, "data: " + req.get("data")); return ""; } } |
В вышеуказанном примере в методе по умолчанию configureFlutterEngine() должен быть задан обработчик сообщений от библиотеки PayKeeper:
1 |
if (!call.method.equals("json")) return; |
В нашем примере методом обработчика является метод json(). В дальнейшей реализации последнего создается объект класса Gson, с помощью которого в блоке switch() осуществляется обработка сообщений. Сообщения могут быть следующими:
В обработчике инициализируются данные авторизации на служебном сервере PayKeeper (publicKeyId и publicKey), а также параметры формы оплаты: sum,clientid,orderid,client_email,cart (более подробную информацию о параметрах оплаты Вы можете прочитать в нашей базе знаний в разделе Методы интеграции > HTML-форма). Параметры оплаты возвращаются обработчиком в формате JSON-строки, как указано в примере.
Обработчик реализует действия, которые должны осуществляться после успешной оплаты. В нашем примере вызывается активность, которая выводит сообщение об успешной оплате.
Обработчик реализует действия, которые производятся в случае неуспешной оплаты. При обработке данного сообщения при необходимости можно получить сообщение с конкретной ошибкой оплаты, а также подробный лог (stackTrace).
Библиотека PayKeeper в процессе работы может также отправлять сообщения с другими кодами. Сообщения с кодом, отличным от вышеуказанных, можно игнорировать — их появление не должно приводить к ошибкам со стороны приложения для Android, которое использует библиотеку PayKeeper.