Détection de la fin de paiement

Afin de détecter la fin du paiement, il est nécessaire d'analyser les différentes URLs qui passent par la webview.

En fonction de l'URL, l'application mobile pourra:

  • accepter la propagation de l'URL et afficher la page dans la webview
    (par exemple, lors d'une demande de paiement, pour permettre à l'acheteur d'effectuer son paiement)
  • refuser la propagation de l'URL et reprendre la main.
    (par exemple, en cas de succès et à la fin du paiement, pour permettre à l'acheteur de retourner à l'application native)

Grâce à un mécanisme d'écoute des URLs, vous avez le contrôle sur la cinématique de paiement et pouvez décider à quel moment basculer sur votre application native.

Extrait de l'exemple de code pour Android (Kotlin)

private fun checkUrl(view: WebView, url: String): Boolean {
	val isCallBack = isCallbackUrl(url)

	when {
		// payment is finish
		isCallBack -> {
			view.stopLoading()
			goToFinalActivity(url)
		}		
		else -> view.loadUrl(url)
	}
	return (!isCallBack)
}		

Extrait de l'exemple de code pour iOS (Swift) :

func notifyPaymentFinish(navigationAction: WKNavigationAction){
	let webViewUrlResponse = self.buildWebviewUrlResponse(navigationAction: navigationAction)
	var error: NSError?
	switch webViewUrlResponse.paymentStatus {
		case "success":
			error = nil
		case "cancel":
			error = NSError.init(domain: PaymentProvider.ERROR_DOMAIN, code: PaymentProvider.ERROR_PAYMENT_CANCELATION.errorCode, userInfo: [NSLocalizedFailureReasonErrorKey: PaymentProvider.ERROR_PAYMENT_CANCELATION.errorMsg])
		case "refused":
			error = NSError.init(domain:PaymentProvider.ERROR_DOMAIN, code: PaymentProvider.ERROR_PAYMENT_REFUSED.errorCode, userInfo: [NSLocalizedFailureReasonErrorKey: PaymentProvider.ERROR_PAYMENT_REFUSED.errorMsg])
		default:
			error = NSError.init(domain:PaymentProvider.ERROR_DOMAIN, code: PaymentProvider.ERROR_UNKNOW.errorCode, userInfo: [NSLocalizedFailureReasonErrorKey: PaymentProvider.ERROR_UNKNOW.errorMsg])

	}
	self.dismiss(animated: true) {
		self.paymentDelegate?.didPaymentProcessFinish(error: error)
	}
}