共用方式為


PlayReady 測試環境的安全停止伺服器

概觀

PlayReady Secure Stop Server 提供測試端點,以驗證 PlayReady 實作中的安全停止功能。 安全停止可確保媒體耗用量追蹤數據會安全地從用戶端傳輸至內容提供者,進而提供精確的使用量監視和合規性報告。

服務端點

安全停止測試伺服器位於:

https://playready.directtaps.net/pr/svc/securestop.asmx

安全停止通訊協定

通訊協定概觀

安全停止可讓用戶端安全地報告會話結束資訊:

  1. 用戶端開始播放會話
  2. 授權指定安全停止需求
  3. 用戶端會在播放期間產生安全的停止數據
  4. 在工作階段結束時,用戶端會將安全停止報表傳送至伺服器
  5. 伺服器驗證並確認收據

訊息流程

Client                    License Server           Secure Stop Server
  |                            |                           |
  |-- License Request -------->|                           |
  |<-- License Response -------|                           |
  |    (with SecureStop URL)   |                           |
  |                            |                           |
  |    [Playback Session]      |                           |
  |                            |                           |
  |-- Secure Stop Report ------|-------------------------->|
  |<-- Acknowledgment ---------|---------------------------|

伺服器組態

安全停止需求

在授權回應中設定安全停止:

{
  "licenseType": "persistent",
  "keyId": "key-id-guid",
  "secureStop": {
    "required": true,
    "serverUrl": "https://playready.directtaps.net/pr/svc/securestop.asmx",
    "reportingFrequency": "session-end",
    "customData": {
      "sessionId": "unique-session-identifier",
      "contentId": "content-identifier"
    }
  }
}

伺服器回應組態

伺服器支援各種回應模式進行測試:

{
  "responseMode": "success|failure|timeout|partial",
  "acknowledgmentDelay": 0,
  "customData": {
    "testScenario": "normal-operation"
  }
}

API 端點

提交安全停止報告

端點:POST /pr/svc/securestop.asmx/SubmitReport

要求格式:

POST /pr/svc/securestop.asmx/SubmitReport HTTP/1.1
Host: playready.directtaps.net
Content-Type: application/octet-stream

[Secure Stop Report Data - Binary Format]

回應格式:

HTTP/1.1 200 OK
Content-Type: application/octet-stream

[Secure Stop Acknowledgment - Binary Format]

查詢報表狀態

端點:GET /pr/svc/securestop.asmx/QueryStatus

要求格式:

GET /pr/svc/securestop.asmx/QueryStatus?sessionId=SESSION_ID HTTP/1.1
Host: playready.directtaps.net

回應格式:

{
  "sessionId": "session-identifier",
  "status": "pending|received|processed|error",
  "timestamp": "2024-01-15T10:30:00Z",
  "reportSize": 1024,
  "processingTime": 50
}

測試案例

基本安全停止測試

測試一般安全停止流程:

async function testBasicSecureStop() {
    // 1. Acquire license with secure stop requirement
    const license = await acquireLicense({
        keyId: 'test-key-id',
        secureStopRequired: true,
        secureStopUrl: 'https://playready.directtaps.net/pr/svc/securestop.asmx'
    });
    
    // 2. Simulate playback session
    const session = await startPlaybackSession(license);
    
    // 3. End session and generate secure stop report
    const secureStopReport = await endSessionWithSecureStop(session);
    
    // 4. Submit secure stop report
    const response = await submitSecureStopReport(secureStopReport);
    
    return response.acknowledged;
}

錯誤處理測試

測試錯誤案例:

async function testSecureStopErrorHandling() {
    const testCases = [
        {
            name: 'Invalid Report Format',
            data: generateInvalidReport(),
            expectedError: 'INVALID_FORMAT'
        },
        {
            name: 'Expired Session',
            data: generateExpiredSessionReport(),
            expectedError: 'SESSION_EXPIRED'
        },
        {
            name: 'Duplicate Report',
            data: generateDuplicateReport(),
            expectedError: 'DUPLICATE_REPORT'
        }
    ];
    
    const results = [];
    for (const testCase of testCases) {
        try {
            await submitSecureStopReport(testCase.data);
            results.push({ test: testCase.name, result: 'UNEXPECTED_SUCCESS' });
        } catch (error) {
            results.push({ 
                test: testCase.name, 
                result: error.code === testCase.expectedError ? 'PASS' : 'FAIL' 
            });
        }
    }
    
    return results;
}

效能測試

測試安全停止效能:

async function testSecureStopPerformance() {
    const concurrentReports = 10;
    const reports = [];
    
    // Generate multiple secure stop reports
    for (let i = 0; i < concurrentReports; i++) {
        reports.push(generateSecureStopReport(`session-${i}`));
    }
    
    // Submit reports concurrently
    const startTime = Date.now();
    const promises = reports.map(report => submitSecureStopReport(report));
    const results = await Promise.allSettled(promises);
    const endTime = Date.now();
    
    return {
        totalTime: endTime - startTime,
        averageTime: (endTime - startTime) / concurrentReports,
        successCount: results.filter(r => r.status === 'fulfilled').length,
        errorCount: results.filter(r => r.status === 'rejected').length
    };
}

