game-sdk.js 3.3 KB

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