/** * 游戏端 SDK * 注入到游戏 iframe 内,封装常用业务 API */ (function () { const pendingRequests = new Map(); let logoutCallback = null; // 生成唯一 ID function generateId() { return Math.random().toString(36).substring(2, 15) + Date.now().toString(36); } // 监听来自父级的消息 window.addEventListener('message', (event) => { try { const message = typeof event.data === 'string' ? JSON.parse(event.data) : event.data; if (message && message.requestId) { console.log('[SDK] Received message from parent:', message); const request = pendingRequests.get(message.requestId); if (request) { if (message.type.endsWith('_SUCCESS')) { request.resolve(message.data); } else if (message.type.endsWith('_FAIL') || message.type.endsWith('_CANCEL')) { request.reject(new Error(message.data?.message || 'Operation failed or cancelled')); } else { // 某些情况下可能只是通用回复 request.resolve(message.data); } pendingRequests.delete(message.requestId); } } } catch (error) { // 解析失败忽略 } }); // 基础发送方法,返回 Promise function sendRequest(type, data = {}) { return new Promise((resolve, reject) => { const requestId = generateId(); pendingRequests.set(requestId, { resolve, reject }); const message = { type, data, requestId }; console.log('[SDK] Requesting parent:', message); window.parent.postMessage(JSON.stringify(message), '*'); }); } // 暴露全局对象 GameSDK window.GameSDK = { /** * 退出登录 */ logout: function () { return sendRequest('LOGOUT_REQUEST'); }, /** * 监听退出登录回调 * @param {Function} callback */ onLogout: function () { return sendRequest('ONLOGOUT'); }, /** * 调用登录 * @returns {Promise<{token: string, userId: string, username: string}>} */ login: function () { return sendRequest('LOGIN_REQUEST'); }, /** * 调起支付 * @param {Object} orderInfo 订单信息 * @param {string} orderInfo.productId 商品ID * @param {string} orderInfo.productName 商品名称 * @param {number} orderInfo.amount 支付金额 * @returns {Promise<{orderId: string, status: string}>} */ pay: function (orderInfo) { return sendRequest('PAY_REQUEST', orderInfo); }, /** * 数据上报 * @param {Object} reportData 上报数据 * @param {string} reportData.action 行为类型 * @param {string} reportData.payload 上报内容 * @returns {Promise<{success: boolean}>} */ report: function (reportData) { return sendRequest('REPORT_REQUEST', reportData); }, /** * 初始化 * @returns {Promise<{success: boolean}>} */ init: function (initData) { return sendRequest('INIT_REQUEST', initData); } }; })();