# Purchase interceptor

There are many possible cases where you would like to do something right before the user actually makes the purchase, right after he tapped the "Purchase button".

You might want to:

* Ask the user to connect or create an account
* Ask the user to acknowledge and accept the Terms of use
* Make some specific backend check
* Check that the content is available in the user geographical zone (media / videos)

Purchasely SDK gives you an opportunity to present or perform something to the user before it actually calls the stores to make the purchase. You can choose to continue the flow or cancel it.&#x20;

![Example of this interceptor usage on The Explorers app](/files/-MWtIoshLs9Myf-Vz3jg)

{% tabs %}
{% tab title="Swift" %}

```swift
// The handler gives you:
//  - the source controller to display something above
//  - a closure to notify the completion to the SDK that will proceed (or not) to the purchase

Purchasely.setConfimPurchaseHandler { [weak self](paywallController, processToPayment) in
	// Display the terms of use to your user
	self?.presentTermsAndConditions(above: paywallController) { (userAcceptedTerms) in
		// Don't forget to notify the SDK by calling `processToPayment`
		processToPayment(userAcceptedTerms)
	}
}
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
// The handler gives you:
//  - the source controller to display something above
//  - a closure to notify the completion to the SDK that will proceed (or not) to the purchase

[Purchasely setConfimPurchaseHandler:^(UIViewController *controller, void (^ processToPayment)(BOOL)) {
	// Display the terms of use to your user
	[self presentTermsAndConditionsAbove:controller handler:^(BOOL userAcceptedTerms) {
		// Don't forget to notify the SDK by calling `processToPayment`
		processToPayment(userAcceptedTerms);
	}];
}];
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
Purchasely.setConfirmPurchaseHandler { activity, processToPayment ->
        //if there is no activity then there is nothing to display
        if (activity == null) return@setConfirmPurchaseHandler
        
        //call your method to display your view 
        //and return boolean result to processToPayment
        presentTermsAndConditions(activity) { userAcceptedTerms ->
        		// Don't forget to notify the SDK by calling `processToPayment`
        		processToPayment(userAcceptedTerms)
        }
}
```

{% endtab %}

{% tab title="Java" %}

```java
Purchasely.setConfirmPurchaseHandler((activity, listener) -> {
    //if there is no activity then there is nothing to display
    if (activity == null) return;

    /*  call your method to display your view
        and return boolean result to processToPayment
        listener.processToPayment(userAcceptedTerms);
     */
    presentTermsAndConditions(activity, listener);
});

//You can also use the method for kotlin with Function interface
```

{% endtab %}

{% tab title="ReactNative" %}

```typescript
Purchasely.setPurchaseCompletionCallback(() => {
    //Present your own screen before purchase
    console.log('Received callback from user tapped on purchase button');
    
    //Call this method to continue to payment flow when you close your screen
    Purchasely.processToPayment(true);
});
```

{% endtab %}

{% tab title="Cordova" %}

```javascript
Purchasely.setConfirmPurchaseHandler(onPurchaseTapped => {
    //Present your own screen before purchase
    
    //Call this method to continue to payment flow when you close your screen
    Purchasely.processToPayment(true);
})
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
This parameter is set at the SDK level and not at the ViewController / Activity because these can be triggered automatically by a deeplink coming from a push, email, in-app message.\
If we had tied the handler to the activity you wouldn't have a chance to intercept the user before the purchase.
{% endhint %}

{% hint style="warning" %}
Setup your handler as soon as possible as you app might get opened by a deeplink linking to a paywall.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://purchasely.gitbook.io/purchasely/2.8/advanced-features/purchase-interceptor.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
