# WeChat Mini Program - Auto-Correction Homework System **Status**: WIP **Created**: 2025-11-30 **Moved to WIP**: 2025-11-30 **Horizon**: Plusieurs années (usage long terme) **Use Case**: Mini Program WeChat pour soumettre devoirs audio/vidéo et recevoir corrections automatiques AI **Target**: Cours particuliers d'Alexis (2 classes, usage éducatif privé) **Alternative**: Bot Wechaty (voir `wechat_homework_bot.md`) --- ## 📋 Table des matières 1. [Vue d'ensemble](#vue-densemble) 2. [Pourquoi Mini Program > Bot](#pourquoi-mini-program--bot) 3. [Faisabilité technique](#faisabilité-technique) 4. [Architecture système](#architecture-système) 5. [Stack technique](#stack-technique) 6. [Features détaillées](#features-détaillées) 7. [Design & UX](#design--ux) 8. [Backend API](#backend-api) 9. [Workflow utilisateur](#workflow-utilisateur) 10. [Risques et mitigations](#risques-et-mitigations) 11. [Plan d'implémentation](#plan-dimplémentation) 12. [Coûts](#coûts) 13. [Requirements WeChat](#requirements-wechat) 14. [Process Setup Compte WeChat Developer](#process-setup-compte-wechat-developer) 15. [Ressources](#ressources) --- ## 🎯 Vue d'ensemble ### Problème - Étudiants envoient devoirs audio/vidéo de manière désorganisée - Collecte manuelle chronophage - Correction manuelle répétitive - Pas de tracking automatique - Feedback non standardisé ### Solution : WeChat Mini Program Application native WeChat permettant de : 1. **Soumettre** devoirs audio/vidéo avec interface dédiée 2. **Transcrire** automatiquement (Whisper API) 3. **Corriger** avec AI (GPT-4) 4. **Afficher** feedback structuré en temps réel 5. **Tracker** progression individuelle 6. **Consulter** historique et statistiques ### Bénéfices vs Bot Wechaty | Avantage | Impact | |----------|--------| | **Zéro risque ban** | Stabilité long terme garantie | | **UX native** | Adoption étudiants +50% | | **Features riches** | Historique, stats, notifications | | **Scalabilité** | Illimitée (vs bot limité) | | **Professionnalisme** | Crédibilité auprès parents/école | --- ## ✅ Pourquoi Mini Program > Bot ### Comparaison directe | Critère | Bot Wechaty | Mini Program ⭐ | |---------|-------------|----------------| | **Risque ban** | 5-15% ❌ | 0% ✅ | | **Setup initial** | 2 jours ✅ | 5-7 jours ⚠️ | | **Stabilité** | Moyenne | Excellente ✅ | | **UX étudiant** | Messages WeChat | App dédiée ✅ | | **Features** | Limitées | Illimitées ✅ | | **Coût mensuel** | $23-51 | $10-30 ✅ | | **Scalabilité** | ~50 users | Illimitée ✅ | | **Pérennité** | Risquée | Garantie ✅ | ### Cas d'usage recommandés **Mini Program** si : - ✅ Usage >3 mois - ✅ Classes stables - ✅ Volonté investir 1 semaine dev - ✅ Besoin crédibilité/professionnalisme **Bot Wechaty** si : - ✅ Test <2 mois - ✅ POC rapide - ✅ Pas sûr de continuer --- ## 🔧 Faisabilité technique ### Verdict : **100% FAISABLE** ### Capacités WeChat Mini Program confirmées **API natives disponibles** : - ✅ `wx.chooseMedia()` - Sélection audio/vidéo/image - ✅ `wx.getRecorderManager()` - Enregistrement audio natif - ✅ `wx.uploadFile()` - Upload fichiers vers serveur - ✅ `wx.request()` - API REST calls - ✅ `wx.showToast()` / `wx.showModal()` - Notifications - ✅ `wx.navigateTo()` - Navigation pages - ✅ Template Messages - Notifications push **Limitations techniques** : - Upload fichier : Max 100MB (largement suffisant pour audio/vidéo courts) - Durée enregistrement : Illimitée (gérer côté app) - Formats supportés : mp3, mp4, m4a, wav (tous compatibles Whisper) ### Proof of concept ```javascript // Exemple minimal fonctionnel Page({ uploadHomework() { wx.chooseMedia({ count: 1, mediaType: ['video', 'audio'], success: (res) => { wx.uploadFile({ url: 'https://api.example.com/homework', filePath: res.tempFiles[0].tempFilePath, name: 'file', success: (uploadRes) => { wx.showToast({ title: 'Envoyé !' }) } }) } }) } }) ``` --- ## 🏗️ Architecture système ``` ┌─────────────────────────────────────────────────────────────────┐ │ ÉTUDIANT (WeChat App) │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ WeChat Mini Program Frontend │ │ │ │ - Upload audio/vidéo │ │ │ │ - Enregistrement natif │ │ │ │ - Historique devoirs │ │ │ │ - Stats progression │ │ │ └──────────────────────┬───────────────────────────────────┘ │ └─────────────────────────┼───────────────────────────────────────┘ │ │ HTTPS (wx.uploadFile / wx.request) │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ BACKEND SERVER (VPS) │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ REST API (Express.js) │ │ │ │ POST /api/homework - Upload devoir │ │ │ │ GET /api/homework/:id - Status correction │ │ │ │ GET /api/student/stats - Statistiques │ │ │ │ GET /api/student/history - Historique │ │ │ └──────────────────────┬───────────────────────────────────┘ │ │ │ │ │ ┌──────────────────────▼───────────────────────────────────┐ │ │ │ JOB QUEUE (Bull + Redis) │ │ │ │ - process-homework (async) │ │ │ │ - send-notification │ │ │ └──────────────────────┬───────────────────────────────────┘ │ │ │ │ │ ┌──────────────────────▼───────────────────────────────────┐ │ │ │ FILE STORAGE (./uploads/) │ │ │ │ timestamp_studentId_filename.mp3/mp4 │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ DATABASE (PostgreSQL/SQLite) │ │ │ │ - students │ │ │ │ - assignments │ │ │ │ - submissions │ │ │ │ - corrections │ │ │ └──────────────────────────────────────────────────────────┘ │ └─────────────────────────┬───────────────────────────────────────┘ │ │ API Calls │ ┌─────────────────┼─────────────────┐ │ │ │ ▼ ▼ ▼ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Whisper │ │ GPT-4 │ │ WeChat │ │ API │ │ API │ │ Notify API │ │ │ │ │ │ │ │ Transcription│ │ Correction │ │ Template │ │ Audio→Text │ │ + Feedback │ │ Message │ └──────────────┘ └──────────────┘ └──────────────┘ ``` --- ## 🛠️ Stack technique ### 1. Frontend (WeChat Mini Program) **Langage** : JavaScript (WXML/WXSS, similaire HTML/CSS mais propriétaire) **Structure fichiers** : ``` miniprogram/ ├── pages/ │ ├── index/ # Page accueil │ ├── upload/ # Upload devoir │ ├── history/ # Historique │ ├── detail/ # Détail correction │ └── stats/ # Statistiques ├── components/ │ ├── recorder/ # Enregistreur audio custom │ └── progress/ # Barre progression ├── utils/ │ ├── api.js # Helper API calls │ └── auth.js # WeChat login ├── app.js # Entry point ├── app.json # Config app └── app.wxss # Styles globaux ``` **Frameworks/Libs** : - **WeChat DevTools** (IDE officiel) - Obligatoire - **Vant Weapp** (UI components) - Optionnel mais recommandé - **WeUI** (style guide WeChat) - Recommandé ### 2. Backend **Langage** : Node.js 18+ (TypeScript optionnel) **Framework** : Express.js **Structure** : ``` server/ ├── src/ │ ├── routes/ │ │ ├── homework.js │ │ ├── student.js │ │ └── auth.js │ ├── controllers/ │ │ ├── homeworkController.js │ │ └── studentController.js │ ├── services/ │ │ ├── whisperService.js # Transcription │ │ ├── gptService.js # Correction │ │ └── wechatService.js # Notifications │ ├── jobs/ │ │ └── processHomework.js # Worker async │ ├── models/ │ │ ├── Student.js │ │ ├── Submission.js │ │ └── Correction.js │ ├── middleware/ │ │ ├── auth.js # JWT validation │ │ └── upload.js # Multer config │ └── utils/ │ ├── db.js │ └── logger.js ├── uploads/ # Fichiers temporaires ├── .env # Variables env └── server.js # Entry point ``` **Key dependencies** : ```json { "express": "^4.18.0", "multer": "^1.4.5-lts.1", "bull": "^4.12.0", "redis": "^4.6.0", "pg": "^8.11.0", // PostgreSQL "openai": "^4.20.0", // Whisper + GPT-4 "dotenv": "^16.3.0", "jsonwebtoken": "^9.0.0", "axios": "^1.6.0" } ``` ### 3. Database **PostgreSQL** (recommandé) ou SQLite (POC) **Schema** : ```sql -- Students (liaison WeChat OpenID) CREATE TABLE students ( id SERIAL PRIMARY KEY, wechat_openid VARCHAR(100) UNIQUE NOT NULL, nickname VARCHAR(100), class_name VARCHAR(50), created_at TIMESTAMP DEFAULT NOW() ); -- Assignments (devoirs à faire) CREATE TABLE assignments ( id SERIAL PRIMARY KEY, title VARCHAR(200) NOT NULL, description TEXT, due_date TIMESTAMP, created_at TIMESTAMP DEFAULT NOW() ); -- Submissions (devoirs rendus) CREATE TABLE submissions ( id SERIAL PRIMARY KEY, student_id INTEGER REFERENCES students(id), assignment_id INTEGER REFERENCES assignments(id), file_path VARCHAR(500) NOT NULL, file_type VARCHAR(20), -- 'audio' | 'video' file_size INTEGER, status VARCHAR(20) DEFAULT 'pending', -- pending | processing | completed | error submitted_at TIMESTAMP DEFAULT NOW() ); -- Corrections CREATE TABLE corrections ( id SERIAL PRIMARY KEY, submission_id INTEGER REFERENCES submissions(id) UNIQUE, transcription TEXT, score INTEGER, -- 0-100 feedback_json JSONB, -- Structure feedback détaillé corrected_at TIMESTAMP DEFAULT NOW() ); -- Stats cache (pour performance) CREATE TABLE student_stats ( student_id INTEGER PRIMARY KEY REFERENCES students(id), total_submissions INTEGER DEFAULT 0, average_score REAL, last_submission TIMESTAMP, updated_at TIMESTAMP DEFAULT NOW() ); -- Indexes pour performance CREATE INDEX idx_submissions_student ON submissions(student_id); CREATE INDEX idx_submissions_status ON submissions(status); CREATE INDEX idx_corrections_submission ON corrections(submission_id); ``` ### 4. Job Queue **Bull** (Redis-based) pour traitement asynchrone **Pourquoi** : - Upload fichier = retour immédiat - Transcription + Correction = traitement async (peut prendre 30-60s) - Retry automatique si échec - Monitoring jobs ```javascript // jobs/processHomework.js const Queue = require('bull'); const homeworkQueue = new Queue('homework', process.env.REDIS_URL); homeworkQueue.process(async (job) => { const { submissionId, filePath } = job.data; // 1. Transcription job.progress(30); const transcription = await whisperService.transcribe(filePath); // 2. Correction job.progress(60); const correction = await gptService.correct(transcription); // 3. Save DB job.progress(90); await db.saveCorrection(submissionId, correction); // 4. Notify student await wechatService.sendTemplateMessage(submissionId); return { success: true }; }); ``` ### 5. AI Services #### Whisper API (Transcription) ```javascript // services/whisperService.js const OpenAI = require('openai'); const fs = require('fs'); const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); async function transcribe(audioPath) { const transcription = await openai.audio.transcriptions.create({ file: fs.createReadStream(audioPath), model: "whisper-1", language: "fr", // ou "zh", "en" response_format: "verbose_json" // Inclut timestamps, confidence }); return { text: transcription.text, duration: transcription.duration, confidence: transcription.segments[0]?.confidence || 0 }; } ``` #### GPT-4 API (Correction) ```javascript // services/gptService.js async function correct(transcription, assignmentCriteria) { const prompt = ` Tu es un professeur de français expérimenté. Corrige ce devoir oral selon ces critères : **Critères d'évaluation** : 1. Grammaire (0-25 points) 2. Vocabulaire (0-25 points) 3. Fluidité (0-25 points) 4. Prononciation (0-25 points) **Transcription** : ${transcription.text} **Format de réponse** (JSON strict) : { "score_total": 0-100, "scores_details": { "grammaire": 0-25, "vocabulaire": 0-25, "fluidite": 0-25, "prononciation": 0-25 }, "points_positifs": ["...", "..."], "points_ameliorer": ["...", "..."], "recommandations": "...", "erreurs_principales": [ {"texte": "...", "correction": "...", "explication": "..."} ] } `; const response = await openai.chat.completions.create({ model: "gpt-4", messages: [ { role: "system", content: "Tu es un correcteur expert. Réponds UNIQUEMENT en JSON valide." }, { role: "user", content: prompt } ], temperature: 0.3, response_format: { type: "json_object" } }); return JSON.parse(response.choices[0].message.content); } ``` ### 6. Infrastructure **Hébergement** : - **VPS Chine** : Aliyun, Tencent Cloud (si besoin ICP license pour publication) - **VPS International** : Hetzner, DigitalOcean, Vultr (+ VPN si blocages) - **Serverless** : Vercel/Railway (backend) + Cloudflare R2 (storage) **Requirements minimaux** : - 2GB RAM - 2 vCPU - 30GB SSD - Ubuntu 22.04 LTS **Stack deployment** : - **PM2** : Process manager + auto-restart - **Nginx** : Reverse proxy + SSL - **Let's Encrypt** : Certificats SSL gratuits - **Redis** : Job queue + cache --- ## 🎨 Features détaillées ### MVP (Phase 1) #### 1. Authentification - Login WeChat automatique (`wx.login()`) - Récupération OpenID (identifiant unique anonyme) - Stockage JWT pour API calls #### 2. Soumission devoir - **Upload fichier existant** : - Bouton "Choisir fichier" → `wx.chooseMedia()` - Preview audio/vidéo avant envoi - Indication taille fichier - **Enregistrement direct** : - Bouton "Enregistrer" → `wx.getRecorderManager()` - Timer temps réel - Bouton pause/reprendre - Écoute playback avant envoi - **Métadonnées** : - Sélection assignment (si multiple devoirs) - Commentaire optionnel étudiant - **Upload** : - Progress bar temps réel - Retry automatique si échec réseau - Notification succès #### 3. Status correction - **Page status temps réel** : - "⏳ En cours de traitement..." - "🎧 Transcription audio..." (30%) - "🤖 Correction en cours..." (60%) - "✅ Terminé !" (100%) - **Notifications push** : - Template Message WeChat quand correction prête #### 4. Affichage feedback - **Score global** : Grande card avec score/100 - **Scores détaillés** : - Grammaire : 18/25 - Vocabulaire : 20/25 - Fluidité : 15/25 - Prononciation : 17/25 - **Points positifs** : Liste avec icônes ✅ - **Points à améliorer** : Liste avec icônes ⚠️ - **Erreurs principales** : - Texte original - Correction suggérée - Explication courte - **Recommandations** : Paragraphe synthèse #### 5. Historique - **Liste devoirs** : - Tri par date (récent → ancien) - Card par devoir : Date, titre, score, status - Filtre par status (tous, corrigés, en attente) - **Navigation** : Tap card → Page détail correction #### 6. Statistiques basiques - **Nombre devoirs rendus** - **Score moyen** - **Dernier devoir** - **Graphique progression** (scores au fil du temps) ### Phase 2 (Features avancées) #### 7. Gestion assignments professeur - Interface admin (web ou mini program séparé) - Création devoirs avec : - Titre, description, deadline - Critères correction custom - Durée audio min/max - Suivi temps réel (qui a rendu, qui manque) #### 8. Notifications intelligentes - Rappels deadline (J-3, J-1, J-day) - Encouragements progression - Alerts baisse performance #### 9. Gamification - Badges (3 devoirs d'affilée, score >90, etc.) - Leaderboard classe (optionnel, opt-in) - Streaks (jours consécutifs) #### 10. Export données - Export Excel stats élève - PDF rapport individuel - Partage parents (QR code) #### 11. Multi-langue - Switch FR/EN/CN - Détection langue audio automatique - Feedback dans langue de l'étudiant #### 12. Voice feedback - Option TTS (Text-to-Speech) pour lire feedback - Audio correction prononciation --- ## 🎨 Design & UX ### Thème visuel **Identité** : - Clean, éducatif, encourageant - Couleurs : Bleu primary (#1989FA WeChat), Vert success (#07C160), Rouge error (#EE0A24) - Icons : WeUI icons standard ### Pages principales #### Page 1 : Home ``` ┌─────────────────────────────┐ │ 👋 Bonjour, [Nickname] │ │ │ │ 📊 Tes statistiques │ │ ┌─────────────────────┐ │ │ │ Devoirs : 12 │ │ │ │ Moyenne : 78/100 │ │ │ │ Dernier : Il y a 2j │ │ │ └─────────────────────┘ │ │ │ │ [📤 Nouveau devoir] │ │ │ │ 📝 Devoirs récents │ │ ┌─────────────────────┐ │ │ │ 28 Nov - Devoir 5 │ │ │ │ ✅ 82/100 │ │ │ └─────────────────────┘ │ │ ┌─────────────────────┐ │ │ │ 26 Nov - Devoir 4 │ │ │ │ ⏳ En cours... │ │ │ └─────────────────────┘ │ │ │ │ [Historique complet] │ └─────────────────────────────┘ Home Upload Stats ``` #### Page 2 : Upload ``` ┌─────────────────────────────┐ │ 📤 Soumettre un devoir │ │ │ │ Devoir : [Dropdown v] │ │ Devoir 5 - Présentation │ │ │ │ ┌─────────────────────┐ │ │ │ 🎙️ Enregistrer │ │ │ │ audio │ │ │ └─────────────────────┘ │ │ │ │ ┌─────────────────────┐ │ │ │ 📁 Choisir │ │ │ │ fichier │ │ │ └─────────────────────┘ │ │ │ │ Commentaire (optionnel): │ │ ┌─────────────────────┐ │ │ │ │ │ │ └─────────────────────┘ │ │ │ │ [Envoyer] │ └─────────────────────────────┘ ``` #### Page 3 : Feedback détail ``` ┌─────────────────────────────┐ │ Devoir 5 - 28 Nov 2025 │ │ │ │ ┌─────────────────────┐ │ │ │ 82/100 │ │ │ │ ⭐⭐⭐⭐ │ │ │ └─────────────────────┘ │ │ │ │ Détails : │ │ Grammaire ███████ 18/25 │ │ Vocabulaire ████████ 20/25│ │ Fluidité ██████ 15/25 │ │ Prononciation ███████ 17/25│ │ │ │ ✅ Points positifs : │ │ • Bon vocabulaire varié │ │ • Structure claire │ │ │ │ ⚠️ À améliorer : │ │ • Accord verbes │ │ • Prononciation 'u' │ │ │ │ 💡 Recommandations : │ │ Revise les accords... │ │ │ │ [Voir transcription] │ └─────────────────────────────┘ ``` ### Composants réutilisables #### ScoreCard Component ```javascript // components/score-card/score-card.js Component({ properties: { score: Number, maxScore: { type: Number, value: 100 } }, data: { percentage: 0, stars: 0 }, lifetimes: { attached() { const percentage = (this.data.score / this.data.maxScore) * 100; const stars = Math.round(percentage / 20); // 0-5 étoiles this.setData({ percentage, stars }); } } }) ``` --- ## 🔌 Backend API ### Endpoints complets #### 1. Authentication **POST `/api/auth/login`** ```javascript // Request { "code": "WeChat login code" } // Response { "token": "JWT_TOKEN", "student": { "id": 123, "nickname": "张三", "class": "Class A" } } ``` #### 2. Assignments **GET `/api/assignments`** ```javascript // Response [ { "id": 1, "title": "Devoir 5 - Présentation famille", "description": "Présente ta famille en 2 minutes", "due_date": "2025-12-05T23:59:59Z", "status": "active" } ] ``` #### 3. Submissions **POST `/api/homework`** ```javascript // Request (multipart/form-data) { "file": File, "assignment_id": 1, "comment": "Voici mon devoir" } // Response { "submission_id": 456, "status": "pending", "message": "Devoir reçu ! Traitement en cours..." } ``` **GET `/api/homework/:id`** ```javascript // Response { "id": 456, "status": "completed", // pending | processing | completed | error "progress": 100, "submitted_at": "2025-11-30T10:30:00Z", "corrected_at": "2025-11-30T10:32:15Z", "file_type": "audio", "correction": { "score_total": 82, "scores_details": { "grammaire": 18, "vocabulaire": 20, "fluidite": 15, "prononciation": 17 }, "points_positifs": ["Vocabulaire varié", "Structure claire"], "points_ameliorer": ["Accords verbes", "Prononciation 'u'"], "recommandations": "...", "transcription": "Bonjour je m'appelle..." } } ``` #### 4. Student Stats **GET `/api/student/stats`** ```javascript // Response { "total_submissions": 12, "average_score": 78.5, "last_submission": "2025-11-30T10:30:00Z", "scores_history": [ { "date": "2025-11-15", "score": 75 }, { "date": "2025-11-20", "score": 80 }, { "date": "2025-11-25", "score": 82 } ] } ``` **GET `/api/student/history`** ```javascript // Query params: ?limit=20&offset=0&status=all // Response { "submissions": [ { "id": 456, "assignment_title": "Devoir 5", "submitted_at": "2025-11-30T10:30:00Z", "status": "completed", "score": 82 } ], "total": 12 } ``` ### Implementation complète ```javascript // routes/homework.js const express = require('express'); const multer = require('multer'); const router = express.Router(); const homeworkController = require('../controllers/homeworkController'); const authMiddleware = require('../middleware/auth'); const upload = multer({ dest: 'uploads/', limits: { fileSize: 100 * 1024 * 1024 }, // 100MB fileFilter: (req, file, cb) => { const allowedTypes = ['audio/mpeg', 'audio/mp4', 'video/mp4']; if (allowedTypes.includes(file.mimetype)) { cb(null, true); } else { cb(new Error('Type fichier non supporté')); } } }); router.post( '/homework', authMiddleware.verifyToken, upload.single('file'), homeworkController.submit ); router.get( '/homework/:id', authMiddleware.verifyToken, homeworkController.getStatus ); module.exports = router; ``` ```javascript // controllers/homeworkController.js const homeworkQueue = require('../jobs/processHomework'); const db = require('../utils/db'); exports.submit = async (req, res) => { try { const { assignment_id, comment } = req.body; const file = req.file; const studentId = req.user.id; // From JWT // Save submission DB const submission = await db.query(` INSERT INTO submissions (student_id, assignment_id, file_path, file_type, file_size) VALUES ($1, $2, $3, $4, $5) RETURNING id `, [studentId, assignment_id, file.path, file.mimetype.split('/')[0], file.size]); const submissionId = submission.rows[0].id; // Add to job queue (async processing) await homeworkQueue.add('process-homework', { submissionId, filePath: file.path, fileType: file.mimetype }); res.json({ submission_id: submissionId, status: 'pending', message: 'Devoir reçu ! Traitement en cours...' }); } catch (error) { console.error('Submit error:', error); res.status(500).json({ error: 'Erreur serveur' }); } }; exports.getStatus = async (req, res) => { try { const { id } = req.params; const studentId = req.user.id; // Get submission + correction const result = await db.query(` SELECT s.*, c.transcription, c.score, c.feedback_json, c.corrected_at FROM submissions s LEFT JOIN corrections c ON s.id = c.submission_id WHERE s.id = $1 AND s.student_id = $2 `, [id, studentId]); if (result.rows.length === 0) { return res.status(404).json({ error: 'Devoir non trouvé' }); } const submission = result.rows[0]; res.json({ id: submission.id, status: submission.status, submitted_at: submission.submitted_at, corrected_at: submission.corrected_at, correction: submission.feedback_json ? { score_total: submission.score, ...submission.feedback_json, transcription: submission.transcription } : null }); } catch (error) { console.error('GetStatus error:', error); res.status(500).json({ error: 'Erreur serveur' }); } }; ``` --- ## 🔄 Workflow utilisateur ### Scénario complet **1. Première connexion (one-time)** ``` Étudiant ouvre Mini Program → wx.login() automatique → Backend crée compte avec OpenID → Demande nickname (optionnel) → Assign à classe (via code invitation ou manual) ``` **2. Soumission devoir** ``` Étudiant clique "Nouveau devoir" → Sélectionne assignment (dropdown) → Choix : Enregistrer OU Upload fichier [Enregistrement] → Clique bouton micro → Enregistre (timer visible) → Arrête enregistrement → Écoute playback (bouton play) → Valide ou recommence [Upload] → Clique "Choisir fichier" → Sélectionne depuis galerie/fichiers → Preview fichier → (Optionnel) Ajoute commentaire → Clique "Envoyer" → Progress bar upload (0-100%) → Notification "Devoir envoyé !" → Redirection page status ``` **3. Traitement backend (invisible pour user)** ``` [Backend reçoit fichier] → Save DB (status: pending) → Return submission_id → Add job queue [Worker async] → Update status: processing → Extract audio si vidéo (ffmpeg) → Whisper API transcription (30s) → GPT-4 correction (15s) → Save correction DB → Update status: completed → Send WeChat Template Message notification ``` **4. Consultation résultat** ``` [Temps réel] Étudiant voit page status auto-refresh → "⏳ En cours..." → "🎧 Transcription..." → "✅ Terminé !" [Notification push] Reçoit Template Message WeChat → "Ton devoir a été corrigé ! Score: 82/100" → Clique notification → Ouvre Mini Program page détail [Page détail] → Score global 82/100 → Graphique scores détaillés → Points positifs / à améliorer → Erreurs avec corrections suggérées → Recommandations → Bouton "Voir transcription" (expand) ``` **5. Historique** ``` Étudiant clique tab "Historique" → Liste tous devoirs (scroll infini) → Filtre par status → Clique card → Page détail correction ``` **6. Stats** ``` Étudiant clique tab "Stats" → Cards stats (total, moyenne, dernier) → Graphique progression (line chart) → (Future) Badges, streaks, etc. ``` --- ## ⚠️ Risques et mitigations ### 1. Review WeChat rejetée **Risque** : Mini Program refusée lors du review initial **Probabilité** : 15-25% (première soumission) **Causes communes** : - Contenu sensible (politique, pornographie) - Fonctionnalités non déclarées - Bugs critiques - Manque documentation **Mitigations** : - ✅ **Review checklist officielle** avant submit - ✅ **Tests exhaustifs** (zero crash) - ✅ **Description claire** du use case éducatif - ✅ **Screenshots** représentatifs - ✅ **Privacy policy** si collect données - ✅ **Soumettre en chinois** (description, textes) **Plan B si rejet** : - Lire raison rejet (WeChat donne feedback) - Corriger et re-soumettre (généralement accepté round 2) - Support WeChat développeur (réactif) ### 2. Coûts API explosent **Risque** : Volume inattendu → facture OpenAI élevée **Probabilité** : 10% (si pas de quotas) **Mitigations** : - ✅ **Hard limits** OpenAI dashboard (ex: $50/mois max) - ✅ **Rate limiting** app : Max 3 devoirs/étudiant/semaine - ✅ **Alertes** si coûts >$30/mois (email notification) - ✅ **Caching** : Ne pas re-transcrire si déjà fait - ✅ **Fallback** : Baidu STT gratuit si quota dépassé ### 3. Performance backend dégradée **Risque** : Trop de requests simultanées → serveur crash **Probabilité** : 20% (si traffic spike) **Mitigations** : - ✅ **Job queue** (Bull) : Traitement async, pas de surcharge - ✅ **Rate limiting** API : Max 10 req/min/user - ✅ **Auto-scaling** : VPS upgrade automatique (si cloud) - ✅ **Monitoring** : Uptime Kuma + alerts - ✅ **CDN** : Cloudflare pour fichiers statiques ### 4. Qualité transcription insuffisante **Risque** : Audio bruyant/mauvaise qualité → transcription incorrecte **Probabilité** : 15-25% **Mitigations** : - ✅ **Consignes claires** étudiant : Environnement calme, micro proche - ✅ **Validation confidence** Whisper : Flag si <0.7 - ✅ **Human review** échantillon aléatoire (10%) - ✅ **Bouton "Contester"** : Étudiant peut signaler erreur - ✅ **Fallback** : Si très mauvais, demander re-soumission ### 5. Privacy / RGPD **Risque** : Stockage données sensibles (voix mineurs) **Mitigations** : - ✅ **Consentement explicite** parents (popup première connexion) - ✅ **Anonymisation** : OpenID only, pas de noms réels stockés - ✅ **Encryption** fichiers sensibles (at rest + transit) - ✅ **Rétention** : Auto-delete fichiers après 90 jours - ✅ **Privacy policy** claire (page dédiée dans app) - ✅ **Export données** : User peut télécharger ses données ### 6. Dépendance OpenAI **Risque** : API OpenAI down → app inutilisable **Probabilité** : 2-5% (rare mais possible) **Mitigations** : - ✅ **Retry logic** : 3 tentatives avec backoff exponentiel - ✅ **Fallback API** : Baidu STT + Claude API (Anthropic) pour correction - ✅ **Queue persistence** : Redis persiste jobs si serveur redémarre - ✅ **Status page** : Afficher "Maintenance" si API down ### 7. WeChat API changes **Risque** : WeChat modifie API → app casse **Probabilité** : 5-10% sur 12 mois **Mitigations** : - ✅ **Version pinning** : Utiliser version stable SDK - ✅ **Monitoring** WeChat changelog - ✅ **Community** : Suivre forums développeurs WeChat - ✅ **Testing** : CI/CD avec tests automatisés --- ## 🚀 Plan d'implémentation ### Phase 0 : Setup & Requirements (Jour 1-2) **Objectif** : Compte développeur + environnement prêt **Tasks** : - [ ] Créer compte WeChat Developer (mp.weixin.qq.com) - Upload ID card (verification 1-3 jours) - Type compte : "个人" (Personnel) - Gratuit - [ ] Télécharger WeChat DevTools (IDE officiel) - [ ] Lire documentation officielle : - Mini Program guide : https://developers.weixin.qq.com/miniprogram/dev/framework/ - API reference : https://developers.weixin.qq.com/miniprogram/dev/api/ - [ ] Setup backend : - VPS (Hetzner $5/mois ou Aliyun) - Install Node.js 18+, PostgreSQL, Redis, Nginx - SSL certificate (Let's Encrypt) - [ ] Créer comptes API : - OpenAI account + $10 credits - WeChat Official Account (pour Template Messages) **Critère succès** : - Compte WeChat Developer vérifié - DevTools installé + Hello World compilé - Backend VPS accessible HTTPS --- ### Phase 1 : POC Frontend (Jour 3-4) **Objectif** : Mini Program basique qui upload fichier **Tasks** : - [ ] Créer projet Mini Program (DevTools) - [ ] Implémenter pages : - `index` : Home avec bouton upload - `upload` : Sélection fichier + upload - [ ] Implémenter `wx.chooseMedia()` + `wx.uploadFile()` - [ ] Mock backend (retourne success) - [ ] Test sur simulateur + vrai device (scan QR code) **Code minimal** : ```javascript // pages/upload/upload.js Page({ uploadFile() { wx.chooseMedia({ count: 1, mediaType: ['audio', 'video'], success: (res) => { wx.uploadFile({ url: 'https://yourserver.com/api/homework', filePath: res.tempFiles[0].tempFilePath, name: 'file', success: () => { wx.showToast({ title: 'Envoyé !' }) } }) } }) } }) ``` **Critère succès** : Upload fichier fonctionne sur vrai device --- ### Phase 2 : POC Backend (Jour 5-6) **Objectif** : API qui reçoit fichier + transcription Whisper **Tasks** : - [ ] Setup Express.js + Multer (file upload) - [ ] Endpoint `POST /api/homework` - [ ] Intégrer Whisper API - [ ] Return transcription au frontend - [ ] Test end-to-end (Mini Program → Backend → Whisper) **Code minimal** : ```javascript // server.js const express = require('express'); const multer = require('multer'); const whisperService = require('./services/whisper'); const app = express(); const upload = multer({ dest: 'uploads/' }); app.post('/api/homework', upload.single('file'), async (req, res) => { const transcription = await whisperService.transcribe(req.file.path); res.json({ transcription: transcription.text }); }); app.listen(3000); ``` **Critère succès** : - Upload audio → Backend → Whisper → Return transcription - Latence <60s --- ### Phase 3 : MVP Complet (Jour 7-10) **Objectif** : App fonctionnelle avec correction complète **Tasks Backend** : - [ ] Database PostgreSQL setup (schema complet) - [ ] JWT authentication (WeChat login) - [ ] Job queue (Bull + Redis) - [ ] GPT-4 correction service - [ ] Endpoints complets (homework, stats, history) - [ ] Template Messages WeChat (notifications) **Tasks Frontend** : - [ ] Page login (wx.login) - [ ] Page upload améliorée (enregistrement natif) - [ ] Page status (polling temps réel) - [ ] Page détail correction (score, feedback) - [ ] Page historique (liste devoirs) - [ ] Page stats (graphiques basiques) **Critère succès** : - 1 cycle complet : Upload → Transcription → Correction → Feedback - 5 étudiants tests utilisent pendant 3 jours - 0 crash critique --- ### Phase 4 : Testing & Review (Jour 11-13) **Objectif** : Tests exhaustifs + soumission WeChat review **Tasks** : - [ ] Tests fonctionnels : - Upload audio mp3 ✅ - Upload vidéo mp4 ✅ - Enregistrement natif ✅ - Correction précision >80% ✅ - Notifications push ✅ - [ ] Tests edge cases : - Fichier 100MB (limite) - Audio bruyant - Réseau lent/instable - Backend offline (error handling) - [ ] Tests devices : - iPhone (iOS 14+) - Android (version récente) - WeChat versions (latest + N-1) - [ ] Optimisations : - Code minification - Image compression - Lazy loading - [ ] Documentation : - Privacy policy (page dédiée) - User guide (FAQ) - Screenshots app (pour review) - [ ] Soumission WeChat review : - Remplir formulaire - Upload screenshots - Description claire (chinois) - Submit **Critère succès** : Review passée (ou feedback reçu si rejet) --- ### Phase 5 : Production Deploy (Jour 14-15) **Objectif** : Déploiement production stable **Tasks** : - [ ] Backend production : - PM2 setup (auto-restart) - Nginx reverse proxy - SSL certificate - Environment variables sécurisées - Logging (Winston) - Monitoring (Uptime Kuma) - [ ] Database : - Backups automatiques (daily, S3/OSS) - Indexes optimisés - [ ] Frontend : - Version production uploadée WeChat - QR code génération (pour partage étudiants) - [ ] Documentation : - README technique (pour maintenance) - Runbook (procédures incidents) **Critère succès** : - App publiée WeChat (accessible via QR code) - 95% uptime sur 48h - 10+ étudiants utilisent sans problème --- ### Phase 6 : Onboarding Users (Jour 16+) **Objectif** : Adoption massive étudiants **Tasks** : - [ ] Communication étudiants : - Message WeChat avec QR code - Video tutorial (1min) - FAQ (questions communes) - [ ] Monitoring adoption : - Track inscriptions - Support réactif (questions) - [ ] Itérations : - Collect feedback étudiants - Fix bugs critiques - Ajustements UX **Critère succès** : 80%+ étudiants utilisent dans 1 semaine --- ### Timeline récapitulatif | Phase | Durée | Cumul | Livrables | |-------|-------|-------|-----------| | **Phase 0** | 2j | J2 | Compte dev vérifié, VPS setup | | **Phase 1** | 2j | J4 | Mini Program upload fichier | | **Phase 2** | 2j | J6 | Backend + Whisper | | **Phase 3** | 4j | J10 | MVP complet fonctionnel | | **Phase 4** | 3j | J13 | Tests + Review soumise | | **Phase 5** | 2j | J15 | Production déployée | | **Phase 6** | Ongoing | J16+ | Adoption users | **TOTAL** : **15 jours** (temps plein) ou **3-4 semaines** (part-time) --- ## 💰 Coûts ### Setup initial (one-time) | Poste | Coût | Note | |-------|------|------| | **Compte WeChat Developer** | 0€ | Gratuit (type Personnel) | | **Développement** | 0€ | DIY | | **VPS setup** | 0€ | DIY | | **Domaine** | 10€/an | Optionnel (peut utiliser IP) | | **TOTAL** | **0-10€** | | ### Récurrent mensuel | Poste | Coût mensuel | Note | |-------|--------------|------| | **VPS** | $5-15 | Hetzner/DigitalOcean/Aliyun | | **Whisper API** | $3-10 | 20-50 étudiants, 2min audio moy | | **GPT-4 API** | $5-15 | Dépend longueur feedbacks | | **Redis Cloud** | $0-5 | Free tier OK pour <100 users | | **Backup storage** | $1-2 | S3/R2 pour DB backups | | **SSL certificate** | $0 | Let's Encrypt gratuit | | **TOTAL** | **$14-47/mois** | **~12-40€/mois** | ### Scaling costs **50 étudiants** (3 devoirs/semaine) : - Whisper : ~$10/mois - GPT-4 : ~$20/mois - VPS : $15/mois (upgrade 4GB RAM) - **Total** : ~$50/mois **100 étudiants** : - Whisper : ~$20/mois - GPT-4 : ~$40/mois - VPS : $20/mois (8GB RAM) - **Total** : ~$85/mois ### Comparaison Bot vs Mini Program | Coût | Bot Wechaty | Mini Program | |------|-------------|--------------| | **Setup** | $0 | $0 | | **Mensuel** | $23-51 | $14-47 ✅ | | **Puppet** | $8/mois | N/A ✅ | | **VPS** | $5-15 | $5-15 | | **APIs** | $10-25 | $10-25 | → **Mini Program ~$10/mois moins cher** (pas de Padlocal puppet) ### ROI (Return on Investment) **Temps gagné** (20 étudiants, 3 devoirs/semaine) : - Correction manuelle : 5min/devoir - Correction auto : 30s/devoir - **Gain** : 4.5min × 60 devoirs = **18h/mois** **Coût horaire** : $30/mois ÷ 18h = **$1.67/h** → Rentable si ton temps vaut >$2/h (spoiler : largement) --- ## 📋 Requirements WeChat ### 1. Compte développeur **Type recommandé** : 个人 (Personnel) **Avantages** : - ✅ Gratuit - ✅ Review rapide (1-7 jours) - ✅ Suffisant pour usage éducatif privé **Limitations** : - ⚠️ Max 10 Template Messages/jour (suffisant pour <100 users) - ⚠️ Pas de paiement WeChat Pay - ⚠️ Pas de géolocalisation avancée **Alternative** : 企业 (Entreprise) - Nécessite business license chinoise - Coût : 300 RMB/an (~40€) - Features illimitées → Overkill pour ton use case ### 2. Vérification identité **Documents requis** : - Carte d'identité (scan recto/verso) - Photo selfie avec ID card - Numéro téléphone chinois (SMS verification) **Process** : 1. Upload documents 2. Reconnaissance faciale (via WeChat app) 3. Review WeChat (1-3 jours ouvrés) 4. Notification approval ### 3. Domaine & SSL **Requirement** : Mini Program nécessite HTTPS pour API calls **Options** : - **Domaine propre** : exemple.com + Let's Encrypt SSL (gratuit) - **Cloudflare Tunnel** : Expose localhost sans domaine (gratuit) - **Ngrok** : Dev only, pas pour production **Whitelist** : Ajouter domaine dans settings Mini Program ### 4. ICP License (备案) **C'est quoi** : License gouvernementale chinoise pour héberger en Chine **Obligatoire si** : - Serveur en Chine (Aliyun, Tencent Cloud) - Mini Program publique (non-privée) **Pas obligatoire si** : - Serveur hors Chine (Hetzner, DigitalOcean) - Mini Program privée (usage interne) **Process** : 2-4 semaines, bureaucratique **Recommandation** : - Pour ton cas (usage privé) → **Pas besoin ICP** - Héberger hors Chine (Hetzner Europe) + Cloudflare CDN ### 5. Review checklist officielle **Avant submit, vérifier** : - [ ] Zero crash (tests exhaustifs) - [ ] Toutes pages fonctionnelles - [ ] Images <500KB chacune - [ ] No placeholder content ("Lorem ipsum") - [ ] Privacy policy (si collect données) - [ ] Description claire use case (chinois) - [ ] Screenshots représentatifs (4-5 images) - [ ] Catégorie correcte : "教育" (Education) - [ ] No contenu illégal (politique, porno, gambling) - [ ] Compliance : Pas de features non-déclarées **Délai review** : 1-7 jours (généralement 2-3 jours) **Taux acceptation** : ~75% première soumission, ~95% après corrections --- ## 🔧 Process Setup Compte WeChat Developer ### Vue d'ensemble **Objectif** : Créer et vérifier compte WeChat Developer pour développer Mini Programs **Durée totale** : 1-3 jours (délai approval WeChat) **Prérequis** : - Compte WeChat personnel actif - Carte d'identité valide (passeport acceptable) - Numéro téléphone chinois (ou international, selon région) - Email valide --- ### Étape 1 : Création du compte (15 minutes) #### 1.1 Accéder au portail développeur **URL** : https://mp.weixin.qq.com/ **Process** : 1. Ouvre le site dans ton navigateur 2. Clique sur **"立即注册"** (S'inscrire maintenant) en haut à droite 3. Sélectionne type de compte : **"小程序"** (Mini Program) #### 1.2 Choix du type de compte **3 options disponibles** : | Type | Chinois | Coût | Use Case | |------|---------|------|----------| | **Personnel** | 个人 | Gratuit ✅ | Usage privé/éducatif | | **Entreprise** | 企业 | 300 RMB/an | Usage commercial | | **Organisation** | 组织 | Gratuit | ONG, écoles | **Pour ton projet** : Choisis **"个人" (Personnel)** **Pourquoi Personnel est suffisant** : - ✅ Gratuit (0€) - ✅ Peut publier Mini Programs - ✅ Peut utiliser API essentielles (upload, storage, notifications limitées) - ✅ Suffisant pour <100 utilisateurs - ⚠️ Limitations : 10 Template Messages/jour (OK pour ton usage) #### 1.3 Remplir informations de base **Formulaire à compléter** : ``` Email : [ton email] → Utilisé pour récupération compte uniquement → Reçois code verification email Mot de passe : [8-20 caractères] → Doit contenir lettres + chiffres Code verification : [reçu par email] → Valide pendant 10 minutes ☑️ J'accepte les termes et conditions ``` **Cliquer** : **"注册"** (S'inscrire) --- ### Étape 2 : Sélection sujet principal (5 minutes) #### 2.1 Type d'entité **Question** : 主体类型 (Type de sujet principal) **Sélectionne** : **"个人"** (Individuel) #### 2.2 Informations personnelles **Formulaire** : ``` Nom complet : [Ton nom sur ID] → Doit correspondre EXACTEMENT à ta pièce d'identité Type de document : → Sélectionne : "Passport" (si pas ID chinoise) → Ou : "身份证" (ID chinoise) Numéro document : [Numéro passeport/ID] Nationalité : [Sélectionne pays] Téléphone : [Numéro avec code pays] → Format : +33 6 12 34 56 78 (France) → Ou : +86 138 1234 5678 (Chine) → Reçois SMS verification ``` **Cliquer** : **"继续"** (Continuer) --- ### Étape 3 : Vérification identité (10 minutes) #### 3.1 Upload documents **Documents requis** : **Option A : Carte d'identité chinoise** (身份证) - Photo recto (face avant) - Photo verso (face arrière) - Format : JPG/PNG, <2MB chacune - Qualité : Tous les textes lisibles **Option B : Passeport** (Recommandé si étranger) - Photo page identité (avec photo + infos) - Format : JPG/PNG, <2MB - Qualité : MRZ (ligne codes en bas) lisible **Process upload** : 1. Clique **"上传身份证正面"** (Upload recto) 2. Sélectionne fichier depuis ordinateur 3. Vérifie preview (tous textes nets ?) 4. Répète pour verso (si ID chinoise) #### 3.2 Vérification faciale (obligatoire) **Méthode** : Scan QR code avec WeChat app mobile **Process** : 1. Page web affiche QR code 2. **Ouvre WeChat app** sur smartphone 3. **Scan QR code** (bouton "扫一扫" en haut droite) 4. WeChat ouvre interface vérification faciale 5. **Instructions à l'écran** : - Positionne visage dans cadre - Cligne des yeux quand demandé - Tourne tête gauche/droite - Souris (parfois demandé) 6. Vérification automatique (5-10 secondes) 7. **Message confirmation** : "验证成功" (Vérification réussie) **Retourne à ordinateur** → Page auto-refresh **Si échec vérification faciale** : - Assure éclairage suffisant - Retire lunettes/masque - Positionne caméra à hauteur visage - Réessaye (3 tentatives possibles) #### 3.3 Vérification téléphone **Process** : 1. Entre numéro téléphone (avec code pays) 2. Clique **"获取验证码"** (Obtenir code) 3. Reçois SMS avec code 6 chiffres (1-2 minutes) 4. Entre code dans champ 5. Clique **"验证"** (Vérifier) **Code expire après 10 minutes** → Redemander si expiré --- ### Étape 4 : Informations Mini Program (5 minutes) #### 4.1 Nom du Mini Program **Champ** : 小程序名称 (Nom Mini Program) **Règles** : - 4-30 caractères - Chinois, anglais, chiffres acceptés - Doit être unique (pas déjà pris) - **Peut changer 2 fois/an** (réfléchis bien) **Suggestions pour ton projet** : - **英语作业助手** (English Homework Assistant) - **法语练习小程序** (French Practice Mini Program) - **语言学习打卡** (Language Learning Check-in) **Exemple** : Entre `语言作业助手` (Language Homework Assistant) #### 4.2 Catégorie **Champ** : 服务类目 (Catégorie de service) **Sélectionne** : **"教育 > 在线教育"** (Education > Online Education) **Autres sous-catégories possibles** : - 教育 > 教育信息服务 (Services info éducation) - 教育 > 培训 (Formation) #### 4.3 Description **Champ** : 小程序介绍 (Introduction) **Règles** : - 10-120 caractères - Décrit clairement la fonction - Pas de contenu promotionnel excessif **Exemple** : ``` 一个帮助学生提交语音/视频作业并获得AI自动批改反馈的教育工具。 适用于语言学习课程的在线作业管理。 (Un outil éducatif pour soumettre devoirs audio/vidéo et recevoir feedback auto-corrigé par AI. Pour gestion devoirs cours de langues.) ``` #### 4.4 Logo/Icon **Upload icon Mini Program** : **Spécifications** : - Format : JPG/PNG - Taille : 1024×1024 pixels (exactement) - Poids : <2MB - Design : Simple, reconnaissable, pas de texte **Recommandations** : - Icône représentative (📚 livre, 🎓 graduation, 🎙️ micro) - Couleurs : 2-3 couleurs max - Éviter : Logo complexe, trop de détails **Si pas de logo** : - Utilise Canva (gratuit) : Template "App Icon" - Ou générateur AI : DALL-E, Midjourney - Ou placeholder temporaire (changeable plus tard) --- ### Étape 5 : Admin/Contact (3 minutes) #### 5.1 Administrateur **Champ** : 管理员信息 (Info administrateur) **Par défaut** : Toi (créateur compte) **Infos requises** : - Nom complet - WeChat ID (scan QR code pour lier) - Email - Téléphone **Lier WeChat admin** : 1. Page affiche QR code 2. Scan avec WeChat app 3. Confirme "绑定" (Lier) 4. Page web auto-refresh #### 5.2 Contact principal **Optionnel** : Email/téléphone pour support **Recommandation** : Utilise même email que admin --- ### Étape 6 : Submit & Review (1-3 jours) #### 6.1 Vérification finale **Checklist avant submit** : - [ ] Tous champs remplis - [ ] Documents uploaded (nets, lisibles) - [ ] Vérification faciale passée ✅ - [ ] Téléphone vérifié ✅ - [ ] WeChat admin lié ✅ - [ ] Nom/description en chinois (recommandé) #### 6.2 Submit application **Cliquer** : **"提交审核"** (Soumettre pour review) **Message confirmation** : "提交成功,请等待审核" (Soumis avec succès, attendre review) #### 6.3 Période d'attente **Durée** : 1-3 jours ouvrés (généralement 1-2 jours) **Pendant ce temps** : - Rien à faire côté utilisateur - WeChat review automatique + manuelle - Peut vérifier status : https://mp.weixin.qq.com/ (login) **Notification approval** : - **Email** : "小程序注册成功" (Mini Program enregistré avec succès) - **WeChat message** : Notification service account officiel - **SMS** : Sur numéro enregistré #### 6.4 Si rejet (15-25% cas) **Raisons communes** : - Documents illisibles - Nom déjà pris - Catégorie inadaptée - Vérification faciale échouée - Informations incohérentes **Process re-soumission** : 1. Login https://mp.weixin.qq.com/ 2. Lire message rejet (raison indiquée) 3. Corriger éléments signalés 4. Re-soumettre (bouton "重新提交") 5. Nouveau review (1-2 jours) **Taux acceptation round 2** : ~95% --- ### Étape 7 : Post-Approval Setup (30 minutes) #### 7.1 First login backend **Une fois approuvé** : 1. **Login** : https://mp.weixin.qq.com/ 2. **Entre** : Email + mot de passe 3. **Scan QR** : Confirmation WeChat app 4. **Dashboard** : Page admin Mini Program #### 7.2 Récupérer credentials **AppID** (obligatoire pour dev) : 1. Dans dashboard, clique **"开发" > "开发管理"** (Dev > Dev Management) 2. Section **"开发设置"** (Dev Settings) 3. **AppID** : Chaîne format `wx1234567890abcdef` 4. **Copier** et sauvegarder (besoin dans WeChat DevTools) **AppSecret** (pour backend API) : 1. Même page "开发设置" 2. Clique **"生成"** (Générer) à côté de AppSecret 3. **Scan QR** WeChat pour confirmer (sécurité) 4. **AppSecret** : Chaîne 32 caractères 5. **IMPORTANT** : Affiché une seule fois ! Copier immédiatement 6. Sauvegarder dans `.env` (ne JAMAIS commit Git) #### 7.3 Configurer domaine serveur **Whitelist ton backend** : 1. Clique **"开发" > "开发管理" > "服务器域名"** (Server Domain) 2. **request合法域名** : Entre `https://api.tondomaine.com` 3. **uploadFile合法域名** : Même domaine 4. **downloadFile合法域名** : Même domaine (si besoin) 5. **Cliquer** : **"保存并提交"** (Save and submit) **Requirements domaine** : - ✅ HTTPS obligatoire (pas HTTP) - ✅ Certificat SSL valide - ✅ Port 443 (HTTPS standard) - ⚠️ IP brute pas acceptée (besoin domaine) **Si pas de domaine** : - **Option temporaire** : Cloudflare Tunnel (gratuit, génère domaine HTTPS) - **Option long terme** : Acheter domaine ($10/an) + Let's Encrypt SSL (gratuit) #### 7.4 Download WeChat DevTools **Lien** : https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html **Versions disponibles** : - Windows 64-bit - macOS - Linux **Installation** : 1. Download installer (~200MB) 2. Exécuter installer 3. First launch : Login avec WeChat (scan QR) 4. **Enter AppID** (récupéré step 7.2) **First project** : 1. Clique **"创建项目"** (Create project) 2. Enter **AppID** 3. Enter project name 4. Choose directory 5. Template : **"不使用云服务"** (No cloud services) 6. Clique **"确定"** (OK) **Simulator lancé** : Mini Program Hello World visible ! --- ### Étape 8 : Verify Setup Complete (10 minutes) #### 8.1 Checklist finale **Vérifie que tu as** : - [ ] Compte WeChat Developer approuvé ✅ - [ ] AppID copié et sauvegardé - [ ] AppSecret copié et sauvegardé (.env) - [ ] WeChat DevTools installé - [ ] First project créé (Hello World fonctionne) - [ ] Domaine backend configuré (ou plan pour le faire) #### 8.2 Test basique **Dans WeChat DevTools** : 1. Ouvre `pages/index/index.wxml` 2. Modifie texte : `Hello WeChat!` 3. Sauvegarde (Ctrl+S / Cmd+S) 4. **Simulator auto-refresh** → Nouveau texte visible 5. ✅ Setup fonctionnel ! #### 8.3 Next steps **Maintenant tu peux** : - Commencer dev Mini Program (Phase 1 du plan) - Tester APIs WeChat (`wx.chooseMedia()`, etc.) - Upload code vers WeChat pour tests device réel --- ### Troubleshooting #### Problème 1 : Vérification faciale échoue **Solutions** : - Utilise smartphone avec bonne caméra - Éclairage naturel (face à fenêtre) - Retire lunettes, chapeau, masque - Essaye autre smartphone (si caméra ancienne) - Réessaye heures différentes (serveurs WeChat surchargés certains moments) #### Problème 2 : Documents rejetés **Raisons communes** : - Photo floue → Re-scan avec meilleure résolution - Reflets sur plastique ID → Photo en lumière diffuse - Coins coupés → Inclure tout le document dans cadre - Mauvais format → Convertir en JPG #### Problème 3 : Nom Mini Program déjà pris **Solutions** : - Ajoute préfixe/suffixe : "小" (Xiao), "助手" (Assistant) - Utilise combinaison unique : "Alexis语言学习" - Check disponibilité : Search dans WeChat app avant #### Problème 4 : Pas de numéro chinois **Solutions** : - Numéros internationaux acceptés (France, US, etc.) - Format : +33 6 12 34 56 78 - Si bloqué : Demander ami chinois prêter numéro (juste pour SMS) #### Problème 5 : Review prend >3 jours **Actions** : - Check spam email (notification approval parfois là) - Login dashboard : Status visible même sans email - Patience : Weekends/holidays rallongent délai - Si >7 jours : Contact support WeChat (bouton dans dashboard) --- ### Support WeChat Developer **Si problème bloquant** : **Forum officiel** : https://developers.weixin.qq.com/community/ - Pose question en chinois (utilise DeepL) - Community réactive (~2h response) **Support ticket** : 1. Login dashboard 2. Clique **"客服"** (Support) en bas droite 3. Décris problème (chinois recommandé) 4. Attach screenshots 5. Response : 1-2 jours ouvrés **WeChat officiel account support** : - Dans WeChat app, search "微信公众平台" - Follow account - Send message problème - Auto-response + escalade si besoin --- ### Timeline récapitulatif | Étape | Durée | Cumul | Blocage ? | |-------|-------|-------|-----------| | Création compte | 15min | 15min | Non | | Sélection type | 5min | 20min | Non | | Vérification ID | 10min | 30min | Non | | Infos Mini Program | 5min | 35min | Non | | Admin setup | 3min | 38min | Non | | **Submit review** | **1-3j** | **~2j** | **Oui** ⏸️ | | Post-approval | 30min | 2j+30min | Non | | **TOTAL** | **~2 jours** | | | **Note** : 90% du temps = attente review (passif) --- ### Ressources utiles **Docs officielles** : - Guide inscription : https://developers.weixin.qq.com/miniprogram/introduction/ - FAQ : https://developers.weixin.qq.com/community/develop/question **Vidéos tutoriels** (chinois) : - Création compte : https://www.bilibili.com/video/BV1uh411r7zV - Setup complet : https://www.youtube.com/watch?v=TZN0YJJx5kI **Tools** : - Check nom disponible : Search WeChat app - Générateur icon : Canva, Figma - Traduction : DeepL (meilleur que Google pour chinois) --- ## 📚 Ressources ### Documentation officielle **WeChat Mini Program** : - Guide officiel : https://developers.weixin.qq.com/miniprogram/dev/framework/ - API Reference : https://developers.weixin.qq.com/miniprogram/dev/api/ - Component Library : https://developers.weixin.qq.com/miniprogram/dev/component/ - DevTools : https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html **WeChat Login & Auth** : - wx.login() : https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html - Backend auth : https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html **File Upload** : - wx.chooseMedia() : https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html - wx.uploadFile() : https://developers.weixin.qq.com/miniprogram/dev/api/network/upload/wx.uploadFile.html **Template Messages** : - Guide : https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/subscribe-message/sendMessage.html ### UI Frameworks **WeUI** (officiel WeChat) : - GitHub : https://github.com/Tencent/weui-wxss - Demo : https://weui.io/ **Vant Weapp** (recommandé) : - Docs : https://vant-contrib.gitee.io/vant-weapp/ - GitHub : https://github.com/youzan/vant-weapp - Components : Button, Cell, Form, Upload, Chart, etc. ### Backend **OpenAI API** : - Whisper : https://platform.openai.com/docs/guides/speech-to-text - GPT-4 : https://platform.openai.com/docs/guides/chat **Bull (Job Queue)** : - Docs : https://github.com/OptimalBits/bull - Guide : https://optimalbits.github.io/bull/ **Express + Multer** : - Express : https://expressjs.com/ - Multer : https://github.com/expressjs/multer ### Tutoriels **Mini Program (English)** : - Getting Started : https://dev.to/vickywane/getting-started-with-wechat-mini-programs-5b8l - Full Course : https://www.youtube.com/watch?v=5oTjiD0gKb0 **Mini Program (Chinese)** : - 微信小程序开发教程 : https://www.bilibili.com/video/BV1834y1676P ### Tools **WeChat DevTools** : - Download : https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html - MacOS, Windows, Linux supported **Monitoring** : - Uptime Kuma : https://github.com/louislam/uptime-kuma - PM2 : https://pm2.keymetrics.io/ **VPS** : - Hetzner : https://www.hetzner.com/cloud (Europe, $3.79/mois) - DigitalOcean : https://www.digitalocean.com/ ($6/mois) - Aliyun : https://www.alibabacloud.com/ (Chine) ### Community **Forums** : - WeChat Dev Community : https://developers.weixin.qq.com/community/ - Stack Overflow : Tag `wechat-miniprogram` **GitHub Examples** : - Awesome Mini Programs : https://github.com/justjavac/awesome-wechat-weapp - Templates : https://github.com/wechat-miniprogram --- ## 🎯 Next Steps ### Actions immédiates (Jour 1) 1. **Validation projet** : - [ ] Confirmer go/no-go pour Mini Program - [ ] Valider budget (~$30/mois acceptable ?) - [ ] Timeline réaliste (15 jours full-time ou 4 semaines part-time) 2. **Setup compte** : - [ ] Créer compte WeChat Developer : mp.weixin.qq.com - [ ] Upload ID verification - [ ] Download WeChat DevTools 3. **Setup backend** : - [ ] Choisir VPS (recommandation : Hetzner $5/mois) - [ ] Acheter domaine (optionnel) - [ ] Créer compte OpenAI + ajouter $10 credits ### Questions ouvertes **Pédagogie** : - Quels critères correction prioritaires ? (grammaire > prononciation ?) - Format feedback idéal ? (détaillé vs concis ?) - Score /10, /20, ou /100 ? **Technique** : - Langue principale app ? (Français, Chinois, ou Bilingue ?) - Besoin features avancées Phase 1 ? (ou juste MVP ?) - Préférence VPS Chine vs Europe ? **Organisation** : - Combien de classes ? (2 pour l'instant, peut scale ?) - Nombre étudiants total ? (pour dimensionnement VPS) - Fréquence devoirs ? (quotidien, hebdo, mensuel ?) ### Mesures de succès **POC (Jour 6)** : - ✅ 1 upload → transcription fonctionne - ✅ Latence <60s - ✅ Précision transcription >85% **MVP (Jour 10)** : - ✅ Cycle complet fonctionnel - ✅ 5 étudiants tests utilisent 3 jours - ✅ 0 crash critique - ✅ Feedback étudiants positif (>7/10) **Production (Jour 15)** : - ✅ Review WeChat passée - ✅ App publiée (QR code accessible) - ✅ 95% uptime - ✅ 80%+ étudiants adoptent dans 1 semaine **Long terme (3 mois)** : - ✅ Temps gagné >15h/mois - ✅ Satisfaction étudiants >8/10 - ✅ ROI <3 mois - ✅ 0 incident critique --- ## 📝 Notes **Créé** : 2025-11-30 **Auteur** : Alexis Trouvé **Status** : CONCEPT → À valider avant passage WIP **Prochaine review** : TBD après validation initiale **Décision vs Bot Wechaty** : - Mini Program recommandé si usage >3 mois - Investissement initial +5 jours mais ROI long terme meilleur - Zéro risque technique vs 5-15% risque ban bot **Changements majeurs** : - 2025-11-30 : Création document initial --- **Tags** : `#wechat` `#miniprogram` `#automation` `#education` `#ai` `#stt` `#gpt4` `#openai` `#homework`