# plicflix developers — a documentação inteira Fonte: https://developers.plicflix.com/llms.txt --- # Comece aqui: do zero ao jogo publicado Este é o roteiro completo para pôr um jogo no plicflix. Foi escrito para ser seguido **ao pé da letra**, por uma pessoa ou por uma IA. Cada passo diz o que fazer, onde, e como saber que deu certo. > **Para IAs:** a lista de todas as páginas em texto puro está em > `https://developers.plicflix.com/llms.txt`, e tudo junto em > `https://developers.plicflix.com/llms-full.txt`. Cada página também existe > em Markdown: some `.md` ao endereço (ex.: `/docs/COMECE.md`). A API está > descrita em `https://developers.plicflix.com/openapi.json`. ## O que é o plicflix (em 30 segundos) - Um app de assinatura de jogos (web, Android, iOS). O jogador paga a assinatura e joga os jogos parceiros. - **O plicflix nunca hospeda o seu jogo.** O app abre o **seu** endereço (iframe na web, WebView no celular) com a tela de carregamento do plicflix na frente e a bolha do plicflix (avisos, amigos, sair) por cima. - O jogador **já chega logado**: o app manda um token de uso único; o **seu servidor** troca o token na API do plicflix e recebe só `id` (`pf_…`) e `nome` do jogador. - **Fora do app**, o seu site ou app nativo pode ter o botão **"Entrar com Plicflix"** (OAuth 2.0 + PKCE): chega o **mesmo** jogador `pf_…`. Isso é opcional e pode vir depois do passo 11. Veja [OAUTH](OAUTH.md). - **Você recebe** 60% do líquido de cada assinante, dividido entre os jogos que ele jogou, pelo tempo ativo (veja [REGRAS](REGRAS)). ## Os endereços | o quê | endereço | |---|---| | este portal (cadastro, painel, documentação) | `https://developers.plicflix.com` | | o app (onde jogadores e testadores jogam) | `https://plicflix.com` | | a API (o seu servidor chama) | `https://api.plicflix.com` | | o SDK do navegador (CDN) | `https://sdk.plicflix.com/plicflix.js` | | a origem que vai no seu `frame-ancestors` | `https://plicflix.com` | | suporte | `suporte@plicflix.com` | Não existe um "ambiente de testes" separado: você testa no plicflix de verdade, como **testador** do seu próprio jogo ainda não publicado (passo 8). Só você e quem você indicar enxergam o jogo até a equipe publicar. ## Requisitos do jogo 1. **Ter uma versão web** (HTML5: JavaScript, WebAssembly, Unity WebGL, Godot Web, Flutter web…) num endereço seu. Jogos só nativos (sem versão web) ainda não entram. 2. **De preferência, ter um servidor** (qualquer linguagem). É ele quem troca o token com a chave secreta e guarda o progresso. Sem servidor dá para integrar ([MOTORES](MOTORES#jogo-sem-servidor)), com limitações. 3. **Poder mudar os cabeçalhos HTTP** da página do jogo (`Content-Security-Policy` e cookies). Hospedagens estáticas como Netlify, Vercel e Cloudflare Pages deixam, por arquivo de configuração. ## O roteiro ### 1. Criar a conta de desenvolvedor - **Onde:** `https://developers.plicflix.com/cadastro`. - **O quê:** o seu nome, o e-mail, uma senha (10 ou mais caracteres) e o estúdio (nome, CPF ou CNPJ — com ou sem pontuação —, país, site). Aceite os [termos](TERMOS). - **Deu certo quando:** você cai no painel e chega um e-mail de boas-vindas com o link de confirmar o endereço e a fatura da taxa de entrada. ### 2. Pagar a taxa de entrada - **Onde:** no painel, a fatura aparece logo no topo (`/faturas/{id}`). - **Como:** enquanto o pagamento on-line não está ligado, responda ao e-mail da fatura (ou escreva para `suporte@plicflix.com`) com o número da fatura: mandamos o Pix ou o boleto. A equipe dá baixa e você recebe o e-mail "Pagamento confirmado". - **Enquanto isso:** você já pode ler toda a documentação, baixar o SDK e os exemplos e montar a integração. Só cadastrar jogo e gerar a chave esperam o pagamento. ### 3. Gerar a chave de integração - **Onde:** painel → **Gerar chave**. - **O quê:** uma chave `pk_…`. **Aparece uma vez.** Guarde no seu servidor como variável de ambiente `PLICFLIX_CHAVE`. Nunca ponha no navegador, no app nem no git. - **Perdeu?** Gere outra: a antiga para de funcionar na hora. ### 4. Cadastrar o jogo - **Onde:** painel → **Novo jogo** (`/jogos/novo`). | campo | exemplo | regra | |---|---|---| | nome | `Ilha das Luzes` | até 60 letras | | identificador (slug) | `ilha-das-luzes` | minúsculas, números e `-`; não muda depois; volta como `jogo` na troca do token | | endereço | `https://ilha.exemplo.com/` | https; **para testar, pode ser** `http://localhost:4100/` | | rota de status | `https://ilha.exemplo.com/saude` | responde 200 rápido; a vigia consulta a cada minuto | - **Deu certo quando:** o jogo aparece no painel com a situação **rascunho** (não publicado). - **O endereço muda depois** (aba **Integração → Endereço do jogo**), enquanto o jogo estiver em rascunho ou recusado. O slug não muda nunca. ### 5. Integrar o navegador (o SDK) Baixe [`plicflix.js`](/sdk/plicflix.js?baixar=1) para o seu site (sem mudar nada) e carregue **antes** do jogo. Na ordem: ```js // jogo.js — carregado com ``` ```js // jogo.js (um módulo: pode usar await) if (Plicflix.dentro()) { Plicflix.progresso(10, "Entrando…"); try { await Plicflix.entrar("/api/plicflix/entrar"); // o SEU servidor troca o token e cria a sessão } catch (e) { // não deu (token vencido, ou recarregou depois de entrar): use a sessão que já existe // ou mostre o seu login de sempre } Plicflix.aoSair(() => salvarProgresso()); // o "Sair" da bolha espera você salvar } // … carregue o jogo … Plicflix.pronto(); // tira a tela de carregamento do plicflix ``` **No servidor (Node, com Express):** ```js import express from "express"; import { trocarIngresso } from "./plicflix.mjs"; // https://developers.plicflix.com/sdk/plicflix.mjs?baixar=1 const app = express(); app.use(express.json()); app.post("/api/plicflix/entrar", async (req, res) => { let r; try { r = await trocarIngresso(req.body.token); // lê PLICFLIX_CHAVE e PLICFLIX_API do ambiente } catch (e) { return res.status(e.status === 401 ? 401 : 502).json({ erro: "abra o jogo de novo pelo plicflix" }); } if (r.jogo !== "meu-jogo") return res.status(401).end(); // o seu slug // ache ou crie a conta pelo r.jogador.id ("pf_…", fixo) e guarde o r.jogador.nome const conta = await suaFuncaoAcharOuCriarConta(r.jogador.id, r.jogador.nome); const sessao = await suaFuncaoCriarSessao(conta); // o cookie do iframe (escrito à mão: a opção "partitioned" do res.cookie só existe no Express 5) res.setHeader("Set-Cookie", `sessao=${sessao}; Path=/; HttpOnly; Secure; SameSite=None; Partitioned; Max-Age=2592000`); res.json({ ok: true }); }); ``` **Exemplo completo e executável** (Node sem dependências, ou Go): baixe [`exemplo-node.zip`](/sdk/exemplo-node.zip) ou [`exemplo-go.zip`](/sdk/exemplo-go.zip). Rode com `PLICFLIX_CHAVE=pk_… node server.mjs` e siga o README de dentro. **E a permissão para o plicflix abrir o jogo**, que é o [passo 5](#5-deixar-o-plicflix-abrir-o-seu-jogo). Com isso o jogo já funciona no plicflix. Os passos 9 e 10 (onde o jogador está, amigos) deixam a experiência completa. --- ## 4. Entrada: o jogador já chega logado ### O que chega no endereço O app abre `https://seu-jogo/?ref=plicflix#plicflix=pft_…&pf_idioma=pt-BR&pf_plataforma=android`. - **`?ref=plicflix`:** vai para o seu servidor. Use nas suas métricas. - **O fragmento (`#…`):** o navegador **nunca** envia ao seu servidor, então o token não aparece nos seus logs. O SDK lê o token e **apaga** o fragmento da barra de endereço. ### O token - **Formato:** `pft_` seguido de 43 caracteres. É opaco: não carrega dado nenhum. - **Validade:** **5 minutos ou uma troca**, o que vier primeiro. - **Recarregar a página:** antes da troca, o SDK guarda o token no `sessionStorage` da aba. Depois da troca, `Plicflix.token()` vem `null` e o jogador segue com a **sua** sessão. `Plicflix.dentro()` continua `true`, por causa do `?ref=plicflix`. ### A troca, no seu servidor ``` POST https://api.plicflix.com/v1/ingresso/trocar Authorization: Bearer pk_… Content-Type: application/json { "token": "pft_…" } ``` **200**: ```json { "jogador": { "id": "pf_…", "nome": "Paulo" }, "jogo": "seu-slug", "partida": "pt_…", "assinante": true, "contexto": { "ref": "plicflix", "idioma": "pt-BR", "plataforma": "web" } } ``` **401**: o token é inválido, venceu, já foi trocado ou é de um jogo de outro parceiro. É sempre a mesma resposta, de propósito, para não ajudar quem tenta adivinhar tokens. Os ajudantes já prontos (só a biblioteca padrão; leem `PLICFLIX_CHAVE` e `PLICFLIX_API` do ambiente): - **Node 18+:** [`plicflix.mjs`](/sdk/plicflix.mjs?baixar=1) → `await trocarIngresso(token)`; - **Go:** [`plicflix.go`](/sdk/plicflix.go?baixar=1) → `plicflix.DoAmbiente().Trocar(ctx, token)`. Outra linguagem? É um POST comum, como acima. Erros: `401` (token ruim, de propósito sem detalhe), `400` (corpo inválido), `429` (limite), `5xx` (tente de novo). ### A conta - **Chave:** ligue a conta do seu jogo a `jogador.id`, numa coluna única (por exemplo `contas.plicflix_id`). - **Sem senha utilizável:** quem entra pelo plicflix não precisa de senha. Gere uma senha aleatória que ninguém conhece. - **Reserve o login interno:** se o login for um e-mail, use um domínio que ninguém consiga cadastrar (por exemplo `pf_…@plicflix.invalid`) e recuse esse domínio no seu cadastro normal. Sem isso, alguém poderia criar a conta antes e tomar o lugar do jogador. - **O apelido muda:** atualize o nome a cada entrada. - **Confira o jogo:** confira `jogo == seu slug` antes de abrir a sessão. --- ## 5. Deixar o plicflix abrir o seu jogo Na web, o app abre o jogo num `