صارف کی شناخت
صارفین کی شناخت گمنام چیٹ سیشنز کو حقیقی صارف پروفائلز سے جوڑ دیتی ہے۔
یہ کیسے کام کرتا ہے
جب آپ Respondo.identify() کال کرتے ہیں تو دی گئی فیلڈز گفتگو کے ساتھ منسلک ہو جاتی ہیں۔ تمام فیلڈز اختیاری ہیں — صرف وہی بھیجیں جو آپ کے پاس ہیں۔ مثلاً آپ ای میل یا نام کے بغیر صرف userId بھی بھیج سکتے ہیں۔ سپورٹ ایجنٹس یہ ڈیٹا گفتگو کی تفصیلات کے پینل میں دیکھتے ہیں۔
پیرامیٹرز#
| خصوصیت | قسم | لازمی | تفصیل |
|---|---|---|---|
| string | اختیاری | صارف کا ای میل پتہ | |
| name | string | اختیاری | ظاہر ہونے والا نام |
| userId | string | اختیاری | آپ کا اندرونی صارف ID یا ڈسپلے ID — ڈیش بورڈ میں جوں کا توں دکھایا جاتا ہے |
| userHash | string | اختیاری | شناخت کی تصدیق کے لیے HMAC-SHA256 دستخط |
| metadata | object | اختیاری | کسٹم فیلڈز کے کلید-قدر جوڑے (plan، company وغیرہ) |
| properties | object | اختیاری | Agent Settings میں طے شدہ کسٹم رابطہ خصوصیات۔ کلیدیں خصوصیات کی تعریفوں سے میل کھانی چاہئیں۔ قدریں cp_ سابقے کے ساتھ محفوظ ہوتی ہیں اور Inbox میں فلٹر کی جا سکتی ہیں۔ |
// After successful login
async function onLogin(user) {
await authenticateUser(user);
Respondo.identify({
email: user.email,
name: user.fullName,
userId: user.id,
metadata: {
plan: user.subscription.plan,
company: user.company.name,
role: user.role,
signedUp: user.createdAt
},
properties: { // custom contact properties
account_type: user.accountType, // must match keys from Agent Settings
industry: user.industry,
contract_tier: user.tier
}
});
}identify() کسی بھی وقت کال کر سکتے ہیں — widget.js کے لوڈ مکمل ہونے سے پہلے کی گئی کالیں سنیپٹ قطار میں رکھ لیتا ہے اور ویجٹ کے شروع ہوتے ہی خود بخود دوبارہ چلا دیتا ہے۔ شناخت کا ڈیٹا صرف اُس صورت (کنسول وارننگ کے ساتھ) ضائع ہوتا ہے جب آپ widget.js خود لوڈ کریں اور init() کال کیے بغیر ہی identify() کال کر دیں — دستی سیٹ اپ میں ہمیشہ پہلے init() کال کریں۔گمنام وزیٹرز#
اگر آپ identify() کال نہیں کرتے تو ویجٹ خود بخود ایک مستقل visitor ID تفویض کر دیتا ہے، جو localStorage میں (کلید respondoai_visitor_id) محفوظ رہتا ہے۔ ڈیش بورڈ میں یہ گفتگو Guest · Web widget کے طور پر نظر آتی ہے۔
| موڈ | ڈیش بورڈ میں ظاہری شکل | HMAC درکار |
|---|---|---|
identify() کے بغیر | Guest · Web widget | نہیں |
identify({ email, name }) | نام + ای میل دکھائے جاتے ہیں | نہیں — الا یہ کہ شناخت کی تصدیق آن ہو؛ تب بغیر دستخط والے ای میل/نام خاموشی سے ہٹا دیے جاتے ہیں اور سیشن گمنام ہی رہتا ہے |
identify({ userId }) | userId جوں کا توں دکھایا جاتا ہے | نہیں — الا یہ کہ شناخت کی تصدیق آن ہو؛ تب درست userHash لازمی ہے، ورنہ شناخت ہٹا دی جاتی ہے |
identify({ userId, userHash }) | تصدیق شدہ صارف شناخت | ہاں — خفیہ نگاری سے تصدیق شدہ |
جب چینل پر شناخت کی تصدیق آن ہو تو ای میل یا userId والی ہر وہ identify() کال جس میں درست userHash نہ ہو، سرور کی طرف سے ہٹا دی جاتی ہے اور وزیٹر گمنام ہی رہتا ہے — نیچے “شناخت کی تصدیق (HMAC)” دیکھیں۔
صرف userId سے شناخت (ای میل یا نام کے بغیر)#
اگر آپ کے پلیٹ فارم پر صارفین کے ای میل یا نام موجود نہیں — مثلاً آپ کے پاس صرف اندرونی ڈسپلے ID ہے — تو آپ صرف userId بھیج سکتے ہیں۔ کسی اور فیلڈ کی ضرورت نہیں۔ ڈیش بورڈ گفتگو کی تفصیلات میں userId جوں کا توں دکھائے گا۔
// Your platform only has a display ID — that's enough
Respondo.identify({
userId: user.displayId, // e.g. "USR-4821" — shown in dashboard
metadata: { // optional extra context
plan: 'premium',
region: 'eu-west'
}
});
// No email or name needed — the widget works with just userIduserHash کے ساتھ استعمال کریں (نیچے “شناخت کی تصدیق” دیکھیں)۔ HMAC کے بغیر کوئی بھی براؤزر کنسول سے کوئی بھی userId بھیج سکتا ہے۔Google Tag Manager / تاخیری identify()#
GTM کے ذریعے ایمبیڈ کرتے وقت ممکن ہے صفحہ لوڈ ہونے پر صارف کا ڈیٹا دستیاب نہ ہو۔ دو طریقے ہیں:
// If your platform already writes the user ID to localStorage:
Respondo.init({
agentId: 'YOUR_AGENT_ID',
localStorageKey: 'myapp_user_id' // reads localStorage.getItem('myapp_user_id') automatically
});
// No identify() call needed — the widget picks up the userId on its own// 1. Init widget immediately (GTM tag)
Respondo.init({ agentId: 'YOUR_AGENT_ID' });
// 2. Later, when user data appears (e.g. from dataLayer or your app):
var waitForUser = setInterval(function() {
var uid = localStorage.getItem('myapp_user_id');
if (uid && window.Respondo && typeof window.Respondo.identify === 'function') {
clearInterval(waitForUser);
Respondo.identify({ userId: uid });
}
}, 500);localStorageKey صرف اُس صورت استعمال ہوتا ہے جب userId پہلے سے identify() کے ذریعے مقرر نہ ہو۔ صریح identify() کالز کو ہمیشہ ترجیح حاصل رہتی ہے۔شناخت کی تصدیق (HMAC)#
تصدیق کے بغیر کوئی بھی جعلی userId یا email بھیج کر کسی صارف کا روپ دھار سکتا ہے۔ شناخت کی تصدیق HMAC-SHA256 استعمال کرتی ہے تاکہ خفیہ نگاری کے ذریعے یہ ثابت ہو کہ صارف کی شناخت آپ کے سرور نے مقرر کی ہے، کلائنٹ سائیڈ کوڈ نے نہیں۔
یہ کیسے کام کرتا ہے#
- اپنے چینل کی سیٹنگز میں شناخت کی تصدیق آن کریں — آپ کو ایک خفیہ کلید ملے گی۔
- اپنے سرور پر
HMAC-SHA256(secret, userId)شمار کریں — secret کلید ہے اور userId پیغام — اور نتیجہ فرنٹ اینڈ کو بھیجیں۔ اگر آپ صارفین کی شناخت صرف ای میل سے کرتے ہیں (userId کے بغیر) تو اس کے بجائے ای میل پر دستخط کریں: دستخط ہونے والا payload userId ہوتا ہے جب وہ موجود ہو، ورنہ ای میل۔ دونوں بھیجیں تو userId پر دستخط ہوتے ہیں؛ اسی کو ترجیح حاصل ہے۔ - ہیش کو
userHashکے طور پرRespondo.identify()میں بھیجیں۔ - Respondo ہیش کی تصدیق سرور کی طرف کرتا ہے۔ اگر یہ غلط ہو تو شناخت ہٹا دی جاتی ہے اور صارف کو گمنام سمجھا جاتا ہے۔
userId یا email والی ہر identify() کال میں درست userHash شامل ہونا لازمی ہے — ورنہ شناخت کے خانے ہٹا دیے جاتے ہیں اور وزیٹر کو گمنام سمجھا جاتا ہے۔سرور کی طرف کی مثالیں#
const crypto = require('crypto');
const SECRET = process.env.RESPONDO_IDENTITY_SECRET;
function generateUserHash(userId) {
return crypto
.createHmac('sha256', SECRET)
.update(userId)
.digest('hex');
}
// In your API endpoint:
app.get('/api/respondo-hash', (req, res) => {
const hash = generateUserHash(req.user.id);
res.json({ userHash: hash });
});import hmac, hashlib, os
SECRET = os.environ['RESPONDO_IDENTITY_SECRET']
def generate_user_hash(user_id: str) -> str:
return hmac.new(
SECRET.encode(),
user_id.encode(),
hashlib.sha256
).hexdigest()
# In your view / endpoint:
user_hash = generate_user_hash(request.user.id)import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
)
func GenerateUserHash(userID, secret string) string {
mac := hmac.New(sha256.New, []byte(secret))
mac.Write([]byte(userID))
return hex.EncodeToString(mac.Sum(nil))
}فرنٹ اینڈ پر استعمال#
// Fetch the hash from YOUR server
const { userHash } = await fetch('/api/respondo-hash').then(r => r.json());
Respondo.identify({
email: user.email,
name: user.name,
userId: user.id,
userHash: userHash // HMAC-SHA256 signature
});