Intégration de données en deux étapes
Les informations personnellement identifiables (PII) sont souvent requises par Rokt pour atteindre les objectifs de campagne. Par exemple, l'adresse e-mail d'un client est considérée comme une PII et est essentielle pour que Rokt puisse envoyer une campagne par e-mail. Ces informations sont appelées "attributs de réalisation". Rokt a conçu un processus d'intégration de données en deux étapes afin que vous puissiez intégrer de manière sécurisée les attributs de réalisation à Rokt, garantissant ainsi la confidentialité du client et maintenant la qualité de son expérience.
Avec le processus d'intégration de données en deux étapes, Rokt utilise l'adresse e-mail hachée pour identifier le client et choisir l'expérience la plus pertinente pour lui. Si le client interagit positivement avec l'offre de Rokt, vous divulguez les attributs nécessaires pour réaliser l'offre. Le processus d'intégration de données en deux étapes offre une mesure de sécurité supplémentaire aux clients tout en permettant à Rokt de répondre à certaines des fonctionnalités attendues (par exemple, supprimer les offres pour les clients existants).
La méthode d'intégration de données en deux étapes peut être mise en œuvre sur les SDK Web, iOS, Android et React Native. Le code suivant montre le processus d'intégration de base dans différents langages :
- JavaScript
- Swift
- Objective-C
- Kotlin
- Java
- React
const rawAttributes = {
country: "US",
};
const twoStepDataIntegrationAttributes = {
email: "john.smith@rokt.com",
};
const hashedAttributes = await launcher.hashAttributes(
twoStepDataIntegrationAttributes
);
const selection = await launcher.selectPlacements({
attributes: {
...rawAttributes,
...hashedAttributes,
},
});
selection.on("POSITIVE_ENGAGEMENT").subscribe(() => {
selection.setAttributes(twoStepDataIntegrationAttributes);
});
Le code ci-dessus utilise la méthode IntegrationLauncher.hashAttributes pour hasher les attributs de réalisation. Rokt recommande l'utilisation de cette méthode utilitaire au cas où des attributs supplémentaires devraient également être hashés un jour ou si des algorithmes de hachage plus complexes doivent être pris en charge de manière transparente.
Si vous choisissez de hasher les attributs, veuillez vous assurer que la valeur de l'attribut est en minuscules et sans espaces avant le hachage, et que le nom de l'attribut est suffixé par sha256
.
L'exemple ci-dessous montre l'utilisation d'un attribut pré-hashé.
const email = "john.smith@rokt.com ";
const emailsha256 =
"F6191D8D6A0F75CA7D237ED07CF8E461E72E5C7BB28D611DDF37E5908FDB632B";
const selection = await launcher.selectPlacements({
attributes: {
country: "US",
emailsha256: emailsha256,
},
});
selection.on("POSITIVE_ENGAGEMENT").subscribe(() => {
selection.setAttributes({
email: email,
});
});
import Rokt_Widget
class OrderConfirmationViewController: UIViewController {
...
// appeler cette fonction lorsque l'emplacement doit être affiché
func showWidget() {
let attributes = ["firstname": "Jenny",
"lastname": "Smith",
"emailsha256": "36f15652992f5c291ea233b930c8c435ee5a5fb115d25933e3266591d3f92f74",
"postcode": "90210",
"country": "US"]
Rokt.execute2step(viewName: "RoktExperience", attributes: attributes, onLoad: {
// rappel facultatif lorsque l'emplacement Rokt se charge
}, onUnLoad: {
// rappel facultatif lorsque l'emplacement Rokt se décharge
}, onShouldShowLoadingIndicator: {
// rappel facultatif pour afficher un indicateur de chargement
}, onShouldHideLoadingIndicator: {
// Callback facultatif pour masquer un indicateur de chargement
}, onEvent: { eventType , eventHandler in
if eventType == .FirstPositiveEngagement {
eventHandler.setFulfillmentAttributes(attributes: ["email": "j.smith@example.com"])
}
}
)
}
}
#import <Rokt_Widget/Rokt_Widget-Swift.h>
...
// appeler cette fonction lorsque le placement doit être affiché
- (void)showWidget {
NSDictionary *attributes = @{
@"firstname": @"Jenny",
@"lastname": @"Smith",
@"emailsha256": @"36f15652992f5c291ea233b930c8c435ee5a5fb115d25933e3266591d3f92f74",
@"postcode": @"90210",
@"country": @"US"
};
[Rokt execute2stepWithViewName: @"RoktExperience"
attributes:attributes
placements:placements
onLoad:^{
// Callback facultatif lorsque le widget Rokt se charge
} onUnLoad:^{
// Callback facultatif lorsque le widget Rokt se décharge
} onShouldShowLoadingIndicator:^{
// Callback facultatif pour afficher un indicateur de chargement
} onShouldHideLoadingIndicator:^{
// Callback facultatif pour masquer un indicateur de chargement
} onEmbeddedSizeChange:^(NSString *selectedPlacement, CGFloat widgetHeight){
// Callback facultatif pour obtenir selectedPlacement et la hauteur requise par le widget à chaque changement de hauteur du widget
} onEvent:^(RoktEventType eventType, RoktEventHandler* eventHandler){
if(eventType == RoktEventTypeFirstPositiveEngagement){
[eventHandler setFulfillmentAttributesWithAttributes: @{
@"email" : @"j.smith@example.com"}];
}
}];
}
import com.rokt.roktsdk.Widget
import com.rokt.roktsdk.Rokt
class ConfirmationActivity : Activity() {
private val roktCalllback = object : Rokt.RoktCallback {
override fun onLoad() {
}
override fun onShouldShowLoadingIndicator() {
}
override fun onShouldHideLoadingIndicator() {
}
override fun onUnload(reason: Rokt.UnloadReasons) {
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
// Include any appropriate consumer attributes
val attributes = hashMapOf(
Pair("emailsha256", "36f15652992f5c291ea233b930c8c435ee5a5fb115d25933e3266591d3f92f74"),
Pair("firstname", "Jenny"),
Pair("lastname", "Smith"),
Pair("mobile", "(323) 867-5309"),
Pair("postcode", "90210"),
Pair("country", "US")
)
// Widget placeholder mapping the placeholder view with placement location configuration
val widget = findViewById<Widget>(R.id.roktWidget)
val placeHolders = hashMapOf(
Pair("RoktEmbedded1", WeakReference(widget))
)
Rokt.execute2Step(pageIdentifier, attributes, this, placeholders, object : Rokt.RoktEventCallback {
override fun onEvent(eventType: Rokt.RoktEventType, roktEventHandler: Rokt.RoktEventHandler) {
if (eventType == Rokt.RoktEventType.FirstPositiveEngagement) {
roktEventHandler.setFulfillmentAttributes(mapOf("email" to "j.smith@example.com"))
}
}
})
...
}
}
import com.rokt.roktsdk.Widget;
import com.rokt.roktsdk.Rokt;
class ConfirmationActivity : Activity() {
private Rokt.RoktCallback roktCallback = new Rokt.RoktCallback() {
@Override
public void onLoad() {
}
@Override
public void onShouldShowLoadingIndicator() {
}
@Override
public void onShouldHideLoadingIndicator() {
}
@Override
public void onUnload(@NotNull Rokt.UnloadReasons unloadReasons) {
}
};
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
Map<String, String> attributes = new HashMap<String, String>();
attributes.put("emailsha256", "36f15652992f5c291ea233b930c8c435ee5a5fb115d25933e3266591d3f92f74");
attributes.put("firstname", "Jenny");
attributes.put("lastname", "Smith");
attributes.put("mobile", "(323) 867-5309");
attributes.put("postcode", "90210");
attributes.put("country", "US");
// Widget placeholder mapping the placeholder view with placement location configuration
Widget widget = findViewById(R.id.roktWidget);
Map<String, WeakReference<Widget>> placeHolders = new HashMap<>();
placeHolders.put("RoktEmbedded1", new WeakReference<>(widget));
Rokt.INSTANCE.execute2Step("test,", roktCallback, new Rokt.RoktEventCallback() {
@Override
public void onEvent(Rokt.RoktEventType roktEventType, Rokt.RoktEventHandler roktEventHandler) {
Map<String,String> attributes = new HashMap<String, String>();
attributes.put("email", "j.smith@example.com");
if (roktEventType == Rokt.RoktEventType.FirstPositiveEngagement){
roktEventHandler.setFulfillmentAttributes(attributes);
}
}
});
...
}
}
import {
Rokt,
RoktEventManager
}
from "@rokt/react-native-sdk";
const roktEventManager = new NativeEventEmitter(RoktEventManager);
//Subscribe to FirstPositiveResponse event.
subscription = roktEventManager.addListener(
'FirstPositiveResponse',
(x) => {
console.log("Widget OnFirstPositiveEvent Callback");
// Send unhashed email on first positive response
fullfilmentAttributes = {
email: "j.smith@example.com"
};
Rokt.setFulfillmentAttributes(fullfilmentAttributes);
}
);
onExecuteHandler = () => {
attributes = {
"emailsha256": "238afb9e862add7d56bbc4181b80fa32",
"firstname": "Jenny",
"lastname": "Smith",
"mobile": "(323) 867-5309",
"postcode": "90210",
"country": "US"
};
Rokt.execute2Step("RoktExperience", attributes, null, () => console.log("Placement Loaded"));
}
// Remove subscription
componentWillUnmount() {
this.subscription.remove();
}