用戶端整合

JavaScript 實作

class SecureStopClient {
    constructor(serverUrl) {
        this.serverUrl = serverUrl;
    }
    
    async submitReport(secureStopData) {
        const response = await fetch(`${this.serverUrl}/SubmitReport`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/octet-stream'
            },
            body: secureStopData
        });
        
        if (!response.ok) {
            throw new Error(`Secure stop submission failed: ${response.status}`);
        }
        
        return await response.arrayBuffer();
    }
    
    async queryStatus(sessionId) {
        const response = await fetch(`${this.serverUrl}/QueryStatus?sessionId=${sessionId}`);
        
        if (!response.ok) {
            throw new Error(`Status query failed: ${response.status}`);
        }
        
        return await response.json();
    }
}

// Usage
const secureStopClient = new SecureStopClient('https://playready.directtaps.net/pr/svc/securestop.asmx');

C# 實作

public class SecureStopClient
{
    private readonly HttpClient httpClient;
    private readonly string serverUrl;
    
    public SecureStopClient(string serverUrl)
    {
        this.serverUrl = serverUrl;
        this.httpClient = new HttpClient();
    }
    
    public async Task<byte[]> SubmitReportAsync(byte[] secureStopData)
    {
        var content = new ByteArrayContent(secureStopData);
        content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        
        var response = await httpClient.PostAsync($"{serverUrl}/SubmitReport", content);
        response.EnsureSuccessStatusCode();
        
        return await response.Content.ReadAsByteArrayAsync();
    }
    
    public async Task<SecureStopStatus> QueryStatusAsync(string sessionId)
    {
        var response = await httpClient.GetAsync($"{serverUrl}/QueryStatus?sessionId={sessionId}");
        response.EnsureSuccessStatusCode();
        
        var json = await response.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<SecureStopStatus>(json);
    }
}

數據格式

安全停止報表結構

安全停止報告包含:

  • 會話標識碼:唯一會話標識符
  • 內容標識碼:正在取用的內容
  • 使用量數據:播放持續時間、品質等。
  • 裝置資訊:用戶端裝置詳細數據
  • 時間戳資訊:工作階段開始/結束時間
  • 數位簽名:驗證的密碼編譯證明

報表驗證

伺服器會驗證下列項目的報表:

  • 格式完整性:更正二進位結構
  • 數位簽名:密碼編譯真實性
  • 會話有效性:有效的會話參數
  • 時間戳精確度:合理的時間值
  • 重複偵測:防止重複提交

進階功能

自訂數據支援

在安全停止報表中包含自訂資料:

{
  "customData": {
    "contentProvider": "test-provider",
    "userAgent": "PlayReady-Client/4.0",
    "playbackQuality": "HD",
    "geolocation": "US-WEST"
  }
}

Batch 報告

在單一要求中提交多個安全停止報告:

async function submitBatchReports(reports) {
    const batchData = {
        reports: reports,
        batchId: generateBatchId(),
        timestamp: new Date().toISOString()
    };
    
    const response = await fetch(`${serverUrl}/SubmitBatch`, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(batchData)
    });
    
    return await response.json();
}

監視和分析

報表分析

測試伺服器提供分析端點:

GET /pr/svc/securestop.asmx/Analytics?period=24h

回應包括:

  • 已接收的報告總數
  • 平均處理時間
  • 依類型的錯誤率
  • 地理分佈
  • 用戶端版本統計數據

健康監控

監視伺服器健康情況:

async function checkSecureStopServerHealth() {
    const response = await fetch('https://playready.directtaps.net/pr/svc/securestop.asmx/Health');
    return await response.json();
}

最佳做法

用戶端實作

  1. 可靠傳遞:針對失敗的提交實作重試邏輯
  2. 離線支援:網路無法使用時的佇列報告
  3. 數據驗證:在提交之前驗證報表數據
  4. 錯誤處理:正常處理伺服器錯誤
  5. 隱私權:保護報表中的敏感數據

測試建議

  1. 綜合案例:測試一般和錯誤狀況
  2. 效能測試:在負載條件下驗證
  3. 網路條件:使用各種網路案例進行測試
  4. 數據完整性:驗證報表數據精確度
  5. 安全性測試:驗證密碼編譯元件

支援和疑難解答

針對安全停止功能的問題:

  1. 確認授權中已啟用安全停止
  2. 檢查報表格式和結構
  3. 驗證伺服器的網路連線能力
  4. 檢閱伺服器回應以取得錯誤詳細數據
  5. 先使用簡化的案例進行測試

常見問題:

  • 報表格式錯誤:無效的二進位格式或結構
  • 簽章驗證:密碼編譯簽章問題
  • 網路逾時:伺服器連線問題
  • 會話到期:提交的報告太晚

如需其他支援,請參閱主要的 PlayReady 測試伺服器 檔。