3

I'm currently trying to implement mollie payment into the flutter framework. For that I want to build a plugin in Java. So mollie has a very good documentation how to implement their API into an android app with Java. So the problem is when I hit the payment button in my app the browser opens with the correct checkout page. After the customer select his preferred payment method mollie goes back to my app, but I always get a empty query...

So this is my code for the flutter plugin

public class MolliePlugin implements MethodCallHandler, PluginRegistry.ActivityResultListener {

  Activity activity;
  Result activeResult;
  Context context;
  Intent intent;
  boolean getData;
  private static final int REQUEST_CODE = 0x1337;

  MolliePlugin(Registrar registrar){

    activity = registrar.activity();
  }

  /** Plugin registration. */
  public static void registerWith(Registrar registrar) {
    final MethodChannel channel = new MethodChannel(registrar.messenger(), "mollie");
    channel.setMethodCallHandler(new MolliePlugin(registrar));

  }


  @Override
  public void onMethodCall(MethodCall call, Result result) {

    if (call.method.equals("startPayment")) {

      activeResult = result;
      String checkout = call.argument("checkoutUrl");
      startPayment(checkout);

    }
    else {
      result.notImplemented();
    }

  }


/// Start the browser switch with a ACTION_VIEW
  void startPayment(String checkoutUrl) {

    Intent browserIntent = new Intent(Intent.ACTION_VIEW,Uri.parse(checkoutUrl));
    activity.startActivity(browserIntent);

  }

So in the docs of mollie is written that I have to put the following code into the onCreate() function in my MainActivity:

public void onCreate(Bundle savedInstanceState)
{
      super.onCreate(savedInstanceState);

      //...

      Intent intent = getIntent();

      if (Intent.ACTION_VIEW.equals(intent.getAction())) {
            Uri uri = intent.getData();
            String paymentId = uri.getQueryParameter("id");

            // Optional: Do stuff with the payment ID
      }
}

So when I put this into the onCreate() in my MainActivity of my Flutter app I get always an ACTION_RUN back after I was routed back to my app. So I used the onNewIntent() function which gives me the correct action after coming back to my app (any ideas why?):

public class MainActivity extends FlutterActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);

  }

  @Override
  protected void onNewIntent(Intent intent) {

    super.onNewIntent(intent);

    Log.d("Action is: ",intent.getAction());

    String paymentId = "No Id";

    if (Intent.ACTION_VIEW.equals(intent.getAction()) && intent != null) {
      Uri uri = intent.getData();
// This has no data...
      Log.d("query ",intent.getDataString());
      paymentId = uri.getQueryParameter("id");

      // Optional: Do stuff with the payment ID
    }


  }

}

So here I get an empty query. the intent.getData() only returns my returnUrl which I have to set up in my AndroidManifest (see below). The returnUrl works fine but it has no data included after checking out and swichting back to the app...

My AndroidManifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.plugon.mollie_example">

    <!-- io.flutter.app.FlutterApplication is an android.app.Application that
         calls FlutterMain.startInitialization(this); in its onCreate method.
         In most cases you can leave this as-is, but you if you want to provide
         additional functionality it is fine to subclass or reimplement
         FlutterApplication and put your custom class here. -->
    <application
        android:name="io.flutter.app.FlutterApplication"
        android:label="mollie_example"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <!-- This keeps the window background of the activity showing
                 until Flutter renders its first frame. It can be removed if
                 there is no splash screen (such as the default splash screen
                 defined in @style/LaunchTheme). -->
            <meta-data
                android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
                android:value="true" />
            <intent-filter>
                <data
                    android:host="payment-return"
                    android:scheme="molli" />
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Any ideas what I'm doing wrong?

Funkberater
  • 775
  • 8
  • 16

0 Answers0