সার্ভার-সাইড ইন্টিগ্রেশন

প্রকাশকরা প্রাথমিকভাবে পাঠক এবং তাদের এনটাইটেলমেন্ট পরিচালনার জন্য সার্ভার-সাইড ইন্টিগ্রেশন ব্যবহার করে। প্রাথমিকভাবে, প্রকাশকরা PPID-এর জন্য Google-এর প্রোডাক্ট আইডি এনটাইটেলমেন্টের রেকর্ড আপডেট করতে UpdateReaderEntitlements ব্যবহার করে।

গুগল ক্লাউড সেটআপ

Google ক্লাউডে সাবস্ক্রিপশন লিঙ্কিং কনফিগার করা দুটি প্রধান উপাদান অন্তর্ভুক্ত করে:

  1. একটি প্রদত্ত প্রকল্পের জন্য API সক্রিয় করা হচ্ছে
  2. এপিআই অ্যাক্সেস করার জন্য একটি পরিষেবা অ্যাকাউন্ট তৈরি করা

সদস্যতা লিঙ্ক API সক্ষম করুন

একটি পরিষেবা অ্যাকাউন্ট ব্যবহার করতে এবং পাঠকের এনটাইটেলমেন্টগুলি পরিচালনা করতে, একটি Google ক্লাউড প্রকল্পে সাবস্ক্রিপশন লিঙ্কিং API উভয়ই সক্রিয় থাকতে হবে এবং একটি সঠিকভাবে কনফিগার করা OAuth পরিষেবা অ্যাকাউন্ট থাকতে হবে৷ একটি প্রকল্পের জন্য সাবস্ক্রিপশন লিঙ্কিং API সক্ষম করতে, মেনু থেকে নেভিগেট করুন -> APIs এবং পরিষেবাগুলি -> লাইব্রেরি এবং Subscription Linking অনুসন্ধান করুন বা সরাসরি পৃষ্ঠাটি দেখুন:


https://console.cloud.google.com/apis/library?project=gcp_project_id

api

চিত্র 1. API লাইব্রেরিতে নেভিগেট করা, এবং Google ক্লাউড প্রকল্পের জন্য API সক্রিয় করা।

একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন

পরিষেবা অ্যাকাউন্টগুলি আপনার অ্যাপ্লিকেশন থেকে সাবস্ক্রিপশন লিঙ্কিং API এ অ্যাক্সেসের অনুমতি দেওয়ার জন্য ব্যবহার করা হয়।

  1. আপনার প্রকল্পের কনসোলের মধ্যে একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন
  2. পরিষেবা অ্যাকাউন্টের জন্য শংসাপত্র তৈরি করুন এবং credentials.json ফাইলটি আপনার অ্যাপ্লিকেশনে অ্যাক্সেসযোগ্য একটি নিরাপদ স্থানে সংরক্ষণ করুন৷
  3. আপনার তৈরি করা পরিষেবা অ্যাকাউন্টে IAM ভূমিকা "সাবস্ক্রিপশন লিঙ্কিং অ্যাডমিন" প্রদান করুন । পরিষেবা অ্যাকাউন্টের ক্ষমতার উপর দানাদার নিয়ন্ত্রণের জন্য, আপনি নিম্নলিখিত টেবিল থেকে উপযুক্ত ভূমিকা নির্ধারণ করতে পারেন।
সামর্থ্য/ ভূমিকা সাবস্ক্রিপশন লিঙ্কিং অ্যাডমিন সাবস্ক্রিপশন লিঙ্কিং ভিউয়ার সাবস্ক্রিপশন লিঙ্কিং এনটাইটেলমেন্ট ভিউয়ার
পাঠক এনটাইটেলমেন্ট পান
পাঠক পান
পাঠকের এনটাইটেলমেন্ট আপডেট করুন
পাঠকদের মুছুন

সাবস্ক্রিপশন লিঙ্কিং API সহ পরিষেবা অ্যাকাউন্টগুলি ব্যবহার করুন৷

googleapis ক্লায়েন্ট লাইব্রেরির মাধ্যমে অথবা REST API-এর সাথে অনুরোধ স্বাক্ষর করে সাবস্ক্রিপশন লিঙ্কিং API-তে কলগুলি প্রমাণীকরণ করতে পরিষেবা অ্যাকাউন্টগুলি ব্যবহার করুন৷ ক্লায়েন্ট লাইব্রেরি স্বয়ংক্রিয়ভাবে উপযুক্ত access_token অনুরোধ পরিচালনা করে, যখন REST API-এর জন্য একটি id_token পুনরুদ্ধার করা প্রয়োজন এবং তারপর এটি একটি access_token জন্য বিনিময় করা প্রয়োজন।

