jookyboi of Team Cacher
10/6/2019 - 10:44 PM

How to get paypal-checkout working in Electron app

The following is a hack to get around the issue posed by https://github.com/paypal/paypal-checkout/issues/323. It uses Electron to close the BrowserWindow when the popup fails to load. In the latest version of checkout.js, Paypal will fall back to using an iframe modal anyway so the new window is extraneous.

From Electron's main.ts:

import { BrowserWindow, ipcMain } from 'electron';
...
ipcMain.on(
    'close-paypal',
    () => {
        BrowserWindow.getAllWindows().forEach((win) => {
            // The Paypal window would fail to load contents due to security 
            // restrictions and return an empty URL
            if (!win.webContents.getURL()) {
                win.close();
            }
        });
    }
);

From your content script (I'm using TypeScript):

const { ipcRenderer } = require('electron');
...
paypal.Button.render({
  ...
  payment: () => {
      ipcRenderer.send('close-paypal', '');
      // Other logic to trigger payment flow
  }
  ...
});