ডকুমেন্টেশন

ব্যবহারকারী শনাক্তকরণ

ব্যবহারকারী শনাক্ত করলে বেনামি চ্যাট সেশনগুলো আসল ব্যবহারকারী প্রোফাইলের সঙ্গে যুক্ত হয়।

কীভাবে কাজ করে

আপনি যখন Respondo.identify() কল করেন, তখন পাঠানো ফিল্ডগুলো কথোপকথনের সঙ্গে যুক্ত হয়ে যায়। সব ফিল্ডই ঐচ্ছিক — আপনার কাছে যা আছে কেবল সেগুলোই পাঠান। যেমন, email বা নাম ছাড়া শুধু userId পাঠাতে পারেন। সাপোর্ট কর্মীরা কথোপকথনের বিবরণ প্যানেলে এই তথ্য দেখতে পান।

প্যারামিটার#

প্রপার্টিটাইপআবশ্যকবিবরণ
emailstringঐচ্ছিকব্যবহারকারীর ইমেইল ঠিকানা
namestringঐচ্ছিকপ্রদর্শিত নাম
userIdstringঐচ্ছিকআপনার অভ্যন্তরীণ ব্যবহারকারী বা প্রদর্শনের ID — ড্যাশবোর্ডে যেমন আছে তেমনই দেখানো হয়
userHashstringঐচ্ছিকপরিচয় যাচাইয়ের জন্য HMAC-SHA256 স্বাক্ষর
metadataobjectঐচ্ছিককাস্টম ফিল্ডের কী-ভ্যালু জোড়া (plan, company ইত্যাদি)
propertiesobjectঐচ্ছিকAgent Settings-এ নির্ধারিত কাস্টম কন্টাক্ট প্রপার্টি। কী-গুলো প্রপার্টির সংজ্ঞার সঙ্গে মিলতে হবে। মানগুলো cp_ প্রিফিক্স সহ সংরক্ষিত হয় এবং ইনবক্সে ফিল্টার করা যায়।
উদাহরণ: সিঙ্গল পেজ অ্যাপjavascript
// সফল লগইনের পরে
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: {                        // কাস্টম কন্টাক্ট প্রপার্টি
      account_type: user.accountType,    // 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 })নাম + email দেখানো হয়না — যদি না Identity Verification চালু থাকে; চালু থাকলে স্বাক্ষরবিহীন email/নাম নীরবে বাদ দেওয়া হয় এবং সেশনটি বেনামিই থেকে যায়
identify({ userId })userId যেমন আছে তেমনই দেখানো হয়না — যদি না Identity Verification চালু থাকে; চালু থাকলে বৈধ userHash লাগবে, নইলে পরিচয় বাদ দেওয়া হয়
identify({ userId, userHash })যাচাই করা ব্যবহারকারী পরিচয়হ্যাঁ — ক্রিপ্টোগ্রাফিকভাবে যাচাই করা

চ্যানেলে Identity Verification চালু থাকলে, বৈধ userHash ছাড়া email বা userId বহনকারী যেকোনো identify() সার্ভার-সাইডে বাদ দেওয়া হয় এবং দর্শনার্থী বেনামিই থেকে যান — নিচের ‘পরিচয় যাচাই (HMAC)’ দেখুন।

একই ব্রাউজারে visitor ID এক সেশন থেকে আরেক সেশনে টিকে থাকে। এটি কখনোই যাচাই করা পরিচয় হিসেবে Respondo-তে পাঠানো হয় না — এটি কেবল বেনামি কথোপকথনের ধারাবাহিকতা রক্ষার জন্য।

শুধু userId দিয়ে শনাক্তকরণ (email বা নাম ছাড়া)#

আপনার প্ল্যাটফর্মে যদি ব্যবহারকারীর email বা নাম না থাকে — যেমন কেবল একটি অভ্যন্তরীণ প্রদর্শন-ID আছে — তাহলে শুধু userId পাঠালেই চলবে। আর কোনো ফিল্ড লাগবে না। ড্যাশবোর্ডে কথোপকথনের বিবরণে userId যেমন আছে তেমনই দেখানো হবে।

userId + metadata (email বা নাম ছাড়া)javascript
// আপনার প্ল্যাটফর্মে কেবল একটি প্রদর্শন-ID আছে — এটুকুই যথেষ্ট
Respondo.identify({
  userId: user.displayId,      // যেমন ‘USR-4821’ — ড্যাশবোর্ডে দেখানো হয়
  metadata: {                  // ঐচ্ছিক বাড়তি প্রেক্ষাপট
    plan: 'premium',
    region: 'eu-west'
  }
});
// email বা নাম লাগবে না — শুধু userId দিয়েই উইজেট কাজ করে
userId জাল করা ঠেকাতে সেটির সঙ্গে userHash ব্যবহার করুন (নিচের ‘পরিচয় যাচাই’ দেখুন)। HMAC ছাড়া যে কেউ ব্রাউজার কনসোল থেকে যেকোনো userId পাঠাতে পারে।

Google Tag Manager / বিলম্বিত identify()#

GTM দিয়ে এম্বেড করলে পেজ লোডের সময় ব্যবহারকারীর তথ্য না-ও থাকতে পারে। দুটি উপায় আছে:

উপায় A: localStorageKey (এক লাইনও JS লাগে না)javascript
// আপনার প্ল্যাটফর্ম যদি ইতিমধ্যেই ব্যবহারকারীর ID localStorage-এ লেখে:
Respondo.init({
  agentId: 'YOUR_AGENT_ID',
  localStorageKey: 'myapp_user_id'  // নিজে থেকেই localStorage.getItem('myapp_user_id') পড়ে
});
// identify() কল লাগবে না — উইজেট নিজেই userId তুলে নেয়
উপায় B: dataLayer দিয়ে বিলম্বিত identify()javascript
// 1. উইজেট সঙ্গে সঙ্গে ইনিশিয়ালাইজ করুন (GTM ট্যাগ)
Respondo.init({ agentId: 'YOUR_AGENT_ID' });

// 2. পরে, যখন ব্যবহারকারীর তথ্য আসে (যেমন dataLayer বা আপনার অ্যাপ থেকে):
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 ব্যবহার করে ক্রিপ্টোগ্রাফিকভাবে প্রমাণ করে যে ব্যবহারকারীর পরিচয় আপনার সার্ভার নির্ধারণ করেছে, ক্লায়েন্ট-সাইড কোড নয়।

কীভাবে কাজ করে#

  1. আপনার চ্যানেল সেটিংসে পরিচয় যাচাই চালু করুন — আপনি একটি সিক্রেট কী পাবেন।
  2. আপনার সার্ভারে HMAC-SHA256(secret, userId) হিসাব করুন — secret হলো কী, userId হলো বার্তা — এবং ফলাফলটি ফ্রন্টএন্ডে পাঠান। আপনি যদি ব্যবহারকারীদের কেবল email দিয়ে শনাক্ত করেন (userId নেই), তাহলে email-টিই স্বাক্ষর করুন: স্বাক্ষরিত পেলোড হলো userId (সেট থাকলে), নইলে email। দুটোই পাঠালে userId স্বাক্ষর করুন; সেটিই অগ্রাধিকার পায়।
  3. হ্যাশটি userHash হিসেবে Respondo.identify()-এ পাঠান।
  4. Respondo সার্ভারের দিকে হ্যাশটি যাচাই করে। হ্যাশ ভুল হলে পরিচয়ের তথ্য বাদ দেওয়া হয় এবং ব্যবহারকারীকে বেনামি ধরা হয়।
সিক্রেট কী কখনোই ফ্রন্টএন্ড কোডে প্রকাশ করবেন না। HMAC অবশ্যই আপনার ব্যাকএন্ডে হিসাব করতে হবে।
যাচাই একবার চালু হলে, userId বা email বহনকারী প্রতিটি identify()-এ একটি বৈধ userHash থাকতেই হবে — নইলে পরিচয়ের ফিল্ডগুলো বাদ দেওয়া হয় এবং দর্শনার্থীকে বেনামি ধরা হয়।

সার্ভার-সাইড উদাহরণ#

Node.jsjavascript
const crypto = require('crypto');

const SECRET = process.env.RESPONDO_IDENTITY_SECRET;

function generateUserHash(userId) {
  return crypto
    .createHmac('sha256', SECRET)
    .update(userId)
    .digest('hex');
}

// আপনার API এন্ডপয়েন্টে:
app.get('/api/respondo-hash', (req, res) => {
  const hash = generateUserHash(req.user.id);
  res.json({ userHash: hash });
});
Pythonpython
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()

# আপনার ভিউ / এন্ডপয়েন্টে:
user_hash = generate_user_hash(request.user.id)
Gogo
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))
}

ফ্রন্টএন্ডে ব্যবহার#

পরিচয় যাচাইসহjavascript
// হ্যাশটি আপনার নিজের সার্ভার থেকে আনুন
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 স্বাক্ষর
});