নিম্নলিখিত ক্লায়েন্ট লাইব্রেরি এবং REST API উদাহরণ উভয়ই getReader() এন্ডপয়েন্ট ব্যবহার করে। সমস্ত API পদ্ধতির লাইভ প্রদর্শনের জন্য, সাবস্ক্রিপশন লিঙ্কিং ডেমো সাইট বা এর কোড দেখুন।

node.js googleapis ক্লায়েন্ট লাইব্রেরির সাথে নমুনা অনুরোধ

import {readerrevenuesubscriptionlinking_v1, Auth} from 'googleapis';
const subscriptionLinking = readerrevenuesubscriptionlinking_v1.Readerrevenuesubscriptionlinking;

class SubscriptionLinking {
  constructor() {
    this.auth = new Auth.GoogleAuth({
      keyFile: process.env.KEY_FILE,
      scopes: [
        'https://www.googleapis.com/auth/readerrevenue.subscriptionlinking.manage'
      ],
    })
  }

  init() {
    return new subscriptionLinking(
        {version: 'v1', auth: this.auth})
  }
}

const api = new SubscriptionLinking();
const client = api.init();

async function getReader(ppid) {
  const publicationId = process.env.PUBLICATION_ID;
  return await client.publications.readers.get({
    name: `publications/${publicationId}/readers/${ppid}`,
  });
};

async function updateEntitlements(ppid) {
  const publicationId = process.env.PUBLICATION_ID;
  const requestBody = {
    /*
    Refer to
    https://developers.google.com/news/subscribe/subscription-linking/appendix/glossary#entitlements_object
    */
    entitlements : [{
      product_id: `${publicationId}:basic`,
      subscription_token: 'abc1234',
      detail: 'This is our basic plan',
      expire_time: '2025-10-21T03:05:08.200564Z'
    }]
  };
  return await client.publications.readers.updateEntitlements({
    name: `publications/${publicationId}/readers/${ppid}`,
    requestBody
  });
};

REST API অনুরোধ ম্যানুয়ালি স্বাক্ষর করা হচ্ছে

import fetch from 'node-fetch'
import jwt from 'jsonwebtoken'

function getSignedJwt() {
  /*
    Either store the credentials string in an environmental variable
    Or implement logic to fetch it.
  */
  const key_file = process.env.CREDENTIALS_STRING

  const issueDate = new Date()
  const expireMinutes = 60
  const offsetInSeconds = issueDate.getTimezoneOffset() * 60000
  const expireDate = new Date(issueDate.getTime() + (expireMinutes * 60000))
  const iat = Math.floor((issueDate.getTime() + offsetInSeconds) / 1000)
  const exp = Math.floor((expireDate.getTime() + offsetInSeconds) / 1000)

  const token = {
    iss: key_file.client_email,
    iat,
    exp,
    aud: 'https://oauth2.googleapis.com/token',
    scope:'https://www.googleapis.com/auth/readerrevenue.subscriptionlinking.manage',
  }
  return jwt.sign(token, key_file.private_key, {
    algorithm: 'RS256',
    keyid: key_file.private_key_id,
  })
}

async function getAccessToken(signedJwt) {
  let body = new URLSearchParams();
  body.set('grant_type', 'urn:ietf:params:oauth:grant-type:jwt-bearer')
  body.set('assertion', signedJwt)
  const request = await fetch('https://oauth2.googleapis.com/token', {
    method: 'POST',
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    body
  })

  const accessResponse = await accessFetch.json()
  return accessResponse.access_token
}

async function getReader(ppid) {
  const publicationId = process.env.PUBLICATION_ID
  const base_url = 'https://readerrevenuesubscriptionlinking.googleapis.com/v1'
  const endpoint = `${base_url}/publications/${publicationId}/readers/${ppid}`
  const signedJwt = await getSignedJwt()
  const accessToken = await getAccessToken(signedJwt)

  const reader = await fetch(endpoint, {
     method: 'GET',
     headers: {
       Authorization: `Bearer ${accessToken}`,
     },
   }).then((response) => {
    return response.json()
  })

  return reader
}