Compare commits
10 Commits
7487efd9dc
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9b130ce07b | ||
|
|
b170d54b0e | ||
|
|
4157880669 | ||
|
|
0a8e61948b | ||
|
|
e06c43542a | ||
|
|
ed4b4f6e5a | ||
|
|
2df974371c | ||
|
|
31bdef2407 | ||
|
|
f0109b703a | ||
|
|
50921780a9 |
119
TROUBLESHOOTING_API.md
Normal file
119
TROUBLESHOOTING_API.md
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
# Résolution des problèmes d'accès à l'API
|
||||||
|
|
||||||
|
## Problème : `net::ERR_NAME_NOT_RESOLVED`
|
||||||
|
|
||||||
|
Si vous rencontrez l'erreur `net::ERR_NAME_NOT_RESOLVED` lors de l'accès à l'API, cela signifie que le navigateur ne peut pas résoudre le nom de domaine `api.ditesleenchanson.fr`.
|
||||||
|
|
||||||
|
### Causes possibles
|
||||||
|
|
||||||
|
1. **Le domaine n'existe pas encore**
|
||||||
|
- Le sous-domaine `api.ditesleenchanson.fr` n'a pas été créé dans votre gestionnaire DNS
|
||||||
|
|
||||||
|
2. **Le domaine n'est pas configuré correctement**
|
||||||
|
- Les enregistrements DNS ne pointent pas vers le bon serveur
|
||||||
|
- Le DNS n'a pas encore propagé les changements (peut prendre jusqu'à 48h)
|
||||||
|
|
||||||
|
3. **Problème de configuration locale**
|
||||||
|
- La variable d'environnement `VITE_API_URL` pointe vers un domaine inaccessible
|
||||||
|
- Vous êtes en développement local mais l'URL pointe vers la production
|
||||||
|
|
||||||
|
### Solutions
|
||||||
|
|
||||||
|
#### 1. Vérifier la configuration de l'URL de l'API
|
||||||
|
|
||||||
|
Vérifiez le fichier `.env` dans `site/src/.env` :
|
||||||
|
|
||||||
|
```env
|
||||||
|
# Pour le développement local
|
||||||
|
VITE_API_URL=http://localhost:8000
|
||||||
|
|
||||||
|
# Pour la production (uniquement si le domaine est configuré)
|
||||||
|
VITE_API_URL=https://api.ditesleenchanson.fr
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. Vérifier que l'API est accessible
|
||||||
|
|
||||||
|
**En développement local :**
|
||||||
|
- Assurez-vous que l'API Laravel est démarrée sur `http://localhost:8000`
|
||||||
|
- Testez l'accès à `http://localhost:8000/health` dans votre navigateur
|
||||||
|
|
||||||
|
**En production :**
|
||||||
|
- Vérifiez que le domaine `api.ditesleenchanson.fr` existe et pointe vers votre serveur
|
||||||
|
- Testez l'accès à `https://api.ditesleenchanson.fr/health` dans votre navigateur
|
||||||
|
- Vérifiez les enregistrements DNS de votre domaine
|
||||||
|
|
||||||
|
#### 3. Configuration DNS
|
||||||
|
|
||||||
|
Pour que `api.ditesleenchanson.fr` fonctionne, vous devez :
|
||||||
|
|
||||||
|
1. **Créer un enregistrement DNS de type A ou CNAME**
|
||||||
|
- Type A : pointe directement vers l'IP de votre serveur
|
||||||
|
- Type CNAME : pointe vers un autre domaine (ex: `ditesleenchanson.fr`)
|
||||||
|
|
||||||
|
2. **Configurer le serveur web** (Nginx/Apache)
|
||||||
|
- Créer un virtual host pour `api.ditesleenchanson.fr`
|
||||||
|
- Configurer le SSL/TLS (certificat Let's Encrypt recommandé)
|
||||||
|
|
||||||
|
3. **Vérifier la configuration Laravel**
|
||||||
|
- Dans `api/src/.env`, définir `APP_URL=https://api.ditesleenchanson.fr`
|
||||||
|
- Configurer `FRONTEND_URL` pour autoriser les requêtes depuis le frontend
|
||||||
|
|
||||||
|
#### 4. Test de connectivité
|
||||||
|
|
||||||
|
Pour tester si le domaine est accessible :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Test DNS
|
||||||
|
nslookup api.ditesleenchanson.fr
|
||||||
|
|
||||||
|
# Test HTTP
|
||||||
|
curl https://api.ditesleenchanson.fr/health
|
||||||
|
|
||||||
|
# Test depuis le navigateur
|
||||||
|
# Ouvrir : https://api.ditesleenchanson.fr/health
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuration recommandée
|
||||||
|
|
||||||
|
#### Développement local
|
||||||
|
|
||||||
|
**Fichier `site/src/.env` :**
|
||||||
|
```env
|
||||||
|
VITE_API_URL=http://localhost:8000
|
||||||
|
```
|
||||||
|
|
||||||
|
**Démarrer l'API Laravel :**
|
||||||
|
```bash
|
||||||
|
cd api/src
|
||||||
|
php artisan serve
|
||||||
|
# L'API sera accessible sur http://localhost:8000
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Production
|
||||||
|
|
||||||
|
**Fichier `site/src/.env` :**
|
||||||
|
```env
|
||||||
|
VITE_API_URL=https://api.ditesleenchanson.fr
|
||||||
|
```
|
||||||
|
|
||||||
|
**Fichier `api/src/.env` :**
|
||||||
|
```env
|
||||||
|
APP_URL=https://api.ditesleenchanson.fr
|
||||||
|
FRONTEND_URL=https://dites-le-en-chanson.fr
|
||||||
|
```
|
||||||
|
|
||||||
|
### Vérification après déploiement
|
||||||
|
|
||||||
|
1. Vérifier que l'API répond : `https://api.ditesleenchanson.fr/health`
|
||||||
|
2. Vérifier les logs de l'API pour les erreurs CORS
|
||||||
|
3. Vérifier la console du navigateur pour les erreurs de connexion
|
||||||
|
4. Tester le processus de paiement complet
|
||||||
|
|
||||||
|
### Support
|
||||||
|
|
||||||
|
Si le problème persiste après avoir vérifié ces points :
|
||||||
|
1. Vérifiez les logs de l'API Laravel (`api/src/storage/logs/laravel.log`)
|
||||||
|
2. Vérifiez les logs du serveur web (Nginx/Apache)
|
||||||
|
3. Vérifiez la configuration DNS avec votre hébergeur
|
||||||
|
4. Contactez le support technique
|
||||||
|
|
||||||
6
src/.env
6
src/.env
@@ -1,4 +1,2 @@
|
|||||||
#VITE_STRIPE_PUBLISHABLE_KEY=pk_live_51RPSGmEPL3QASpovp8Q6p8ehNMW7TzSrOaV6zvPE1OtflMFN5jChQBEj5kr84wontlLOe8uiHyJBiCduzxIZwj5A00DIEVs31n
|
VITE_API_URL=https://api.dites-le-en-chanson.fr
|
||||||
VITE_STRIPE_PUBLISHABLE_KEY=pk_test_51RPSH1ERAUBjYKpgbz4GjZjDtI24rqfBky5SO6AwdBfZaqNmFN0zQSxx0Z1wfFKtKXIZXfx5IOQSt2ularULIsto00frDMNi03
|
#VITE_API_URL=http://127.0.0.1:8000
|
||||||
|
|
||||||
VITE_API_URL=https://api.ditesleenchanson.fr
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "web-app",
|
"name": "web-app",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "1.1.1",
|
"version": "1.2.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite --host :: --port 3000",
|
"dev": "vite --host :: --port 3000",
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { ShoppingBag, Edit2, Music, Send } from 'lucide-react';
|
import { ShoppingBag, Edit2, Music, Send } from 'lucide-react';
|
||||||
export const STRIPE_PUBLISHABLE_KEY = import.meta.env.VITE_STRIPE_PUBLISHABLE_KEY;
|
|
||||||
|
|
||||||
export const products = [
|
export const products = [
|
||||||
{
|
{
|
||||||
id: 'prod_SQK3M9UvfXBUh0',
|
id: 'prod_SQK3M9UvfXBUh0',
|
||||||
@@ -38,14 +36,14 @@ import React from 'react';
|
|||||||
stripePriceId: 'price_1RVTXtEPL3QASpovaWjXf30q',
|
stripePriceId: 'price_1RVTXtEPL3QASpovaWjXf30q',
|
||||||
description: 'Un texte de chanson unique, écrit sur mesure pour vous.',
|
description: 'Un texte de chanson unique, écrit sur mesure pour vous.',
|
||||||
imageUrl: 'https://files.dites-le-en-chanson.fr/products/texte-personalise.jpg'
|
imageUrl: 'https://files.dites-le-en-chanson.fr/products/texte-personalise.jpg'
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
id: 'prod_SQMCFqFLaNHxx0',
|
// id: 'prod_SQMCFqFLaNHxx0',
|
||||||
name: 'Test',
|
// name: 'Test',
|
||||||
price: 17.90,
|
// price: 17.90,
|
||||||
promotionPrice: null,
|
// promotionPrice: null,
|
||||||
stripePriceId: 'price_1RVVUBERAUBjYKpgYuQyuI76',
|
// stripePriceId: 'price_1RVVUBERAUBjYKpgYuQyuI76',
|
||||||
description: 'Un texte de chanson unique, écrit sur mesure pour vous.',
|
// description: 'Un texte de chanson unique, écrit sur mesure pour vous.',
|
||||||
// imageUrl: 'https://files.dites-le-en-chanson.fr/products/texte-personalise.jpg'
|
// imageUrl: 'https://files.dites-le-en-chanson.fr/products/texte-personalise.jpg'
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -87,13 +87,14 @@ export const api = {
|
|||||||
/**
|
/**
|
||||||
* Confirme une commande et envoie les emails
|
* Confirme une commande et envoie les emails
|
||||||
*/
|
*/
|
||||||
async confirmOrder(orderData, sessionId) {
|
async confirmOrder(orderData, sessionId, orderId = null) {
|
||||||
try {
|
try {
|
||||||
const data = await apiRequest('/orders/confirm', {
|
const data = await apiRequest('/orders/confirm', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: {
|
body: {
|
||||||
orderData,
|
orderData,
|
||||||
sessionId,
|
sessionId,
|
||||||
|
orderId,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
return { data, error: null };
|
return { data, error: null };
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import React, { useEffect, useState } from 'react';
|
|||||||
const [orderDetails, setOrderDetails] = useState(null);
|
const [orderDetails, setOrderDetails] = useState(null);
|
||||||
const [searchParams] = useSearchParams();
|
const [searchParams] = useSearchParams();
|
||||||
const sessionId = searchParams.get('session_id');
|
const sessionId = searchParams.get('session_id');
|
||||||
|
const orderId = searchParams.get('order_id');
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
const [isLoading, setIsLoading] = useState(true);
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
const [mainStatus, setMainStatus] = useState({ type: 'info', message: 'Traitement en cours...' });
|
const [mainStatus, setMainStatus] = useState({ type: 'info', message: 'Traitement en cours...' });
|
||||||
@@ -77,7 +78,7 @@ import React, { useEffect, useState } from 'react';
|
|||||||
sessionStorage.setItem(processedKey, 'true');
|
sessionStorage.setItem(processedKey, 'true');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const { data: functionResponse, error: functionError } = await api.orders.confirmOrder(orderDataForDB, sessionId);
|
const { data: functionResponse, error: functionError } = await api.orders.confirmOrder(orderDataForDB, sessionId, orderId);
|
||||||
|
|
||||||
if (functionError) {
|
if (functionError) {
|
||||||
console.error("API error:", functionError);
|
console.error("API error:", functionError);
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ const OrderPage = () => {
|
|||||||
orderData: orderDataForDB,
|
orderData: orderDataForDB,
|
||||||
quantity: 1,
|
quantity: 1,
|
||||||
customerEmail: formData.email,
|
customerEmail: formData.email,
|
||||||
successUrl: `${window.location.origin}/confirmation?session_id={CHECKOUT_SESSION_ID}`,
|
successUrl: `${window.location.origin}/confirmation`,
|
||||||
cancelUrl: `${window.location.origin}/commander`,
|
cancelUrl: `${window.location.origin}/commander`,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user