game-sdk.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /**
  2. * 游戏端 SDK
  3. * 注入到游戏 iframe 内,封装常用业务 API
  4. */
  5. (function() {
  6. const pendingRequests = new Map();
  7. // 生成唯一 ID
  8. function generateId() {
  9. return Math.random().toString(36).substring(2, 15) + Date.now().toString(36);
  10. }
  11. // 监听来自父级的消息
  12. window.addEventListener('message', (event) => {
  13. try {
  14. const message = typeof event.data === 'string' ? JSON.parse(event.data) : event.data;
  15. if (message && message.requestId) {
  16. console.log('[SDK] Received message from parent:', message);
  17. const request = pendingRequests.get(message.requestId);
  18. if (request) {
  19. if (message.type.endsWith('_SUCCESS')) {
  20. request.resolve(message.data);
  21. } else if (message.type.endsWith('_FAIL') || message.type.endsWith('_CANCEL')) {
  22. request.reject(new Error(message.data?.message || 'Operation failed or cancelled'));
  23. } else {
  24. // 某些情况下可能只是通用回复
  25. request.resolve(message.data);
  26. }
  27. pendingRequests.delete(message.requestId);
  28. }
  29. }
  30. } catch (error) {
  31. // 解析失败忽略
  32. }
  33. });
  34. // 基础发送方法,返回 Promise
  35. function sendRequest(type, data = {}) {
  36. return new Promise((resolve, reject) => {
  37. const requestId = generateId();
  38. pendingRequests.set(requestId, { resolve, reject });
  39. const message = { type, data, requestId };
  40. console.log('[SDK] Requesting parent:', message);
  41. window.parent.postMessage(JSON.stringify(message), '*');
  42. });
  43. }
  44. // 暴露全局对象 GameSDK
  45. window.GameSDK = {
  46. /**
  47. * 调用登录
  48. * @returns {Promise<{token: string, userId: string, username: string}>}
  49. */
  50. login: function() {
  51. return sendRequest('LOGIN_REQUEST');
  52. },
  53. /**
  54. * 调起支付
  55. * @param {Object} orderInfo 订单信息
  56. * @param {string} orderInfo.productId 商品ID
  57. * @param {string} orderInfo.productName 商品名称
  58. * @param {number} orderInfo.amount 支付金额
  59. * @returns {Promise<{orderId: string, status: string}>}
  60. */
  61. pay: function(orderInfo) {
  62. return sendRequest('PAY_REQUEST', orderInfo);
  63. },
  64. /**
  65. * 数据上报
  66. * @param {Object} reportData 上报数据
  67. * @param {string} reportData.action 行为类型
  68. * @param {string} reportData.payload 上报内容
  69. * @returns {Promise<{success: boolean}>}
  70. */
  71. report: function(reportData) {
  72. return sendRequest('REPORT_REQUEST', reportData);
  73. },
  74. /**
  75. * 初始化
  76. * @returns {Promise<{success: boolean}>}
  77. */
  78. init: function(initData) {
  79. return sendRequest('INIT_REQUEST', initData);
  80. }
  81. };
  82. })();