diff --git a/server.js b/server.js index b26b78a..91ef9c0 100644 --- a/server.js +++ b/server.js @@ -85,6 +85,51 @@ app.use('/.netlify/functions/giffgaff-mfa-validation', wrapNetlifyFunction(giffg app.use('/.netlify/functions/giffgaff-graphql', wrapNetlifyFunction(giffgaffGraphql)); app.use('/.netlify/functions/verify-cookie', wrapNetlifyFunction(verifyCookie)); +// Simyo API代理路由 +app.use('/api/simyo/*', (req, res) => { + const targetUrl = `https://appapi.simyo.nl/simyoapi/api/v1${req.path.replace('/api/simyo', '')}`; + console.log(`[Simyo Proxy] ${req.method} ${req.path} -> ${targetUrl}`); + + // 设置CORS头 + res.header('Access-Control-Allow-Origin', '*'); + res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); + res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Client-Token, X-Client-Platform, X-Client-Version'); + + if (req.method === 'OPTIONS') { + return res.status(200).end(); + } + + // 代理请求 + const axios = require('axios'); + const config = { + method: req.method.toLowerCase(), + url: targetUrl, + headers: { + 'Content-Type': 'application/json', + 'User-Agent': req.headers['user-agent'] || 'MijnSimyo/4.8.0 (iPhone; iOS 17.5.1; Scale/3.00)', + 'X-Client-Token': req.headers['x-client-token'] || 'e77b7e2f43db41bb95b17a2a11581a38', + 'X-Client-Platform': req.headers['x-client-platform'] || 'ios', + 'X-Client-Version': req.headers['x-client-version'] || '4.8.0' + }, + timeout: 30000 + }; + + if (req.body && Object.keys(req.body).length > 0) { + config.data = req.body; + } + + axios(config) + .then(response => { + res.status(response.status).json(response.data); + }) + .catch(error => { + console.error('[Simyo Proxy Error]:', error.message); + const status = error.response?.status || 500; + const data = error.response?.data || { error: 'Proxy Error', message: error.message }; + res.status(status).json(data); + }); +}); + // 路由配置 app.get('/giffgaff', (req, res) => { res.sendFile(path.join(__dirname, 'src/giffgaff/giffgaff_complete_esim.html')); diff --git a/src/simyo/simyo_complete_esim.html b/src/simyo/simyo_complete_esim.html index e5ed78c..03dade6 100644 --- a/src/simyo/simyo_complete_esim.html +++ b/src/simyo/simyo_complete_esim.html @@ -862,14 +862,14 @@ }; // API端点 - 自动检测环境(本地代理服务器 vs Netlify代理) - const isNetlify = window.location.hostname.includes('netlify') || window.location.hostname.includes('yyxx.com'); + const isNetlify = window.location.hostname.includes('netlify') || window.location.hostname.includes('cosr.eu.org') || window.location.hostname.includes('yyxx.com'); const apiEndpoints = { - login: isNetlify ? "/api/simyo/sessions" : "/api/simyo/login", - getEsim: isNetlify ? "/api/simyo/esim/get-by-customer" : "/api/simyo/esim", - applyNewEsim: isNetlify ? "/api/simyo/apply-new-esim" : "/api/simyo/apply-new-esim", - sendSmsCode: isNetlify ? "/api/simyo/send-sms-code" : "/api/simyo/send-sms-code", - verifyCode: isNetlify ? "/api/simyo/verify-code" : "/api/simyo/verify-code", - confirmInstall: isNetlify ? "/api/simyo/esim/reorder-profile-installed" : "/api/simyo/confirm-install", + login: isNetlify ? "/api/simyo/sessions" : "http://localhost:3000/api/simyo/sessions", + getEsim: isNetlify ? "/api/simyo/esim/get-by-customer" : "http://localhost:3000/api/simyo/esim/get-by-customer", + applyNewEsim: isNetlify ? "/api/simyo/esim/apply-new-esim" : "http://localhost:3000/api/simyo/esim/apply-new-esim", + sendSmsCode: isNetlify ? "/api/simyo/esim/send-sms-code" : "http://localhost:3000/api/simyo/esim/send-sms-code", + verifyCode: isNetlify ? "/api/simyo/esim/verify-code" : "http://localhost:3000/api/simyo/esim/verify-code", + confirmInstall: isNetlify ? "/api/simyo/esim/reorder-profile-installed" : "http://localhost:3000/api/simyo/esim/reorder-profile-installed", qrcode: "https://api.qrserver.com/v1/create-qr-code/" }; @@ -1093,7 +1093,12 @@ headers['X-Session-Token'] = ''; } } else { - // 本地代理服务器环境:简化头部 + // 本地代理服务器环境:也需要添加Simyo API头部 + headers['X-Client-Token'] = simyoConfig.clientToken; + headers['X-Client-Platform'] = simyoConfig.clientPlatform; + headers['X-Client-Version'] = simyoConfig.clientVersion; + headers['User-Agent'] = simyoConfig.userAgent; + if (includeSession && appState.sessionToken) { headers['X-Session-Token'] = appState.sessionToken; }