PlatformQuickH5.ts 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. /**
  2. * 变态版h5版本 sdk配置
  3. *
  4. 微信内跳转入口是
  5. 在main.js的最上面
  6. window.__zero__ = {
  7. "packageID": "1101",
  8. }
  9. 在main.js的onStart加上
  10. cc.assetManager.downloader.appendTimeStamp = true
  11. 开启资源时间戳(暂时不需要,影响玩家体验)
  12. 解决网页白边的问题 放在html的body里
  13. <style>
  14. body {
  15. display:block;
  16. margin:0px;
  17. }
  18. </style>
  19. //解决网页缓存的问题(暂时的)
  20. var getQuery2 = function (name) {
  21. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  22. var r = window.location.search.substr(1).match(reg);
  23. if (r != null) return decodeURIComponent(r[2]);
  24. return null;
  25. }
  26. var main = function () {
  27. var _time = parseInt(getQuery2("time") || "0");
  28. var _curTime = new Date().getTime();
  29. if (!_time) {
  30. window.location.replace('https://cdnjyxy.happilygame.com/webMobile/index.html?time=' + _curTime);//注意要换对应的专服链接
  31. return;
  32. }
  33. }
  34. main();
  35. 引入SDK:在html中添加一个script标签就可以了
  36. <script src="https://sdkapi.happilygame.com/static/lib/pp/libQuickSDK_v2.js"></script>
  37. */
  38. import Mint from "../utils/mintFilter/index";
  39. import Gamecfg from "../common/gameCfg";
  40. import { gameMethod } from "../common/gameMethod";
  41. import { PlayerLogin, PlayerLoginPram } from "../common/Xyc";
  42. import { SevBack } from "../common/Xys";
  43. import Config from "../Config";
  44. import { LoadEvent } from "../data/const/EventConst";
  45. import { GameErrCode, PayProductParam, ReportRoleType, PlatFormDevType } from "../data/const/TypeConst";
  46. import GameDataCenter from "../data/GameDataCenter";
  47. import GameController from "../GameController";
  48. import UIHelp from "../logic/ui/UIHelp";
  49. import EventMng from "../manager/EventMng";
  50. import PlatformBase from "./PlatformBase";
  51. import HttpRequest from "../network/HttpRequest";
  52. export default class PlatformQuickH5 extends PlatformBase {
  53. isGoPay: boolean
  54. mint: Mint;
  55. username: ""
  56. channelId: string
  57. constructor() {
  58. super()
  59. cc.game.on(cc.game.EVENT_SHOW, () => {
  60. if (this.isGoPay) {
  61. this.isGoPay = false
  62. if (Config.paySuccAdokId != null) {
  63. clearInterval(Config.paySuccAdokId)
  64. Config.paySuccAdokId = null
  65. }
  66. Config.paySuccAdokIndex = 0
  67. Config.paySuccAdokId = setInterval(() => {
  68. Config.paySuccAdokIndex++
  69. if (Config.paySuccAdokIndex >= 5) {
  70. clearInterval(Config.paySuccAdokId)
  71. Config.paySuccAdokId = null
  72. }
  73. GameDataCenter.time.sendAdok()
  74. }, 1000)
  75. }
  76. GameDataCenter.audio.resumeMusic();
  77. })
  78. cc.game.on(cc.game.EVENT_HIDE, () => {
  79. GameDataCenter.audio.pauseMusic();
  80. })
  81. QuickSDK.setSwitchAccountNotification(function (callbackData) {
  82. console.log("SwitchAccount data=>", JSON.stringify(callbackData))
  83. GameController.clear()
  84. cc.game.restart()
  85. });
  86. QuickSDK.setLogoutNotification(() => {
  87. GameController.clear()
  88. cc.game.restart()
  89. })
  90. }
  91. showLoginView(): void {
  92. console.log("初始化&登录SDK")
  93. EventMng.emit(LoadEvent.LOAD_PROGRESS, 0.25, "login")
  94. try {
  95. let localStorage = cc.sys.localStorage.getItem(`model_login`);
  96. let localData = {};
  97. if (!gameMethod.isEmpty(localStorage)) {
  98. localData = JSON.parse(localStorage);
  99. }
  100. let policyAgree = localData["policy_agree"];
  101. if (!gameMethod.isEmpty(policyAgree) && policyAgree == "1") {
  102. this.SdkInitLogin();
  103. } else {
  104. QuickSDK.showPrivace((retMsg: any) => {
  105. console.log("privace data=>", JSON.stringify(retMsg))
  106. if (retMsg?.status) {
  107. this.SdkInitLogin();
  108. } else {
  109. QuickSDK.callExtFunction("exit", {});
  110. }
  111. })
  112. }
  113. } catch (error) {
  114. UIHelp.ShowTips("----" + error)
  115. }
  116. }
  117. SdkInitLogin() {
  118. let packageInfo = Gamecfg.packageInfo.getItem(Config.pid)
  119. var productCode = packageInfo.params[0]; //QuickSDK后台自动分配
  120. var productKey = packageInfo.params[1]; //QuickSDK后台自动分配
  121. let isNative = false
  122. this.isMiniClient();//设置登录平台
  123. QuickSDK.init(productCode, productKey, isNative, () => {
  124. console.log("初始化成功")
  125. setTimeout(() => {
  126. QuickSDK.login((result: any) => {
  127. console.log("login data=", JSON.stringify(result))
  128. // EventMng.emit(LoadEvent.LOAD_MESSAGE, JSON.stringify(result))
  129. if (result.status) {
  130. let data = result.data
  131. this.username = data.username
  132. this.channelId = data.channelId.toString()
  133. EventMng.emit(LoadEvent.LOAD_PROGRESS, 0.75, "login")
  134. let params: PlayerLoginPram = {
  135. pid: Config.pid,
  136. param: [data.uid, data.token, data.channelId]
  137. }
  138. setTimeout(() => {
  139. GameController.network.send(PlayerLogin.url, params, (result: SevBack) => {
  140. console.log("后段验证返回")
  141. if (result.type != 1) {
  142. if (gameMethod.isEmpty(result.win) || gameMethod.isEmpty(result.win.msgOut)) {
  143. GameDataCenter.plat.showErrDialog(GameErrCode.errGamePlatLogin)
  144. }
  145. return
  146. }
  147. EventMng.emit(LoadEvent.LOAD_PROGRESS, 1, "login")
  148. if (result.type == 1 && result.platBack) {
  149. this.openId = result.platBack.openid
  150. this.loginParams = [result.platBack.token]
  151. console.log("后端验证成功", this.openId)
  152. this.login()
  153. } else {
  154. console.log("PlayerLogin.url 返回数据异常")
  155. if (gameMethod.isEmpty(result.win) || gameMethod.isEmpty(result.win.msgOut)) {
  156. GameDataCenter.plat.showErrDialog(GameErrCode.errGamePlatLogin)
  157. }
  158. }
  159. })
  160. }, 1000)
  161. } else {
  162. UIHelp.ShowTips("登录失败")
  163. }
  164. })
  165. }, 1000)
  166. })
  167. }
  168. pay(orderId: string, order10cs: string, param: PayProductParam): void {
  169. let packageInfo = Gamecfg.packageInfo.getItem(Config.pid)
  170. var productCode = packageInfo.params[0]; //QuickSDK后台自动分配
  171. let serverName = GameDataCenter.user.getServerNameBySid(GameDataCenter.sevBack?.userInfo?.a?.sid) || GameDataCenter.sevBack.userInfo.a.sid;
  172. let orderInfo = {
  173. productCode: productCode,
  174. uid: GameDataCenter.plat.instance.openId,
  175. username: this.username,
  176. userRoleId: GameDataCenter.sevBack.userInfo.a.uuid,
  177. userRoleName: GameDataCenter.sevBack.userInfo.a.name,
  178. serverId: parseInt(GameDataCenter.sevBack.userInfo.a.sid),
  179. userServer: serverName,
  180. userLevel: GameDataCenter.sevBack.userInfo.a.level,
  181. cpOrderNo: orderId,
  182. amount: param.price,
  183. subject: param.productName,
  184. desc: param.productName,//param.productDesc,
  185. callbackUrl: '',
  186. extrasParams: order10cs,
  187. goodsId: param.productId,
  188. count: 1,
  189. quantifier: '个',
  190. }
  191. var orderInfoJson = JSON.stringify(orderInfo);
  192. this.isGoPay = true
  193. QuickSDK.pay(orderInfoJson, (payStatusObject: any) => {
  194. console.log("创建订单成功:", JSON.stringify(payStatusObject))
  195. this.isGoPay = false
  196. if (Config.paySuccAdokId != null) {
  197. clearInterval(Config.paySuccAdokId)
  198. Config.paySuccAdokId = null
  199. }
  200. Config.paySuccAdokIndex = 0
  201. Config.paySuccAdokId = setInterval(() => {
  202. Config.paySuccAdokIndex++
  203. if (Config.paySuccAdokIndex >= 5) {
  204. clearInterval(Config.paySuccAdokId)
  205. Config.paySuccAdokId = null
  206. }
  207. GameDataCenter.time.sendAdok()
  208. }, 1000)
  209. })
  210. this.dealYanChi();
  211. }
  212. // 充值延迟到账,前端只能循环处理
  213. dealYanChi() {
  214. if (Config.paySuccAdokId != null) {
  215. clearInterval(Config.paySuccAdokId)
  216. Config.paySuccAdokId = null
  217. }
  218. Config.paySuccAdokIndex = 0
  219. Config.paySuccAdokId = setInterval(() => {
  220. Config.paySuccAdokIndex++
  221. if (Config.paySuccAdokIndex >= 15) {
  222. clearInterval(Config.paySuccAdokId)
  223. Config.paySuccAdokId = null
  224. this.isGoPay = false
  225. }
  226. GameDataCenter.time.sendAdok()
  227. }, 1000)
  228. }
  229. // 上报角色数据
  230. reportRole(event: ReportRoleType): void {
  231. // • 初始化成功后调⽤. • 进⼊区服、创⻆、⻆⾊等级更新、战⼒更新时调⽤.
  232. if (GameDataCenter.sevBack == null) { return }
  233. if (GameDataCenter.sevBack.userInfo == null) { return }
  234. console.log("上报角色数据:", event)
  235. let onlineTime = 0
  236. if (GameDataCenter.time.onlineTime > 0) {
  237. onlineTime = GameDataCenter.time.sevTime - GameDataCenter.time.onlineTime
  238. }
  239. let isCreateRole = false
  240. let level = GameDataCenter.sevBack.userInfo.a.level
  241. switch (event) {
  242. case ReportRoleType.create:
  243. isCreateRole = true
  244. break;
  245. case ReportRoleType.levelup:
  246. break;
  247. case ReportRoleType.offline:
  248. break;
  249. case ReportRoleType.online:
  250. break;
  251. case ReportRoleType.other:
  252. break;
  253. default:
  254. break;
  255. }
  256. let power = GameDataCenter.sevBack.userInfo.a.power;
  257. let serverName = GameDataCenter.user.getServerNameBySid(GameDataCenter.sevBack.userInfo.a.sid) || GameDataCenter.sevBack.userInfo.a.sid;
  258. if (this.channelId == "4804" || this.channelId == "4771") {
  259. //专服1-混A上报角色需要加密
  260. let roleInfo6 = {
  261. uid: GameDataCenter.plat.instance.openId,
  262. username: this.username,
  263. serverId: GameDataCenter.sevBack.userInfo.a.sid,
  264. serverName: serverName,
  265. userRoleId: GameDataCenter.sevBack.userInfo.a.uuid,
  266. userRoleName: GameDataCenter.sevBack.userInfo.a.name,
  267. userRoleLevel: level,
  268. vipLevel: 0,
  269. gameRolePower: power,
  270. channel_role_sign: "",
  271. isCreateRole: isCreateRole,
  272. roleCreateTime: GameDataCenter.sevBack.userInfo.a.regtime,
  273. userRoleBalance: 0,
  274. partyId: 0,
  275. partyName: '无',
  276. };
  277. let verifyStr = "uid=" + roleInfo6.uid + "&username=" + roleInfo6.username + "&serverId=" + roleInfo6.serverId + "&serverName=" + roleInfo6.serverName + "&userRoleId=" + roleInfo6.userRoleId + "&userRoleName=" + roleInfo6.userRoleName + "&userRoleLevel=" + roleInfo6.userRoleLevel + "&vipLevel=" + roleInfo6.vipLevel + "&gameRolePower=" + roleInfo6.gameRolePower + "&key="
  278. // console.log("verifyStr:",verifyStr)
  279. let url = Gamecfg.packageInfo.getItem(Config.pid).wayhttp + "player/sbVerify"
  280. HttpRequest.POST(url, {}, { str: verifyStr }, (result: any) => {
  281. console.log("player/sbVerify=>", result)
  282. roleInfo6.channel_role_sign = result.sign
  283. var roleInfoJson6 = JSON.stringify(roleInfo6);
  284. // set_userinfo 设置⻆⾊基本信息,如头像、昵称
  285. QuickSDK.uploadGameRoleInfo(roleInfoJson6, () => {
  286. })
  287. })
  288. } else {
  289. let roleInfo = {
  290. isCreateRole: isCreateRole,
  291. roleCreateTime: GameDataCenter.sevBack.userInfo.a.regtime,
  292. uid: GameDataCenter.plat.instance.openId,
  293. username: this.username,
  294. serverId: GameDataCenter.sevBack.userInfo.a.sid,
  295. serverName: serverName,
  296. userRoleName: GameDataCenter.sevBack.userInfo.a.name,
  297. userRoleId: GameDataCenter.sevBack.userInfo.a.uuid,
  298. userRoleBalance: 0,
  299. vipLevel: 1,
  300. userRoleLevel: level,
  301. gameRolePower: power,
  302. partyId: 0,
  303. partyName: '无',
  304. };
  305. var roleInfoJson = JSON.stringify(roleInfo);
  306. // set_userinfo 设置⻆⾊基本信息,如头像、昵称
  307. QuickSDK.uploadGameRoleInfo(roleInfoJson, () => {
  308. })
  309. }
  310. }
  311. checkMsg(str: string, cb: Function): void {
  312. cb()
  313. }
  314. restart(force?: boolean) {
  315. QuickSDK.logout(() => {
  316. })
  317. }
  318. openUrl(url: string) {
  319. QuickSDK.callUrl(url);
  320. }
  321. /**
  322. * 是否微端
  323. */
  324. isMiniClient() {
  325. //UA: Mozilla/5.0 (iPhone; CPU iPhone OS 17_6_1 like MacoS X) AppleWebKit/605.1.15(KHTML, like Gecko)Mobile/15E148
  326. // Mozilla/5.0 (iPhone; CPU iPhone 0S 17_6_1 like Mac OS X)AppleWebKit/605.1.15(KHTML, like Gecko) obile/15E148 color:gray".match(/\(i[^;]+;( U;)?CPU.+Mac OS X
  327. let u = navigator.userAgent;
  328. let isAndroid = u.indexOf("Android") > -1 || u.indexOf("Adr") > -1;
  329. if (isAndroid) {
  330. GameDataCenter.plat.instance.deviceOS = PlatFormDevType.androidH5
  331. }
  332. let isIos = u.indexOf("iPhone") > -1 && u.indexOf("Safari") == -1;
  333. if (isIos) {
  334. GameDataCenter.plat.instance.deviceOS = PlatFormDevType.iosH5
  335. }
  336. if (cc.sys.os == cc.sys.OS_IOS) {
  337. GameDataCenter.plat.instance.deviceOS = PlatFormDevType.iosH5
  338. }
  339. return isAndroid || isIos;
  340. }
  341. }