| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- /**
- * 游戏端 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;
-
- // 1. 处理广播消息(无 requestId)
- if (message && !message.requestId) {
- if (message.type === 'LOGOUT SUCCESS' && logoutCallback) {
- logoutCallback();
- }
- return;
- }
- // 2. 处理带 requestId 的请求结果
- 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 = {
- /**
- * 注册退出登录回调
- * @param {Function} callback
- */
- onLogout: function(callback) {
- logoutCallback = callback;
- },
- /**
- * 调用登录
- * @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);
- }
- };
- })();
|