YouLoftServices.cs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905
  1. 
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. using UnityEngine;
  8. using UnityEngine.Networking;
  9. using simplejson;
  10. public class YouLoftServices : MonoBehaviour
  11. {
  12. public static string URL_ROOT = "https://chinaapi.youloft.com";
  13. /*
  14. channelPay
  15. */
  16. /**
  17. * 渠道下单接口,根据不同渠道需要的数据不同
  18. * 返回的数据结构不同,前端需要根据情况解析
  19. */
  20. public static string ChannelpayOrder = "/api/Channelpay/Order";
  21. /**
  22. * 获取当前游戏,渠道的最新版本
  23. * 返回结果无加密
  24. */
  25. public static string ChannelpayGetAppVersion = "/api/Channelpay/GetAppVersion";
  26. /*
  27. Config
  28. */
  29. /**
  30. * 获取服务器配置
  31. * appver:如果不需要根据版本判断可以串0
  32. * lastver:每次全新获取传0
  33. */
  34. public static string ConfigSync = "/api/Config/Sync";
  35. /*
  36. Dedeem
  37. */
  38. /**
  39. * 兑换码兑换接口
  40. */
  41. public static string DedeemConsume = "/api/Dedeem/Consume";
  42. /*
  43. user
  44. */
  45. /**
  46. * 登录接口微信-游客
  47. * 登录之后返回token,每次操作验证token
  48. * 请求需要签名,返回数据无加密
  49. */
  50. public static string UserLogin = "/api/User/Login";
  51. /**
  52. * 获取(提交)存档到服务器
  53. * 1.每次启动游戏优先获取存档
  54. * 2.当有需要更新的存档时提交服务器
  55. * 提交存档时服务器会默认覆盖以前的存档不会做其他判断
  56. * 请求需要签名,返回数据有加密
  57. */
  58. public static string UserSync = "/api/User/Sync";
  59. /**
  60. * 获取(提交)存档到服务器
  61. * 1.每次启动游戏优先获取存档
  62. * 2.当有需要更新的存档时提交服务器
  63. * 3.文件流不加入签名
  64. * 4.返回字符串编码为ascii
  65. * 提交存档时服务器会默认覆盖以前的存档不会做其他判断
  66. * 请求需要签名,返回数据有加密
  67. */
  68. public static string UserSyncStream = "/api/User/SyncStream";
  69. /**
  70. * 心跳检测,判断当前客户端登陆是否有效
  71. * 请求需要签名,返回数据无加密
  72. */
  73. public static string UserHeartbeat = "/api/User/Heartbeat";
  74. /**
  75. * 用户下订接口,下单成功之后返回支付链接
  76. * -跳转支付页面
  77. */
  78. public static string UserOrder = "/api/User/Order";
  79. /**
  80. * 恢复购买,查看已完成的所有订单,以及消耗状态
  81. * 请求需要签名,返回结果有加密
  82. */
  83. public static string UserResumepurchase = "/api/User/Resumepurchase";
  84. /**
  85. * 订单消耗
  86. * 请求需要签名,返回结果有加密
  87. */
  88. public static string UserConsume = "/api/User/Consume";
  89. /**
  90. * 查询单个订单的状态
  91. * 用来处理非消耗性商品,判断订单是否支付完成
  92. * 返回结果有加密
  93. */
  94. public static string UserQueryOrder = "/api/User/QueryOrder";
  95. /**
  96. * 获取排行榜
  97. * 用户信息
  98. */
  99. public static string UserLeaderboard = "/api/User/Leaderboard";
  100. /**
  101. * 提交用户分数
  102. * 返回用户排行榜信息,返回结果无加密
  103. */
  104. public static string UserUploadScore = "/api/User/UploadScore";
  105. /**
  106. * 获取用户自己的排名
  107. */
  108. public static string UserGetUserRank = "/api/User/GetUserRank";
  109. /**
  110. * 提交反馈信息
  111. */
  112. public static string feedback = "/api/Feedback/Submit";
  113. /**
  114. * 获取活动及对应物品接口(带渠道),返回结果有加密
  115. */
  116. public static string getActivitiesWithChannel = "/api/Activity/GetActivitiesWithChannel";
  117. /**
  118. * 获取公告及补偿物品列表接口(带渠道),返回结果有加密
  119. */
  120. public static string gameAnoncementsWithChannel = "/api/Anoncement/GameAnoncementsWithChannel";
  121. /**
  122. * 带渠道的兑换
  123. */
  124. public static string RedeemConsume = "/api/Redeem/Consume";
  125. public static string RedeemUserConsume = "/api/Redeem/UserConsume";
  126. /**
  127. * 上报付费,匹配点击记录,回调到广告方
  128. */
  129. public static string PayrecordSubmit = "/api/Payrecord/Submit";
  130. #region 初始化
  131. private static readonly YouLoftServices instance = null;
  132. static YouLoftServices()
  133. {
  134. if (string.IsNullOrEmpty(apiUrl) || string.IsNullOrEmpty(gameId) || string.IsNullOrEmpty(gameKey))
  135. {
  136. Debug.LogError("没有配置YouLoftService配置");
  137. }
  138. else
  139. {
  140. Debug.Log("YouLoftService: " + string.Join("=", apiUrl, gameId, gameKey));
  141. var go = new GameObject(nameof(YouLoftServices));
  142. instance = go.AddComponent<YouLoftServices>();
  143. DontDestroyOnLoad(go);
  144. }
  145. }
  146. //初始化
  147. public static void Init()
  148. {
  149. }
  150. private static string apiUrl = "https://gameapi.pottingmob.com";
  151. // private static string gameId = "80388d1f-8901-414c-b7f8-62d125e60200";
  152. private static string gameId = PottingMobileContent.GameId;
  153. private static string gameKey = PottingMobileContent.GameSecret;
  154. // private static string gameKey = "12345678123456781234567812345678";
  155. private static string tokenid = "";
  156. private static string userid = "";
  157. private static int GameServerArchiveversion { get; set; }
  158. #endregion
  159. /// <summary>
  160. /// 服务器配置
  161. /// </summary>
  162. public static void ServerConfig(Action<int, string> callback)
  163. {
  164. var jsonData = new JSONObject
  165. {
  166. ["appVer"] = "0",
  167. ["lastVer"] = 0,
  168. ["nonce"] = UnityEngine.Random.Range(0, 100000000).ToString(),
  169. ["timestamp"] = GetUnixTime(),
  170. ["gameid"] = gameId
  171. };
  172. var signStr = GetSign(jsonData);
  173. jsonData["sign"] = signStr;
  174. PostJson(ConfigSync, jsonData, (i, s) =>
  175. {
  176. if (i == 1)
  177. {
  178. var jsn = JSON.Parse(s);
  179. var data = DecryptDES(jsn["data"], gameKey.Substring(0, 8));
  180. callback?.Invoke(1, data);
  181. }
  182. else callback?.Invoke(2, s);
  183. });
  184. }
  185. /// <summary>
  186. /// 兑换码
  187. /// </summary>
  188. public static void RedemptionCode(string code, Action<int, string> callback)
  189. {
  190. var jsonData = new JSONObject
  191. {
  192. ["redeemcode"] = code,
  193. ["nonce"] = UnityEngine.Random.Range(0, 100000000).ToString(),
  194. ["timestamp"] = GetUnixTime(),
  195. ["gameid"] = gameId
  196. };
  197. var signStr = GetSign(jsonData);
  198. jsonData["sign"] = signStr;
  199. PostJson(DedeemConsume, jsonData, (i, s) =>
  200. {
  201. if (i == 1)
  202. {
  203. var jsn = JSON.Parse(s);
  204. var data = DecryptDES(jsn["data"], gameKey.Substring(0, 8));
  205. callback?.Invoke(1, data);
  206. }
  207. else callback?.Invoke(2, s);
  208. });
  209. }
  210. public static void _redeemConsume(string code,string channel, Action<int, string> callback)
  211. {
  212. var jsonData = new JSONObject
  213. {
  214. ["redeemcode"] = code,
  215. ["channel"] = channel,
  216. ["nonce"] = UnityEngine.Random.Range(0, 100000000).ToString(),
  217. ["timestamp"] = GetUnixTime(),
  218. ["gameid"] = gameId
  219. };
  220. var signStr = GetSign(jsonData);
  221. jsonData["sign"] = signStr;
  222. PostJson(RedeemConsume, jsonData, (i, s) =>
  223. {
  224. if (i == 1)
  225. {
  226. var jsn = JSON.Parse(s);
  227. var data = DecryptDES(jsn["data"], gameKey.Substring(0, 8));
  228. callback?.Invoke(1, data);
  229. }
  230. else callback?.Invoke(2, s);
  231. });
  232. }
  233. public static void _redeemUserConsume(string code,string channel, Action<int, string> callback)
  234. {
  235. var jsonData = new JSONObject
  236. {
  237. ["redeemcode"] = code,
  238. ["channel"] = channel,
  239. ["clientid"] = userid,
  240. ["nonce"] = UnityEngine.Random.Range(0, 100000000).ToString(),
  241. ["timestamp"] = GetUnixTime(),
  242. ["gameid"] = gameId
  243. };
  244. var signStr = GetSign(jsonData);
  245. jsonData["sign"] = signStr;
  246. PostJson(RedeemUserConsume, jsonData, (i, s) =>
  247. {
  248. if (i == 1)
  249. {
  250. var jsn = JSON.Parse(s);
  251. var data = DecryptDES(jsn["data"], gameKey.Substring(0, 8));
  252. callback?.Invoke(1, data);
  253. }
  254. else callback?.Invoke(2, s);
  255. });
  256. }
  257. /// <summary>
  258. ///服务器游戏版本
  259. /// </summary>
  260. public static void GameServerVersion(int channel, Action<int, string> callback)
  261. {
  262. var jsonData = new JSONObject
  263. {
  264. ["channel"] = channel,
  265. ["nonce"] = UnityEngine.Random.Range(0, 100000000).ToString(),
  266. ["timestamp"] = GetUnixTime(),
  267. ["gameid"] = gameId
  268. };
  269. //0: 官方包 3: vivo 4: oppo 5: huawei 6: 4399 7: 应用包
  270. var signStr = GetSign(jsonData);
  271. jsonData["sign"] = signStr;
  272. PostJson(ChannelpayGetAppVersion, jsonData, (i, s) =>
  273. {
  274. if (i == 1)
  275. {
  276. var jsn = JSON.Parse(s);
  277. var data = DecryptDES(jsn["data"], gameKey.Substring(0, 8));
  278. ShowLog("GameServerVersion:" + data);
  279. callback?.Invoke(1, jsn);
  280. }
  281. else callback?.Invoke(2, s);
  282. });
  283. }
  284. /// <summary>
  285. /// 活动
  286. /// </summary>
  287. /// <param name="channel"></param>
  288. /// <param name="language"></param>
  289. /// <param name="callback"></param>
  290. public static void ActivityBy(string channel,string language, Action<int, string> callback)
  291. {
  292. var jsonData = new JSONObject
  293. {
  294. ["channel"] = channel,
  295. ["language"] = language,
  296. ["nonce"] = UnityEngine.Random.Range(0, 100000000).ToString(),
  297. ["timestamp"] = GetUnixTime(),
  298. ["gameid"] = gameId
  299. };
  300. var signStr = GetSign(jsonData);
  301. jsonData["sign"] = signStr;
  302. PostJson(getActivitiesWithChannel, jsonData, (i, s) =>
  303. {
  304. if (i == 1)
  305. {
  306. var jsn = JSON.Parse(s);
  307. var data = DecryptDES(jsn["data"], gameKey.Substring(0, 8));
  308. callback?.Invoke(1, data);
  309. }
  310. else callback?.Invoke(2, s);
  311. });
  312. }
  313. /// <summary>
  314. /// 公告
  315. /// </summary>
  316. /// <param name="channel"></param>
  317. /// <param name="version"></param>
  318. /// <param name="language"></param>
  319. /// <param name="callback"></param>
  320. public static void AnnouncementBy(string channel, string version, string language, Action<int, string> callback)
  321. {
  322. var jsonData = new JSONObject
  323. {
  324. ["channel"] = channel,
  325. ["version"] = version,
  326. ["language"] = language,
  327. ["nonce"] = UnityEngine.Random.Range(0, 100000000).ToString(),
  328. ["timestamp"] = GetUnixTime(),
  329. ["gameid"] = gameId
  330. };
  331. var signStr = GetSign(jsonData);
  332. jsonData["sign"] = signStr;
  333. PostJson(gameAnoncementsWithChannel, jsonData, (i, s) =>
  334. {
  335. var jsn = JSON.Parse(s);
  336. var data = DecryptDES(jsn["data"], gameKey.Substring(0, 8));
  337. callback?.Invoke(1, data);
  338. });
  339. }
  340. // private static void MoniLogin()
  341. // {
  342. // Login(new UserGraph
  343. // {
  344. // userID = SystemInfo.deviceUniqueIdentifier,
  345. // nickName = SystemInfo.deviceUniqueIdentifier,
  346. // platform = 0
  347. // }, (i, s) => { });
  348. // }
  349. /// <summary>
  350. /// 登录
  351. /// </summary>
  352. public static void Login(string id, int type, string name, string icon, Action<int, string> callback)
  353. {
  354. var jsonData = new JSONObject
  355. {
  356. ["markid"] = id,
  357. ["type"] = type,
  358. ["name"] = name,
  359. ["icon"] = icon,
  360. ["nonce"] = UnityEngine.Random.Range(0, 100000000).ToString(),
  361. ["timestamp"] = GetUnixTime(),
  362. ["gameid"] = gameId
  363. };
  364. var signStr = GetSign(jsonData);
  365. jsonData["sign"] = signStr;
  366. PostJson(UserLogin, jsonData, (i, s) =>
  367. {
  368. if (i == 1)
  369. {
  370. var jsn = JSON.Parse(s);
  371. var data = jsn["data"];
  372. tokenid = data["tokenid"];
  373. userid = data["userid"];
  374. callback?.Invoke(1, userid);
  375. }
  376. else callback?.Invoke(2, s);
  377. });
  378. }
  379. /// <summary>
  380. /// 保存 or 提交存档
  381. /// </summary>
  382. public static void CommitArchive(string archiveStr, long archiveVersion, Action<int, string> callback)
  383. {
  384. ShowLog("CommitArchive_version = " + archiveVersion);
  385. var jsonData = GetBaseJsonData();
  386. jsonData["archive"] = archiveStr;
  387. jsonData["archiveVersion"] = archiveVersion;
  388. var signStr = GetSign(jsonData);
  389. jsonData["sign"] = signStr;
  390. PostJson(UserSync, jsonData, (i, s) =>
  391. {
  392. if (i == 1)
  393. {
  394. var jsn = JSON.Parse(s);
  395. var archive = GetDecryptDESDecodeMsg(jsn["data"]);
  396. var archiveJson = JSON.Parse(archive);
  397. var archiveData = archiveJson["Archive"];
  398. int.TryParse(archiveJson["Archiveversion"], out var version);
  399. GameServerArchiveversion = version;
  400. callback?.Invoke(1, archiveData);
  401. }
  402. else callback?.Invoke(2, s);
  403. });
  404. }
  405. /// <summary>
  406. /// 请求支付 (starUrl = resultData["data"] endUrl = resultData["returnAppLink"] orderid = resultData["orderid"])
  407. /// </summary>
  408. public static void RequestOrder(string goodsid,string activityid, Action<int, string, string, string> callback)
  409. {
  410. var jsonData = GetBaseJsonData();
  411. jsonData["goodsid"] = goodsid;
  412. jsonData["activityid"] = activityid;
  413. var signStr = GetSign(jsonData);
  414. jsonData["sign"] = signStr;
  415. PostJson(UserOrder, jsonData, (i, s) =>
  416. {
  417. if (i == 1)
  418. {
  419. var resultData = JSON.Parse(s);
  420. var starUrl = resultData["data"];
  421. var endUrl = resultData["returnAppLink"];
  422. var orderid = resultData["orderid"];
  423. callback?.Invoke(1, starUrl, endUrl, orderid);
  424. }
  425. else callback?.Invoke(2, s, s, s);
  426. });
  427. }
  428. public static void _channelPayOrder(int channel,string goodsid, Action<int, string> callback)
  429. {
  430. var jsonData = GetBaseJsonData();
  431. jsonData["channel"] = channel;
  432. jsonData["goodsid"] = goodsid;
  433. var signStr = GetSign(jsonData);
  434. jsonData["sign"] = signStr;
  435. PostJson(ChannelpayOrder, jsonData, (i, s) =>
  436. {
  437. if (i == 1)
  438. {
  439. callback?.Invoke(1, s);
  440. }
  441. else callback?.Invoke(2,s);
  442. });
  443. }
  444. public static void _userQueryOrder(string goodsid, string orderId, Action<int, string> callback)
  445. {
  446. var jsonData = GetBaseJsonData();
  447. jsonData["goodsid"] = goodsid;
  448. jsonData["orderid"] = orderId;
  449. var signStr = GetSign(jsonData);
  450. jsonData["sign"] = signStr;
  451. PostJson(UserQueryOrder, jsonData, (i, s) =>
  452. {
  453. if (i == 1)
  454. {
  455. callback?.Invoke(1, s);
  456. }
  457. else callback?.Invoke(2,s);
  458. });
  459. }
  460. public static void _userHeartbeat(Action<int, string> callback)
  461. {
  462. var jsonData = GetBaseJsonData();
  463. var signStr = GetSign(jsonData);
  464. jsonData["sign"] = signStr;
  465. PostJson(UserHeartbeat, jsonData, (i, s) =>
  466. {
  467. if (i == 1)
  468. {
  469. callback?.Invoke(1, s);
  470. }
  471. else callback?.Invoke(2,s);
  472. });
  473. }
  474. /// <summary>
  475. /// 消耗订单
  476. /// </summary>
  477. public static void ConsumeOrder(string goodsid, string orderid, Action<int, string> callback)
  478. {
  479. var jsonData = GetBaseJsonData();
  480. jsonData["goodsid"] = goodsid;
  481. jsonData["orderid"] = orderid;
  482. var signStr = GetSign(jsonData);
  483. jsonData["sign"] = signStr;
  484. PostJson(UserConsume, jsonData, (i, s) =>
  485. {
  486. if (i == 1)
  487. {
  488. var resultData = JSON.Parse(s);
  489. string orderData = GetDecryptDESDecodeMsg(resultData["data"]);
  490. var orderJson = JSON.Parse(orderData);
  491. var orderStatus = int.Parse(orderJson["Orderstatus"]); //0:not pay 1:pay 2:pay and use
  492. ShowLog($"订单状态数据:{orderJson},{orderStatus}");
  493. if (orderStatus == 2) callback?.Invoke(1, orderid);
  494. else callback?.Invoke(2, "错误:订单状态=" + orderStatus.ToString());
  495. }
  496. else callback?.Invoke(2, s);
  497. });
  498. }
  499. //查询订单
  500. public static void ResumeOrder(Action<int, string>callback)
  501. {
  502. var jsonData = GetBaseJsonData();
  503. var signStr = GetSign(jsonData);
  504. jsonData["sign"] = signStr;
  505. PostJson(UserResumepurchase, jsonData, (code, s) =>
  506. {
  507. if (code == 1)
  508. {
  509. var resultData = JSON.Parse(s);
  510. string orderData = GetDecryptDESDecodeMsg(resultData["data"]);
  511. var orderJson = JSON.Parse(orderData);
  512. ShowLog("Resumepurchase data : " + orderJson);
  513. // List<OrderInfo> orderList = new List<OrderInfo>();
  514. // for (int i = 0; i < orderJson.Count; i++)
  515. // {
  516. // var orderInfo = new OrderInfo();
  517. // orderInfo.orderID = orderJson[i]["Orderid"];
  518. // orderInfo.orderStatus = int.Parse(orderJson[i]["Orderstatus"]);
  519. // orderInfo.goodsID = orderJson[i]["Goodsid"];
  520. // orderInfo.goodsInfo = orderJson[i]["Goodsinfo"];
  521. // if (orderInfo.orderStatus == 1) orderList.Add(orderInfo);
  522. // else ShowLog("Resumepurchase orderStatus = " + orderInfo.orderStatus);
  523. // }
  524. callback?.Invoke(1, orderJson);
  525. }
  526. else callback?.Invoke(2, null);
  527. });
  528. }
  529. public static void Feedback(string imsg, string contact, string savedata, string appVer, string deviceid,
  530. string countrycode,
  531. Action<int, string> callback)
  532. {
  533. var jsonData = new JSONObject();
  534. jsonData["msg"] = imsg; //用户提交的信息
  535. jsonData["contact"] = contact; //联系方式 邮箱 qq 电话,微信
  536. jsonData["documentinfo"] = savedata; //存档
  537. jsonData["appVer"] = appVer; //应用版本
  538. jsonData["device"] = deviceid; //设备信息
  539. jsonData["countryCode"] = countrycode; //国家代码
  540. jsonData["nonce"] = UnityEngine.Random.Range(0, 100000000).ToString();
  541. jsonData["timestamp"] = GetUnixTime();
  542. jsonData["gameid"] = gameId;
  543. var signStr = GetSign(jsonData);
  544. jsonData["sign"] = signStr;
  545. PostJson(feedback, jsonData, (i, s) => { callback?.Invoke(i == 1 ? 1 : 2, s); });
  546. }
  547. //上传分数
  548. public static void UploadScore(string rankingid, int score, string info, System.Action<bool> callback = null)
  549. {
  550. var jsonData = GetBaseJsonData();
  551. jsonData["rankingid"] = rankingid;
  552. jsonData["score"] = score;
  553. jsonData["info"] = info;
  554. var signStr = GetSign(jsonData);
  555. jsonData["sign"] = signStr;
  556. PostJson(UserUploadScore, jsonData, (i, s) => { callback?.Invoke(i == 1); });
  557. }
  558. public static void _userGetUserRank(string rankingid,System.Action<int, string> callback)
  559. {
  560. var jsonData = GetBaseJsonData();
  561. jsonData["rankingid"] = rankingid;
  562. var signStr = GetSign(jsonData);
  563. jsonData["sign"] = signStr;
  564. PostJson(UserGetUserRank, jsonData, (i, s) =>
  565. {
  566. callback?.Invoke(i,s);
  567. });
  568. }
  569. //获取排行榜链接
  570. public static string GetLeaderboardLink(string rankId = "")
  571. {
  572. if (userid == null) return null;
  573. return "https://chinaapi.youloft.com/ranking/index?" +
  574. "gameid=" + gameId +
  575. "&userid=" + userid +
  576. "&rankid=" + rankId;
  577. }
  578. //服务基础数据
  579. private static JSONObject GetBaseJsonData()
  580. {
  581. var jsonData = new JSONObject();
  582. jsonData["userid"] = userid;
  583. jsonData["token"] = tokenid;
  584. jsonData["gameid"] = gameId;
  585. jsonData["nonce"] = UnityEngine.Random.Range(0, 100000000).ToString();
  586. jsonData["timestamp"] = GetUnixTime();
  587. return jsonData;
  588. }
  589. private static string CheckError(UnityWebRequest request)
  590. {
  591. int code = 0;
  592. string log = "";
  593. if (request.error != null) code = -1;
  594. if (code == 0 && request.downloadHandler.text != null)
  595. {
  596. var resultData = JSON.Parse(request.downloadHandler.text);
  597. code = int.Parse(resultData["code"]);
  598. }
  599. switch (code)
  600. {
  601. case 200:
  602. case 2000:
  603. case 2100:
  604. case 2200:
  605. log = "";
  606. break;
  607. case -1:
  608. log = request.error;
  609. break;
  610. case 4001:
  611. log = "错误的随机数";
  612. break;
  613. case 4002:
  614. log = "错误的时间";
  615. break;
  616. case 4003:
  617. log = "错误的签名";
  618. break;
  619. case 4004:
  620. log = "错误的游戏";
  621. break;
  622. case 4005:
  623. log = "错误的授权";
  624. break;
  625. case 4006:
  626. log = "错误的订单";
  627. break;
  628. case 4007:
  629. log = "错误的标识";
  630. break;
  631. case 4008:
  632. log = "用户登录异常";
  633. break;
  634. case 4009:
  635. log = "服务器维护中";
  636. break;
  637. default:
  638. log = "其他";
  639. break;
  640. }
  641. if (!string.IsNullOrEmpty(log)) Debug.LogError($"CheckErrcode : code = {code}, Msg = {log}");
  642. return log;
  643. }
  644. private static string GetSign(JSONObject jsonData)
  645. {
  646. List<string> keyList = new List<string>();
  647. foreach (var pair in jsonData)
  648. {
  649. var value = pair.Value;
  650. keyList.Add(value);
  651. }
  652. keyList.Add(gameKey);
  653. return EncrpytParam(keyList);
  654. }
  655. #region 加密解密
  656. /// <summary>
  657. /// 对list ascii 排序,然后md5加密
  658. /// </summary>
  659. /// <param name="paramList"></param>
  660. /// <returns></returns>
  661. public static string EncrpytParam(List<string> paramList)
  662. {
  663. if (paramList == null)
  664. {
  665. throw new ArgumentNullException(nameof(paramList));
  666. }
  667. paramList.Sort((a, b) => { return string.CompareOrdinal(a, b); });
  668. var tempStr = string.Join("&", paramList);
  669. return MD5Hash(tempStr);
  670. }
  671. /// <summary>
  672. /// md5加密,32位大写字母,不包含短横线
  673. /// </summary>
  674. /// <param name="input"></param>
  675. /// <returns></returns>
  676. public static string MD5Hash(string input)
  677. {
  678. using (var md5 = MD5.Create())
  679. {
  680. var result = md5.ComputeHash(Encoding.UTF8.GetBytes(input));
  681. var strResult = BitConverter.ToString(result);
  682. return strResult.Replace("-", "");
  683. }
  684. }
  685. /// <summary>
  686. /// 获取解密秘钥(登录)
  687. /// </summary>
  688. /// <returns></returns>
  689. public static string GetDescryptKey()
  690. {
  691. var key = tokenid.Replace("-", "").Substring(0, 4) + gameKey.Substring(0, 4);
  692. return key;
  693. }
  694. /// <summary>
  695. /// DES解密字符串
  696. /// </summary>
  697. /// <param name="decryptString">待解密的字符串</param>
  698. /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
  699. /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
  700. public static string DecryptDES(string decryptString, string decryptKey)
  701. {
  702. try
  703. {
  704. byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
  705. byte[] rgbIV = { 0x12, 0x34, 0x56, 0x45, 0x31, 0x16, 0x78, 0x67 };
  706. byte[] inputByteArray = Convert.FromBase64String(decryptString);
  707. DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
  708. MemoryStream mStream = new MemoryStream();
  709. CryptoStream cStream =
  710. new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
  711. cStream.Write(inputByteArray, 0, inputByteArray.Length);
  712. cStream.FlushFinalBlock();
  713. return Encoding.UTF8.GetString(mStream.ToArray());
  714. }
  715. catch (Exception e)
  716. {
  717. Debug.LogError("DES解密字符串错误 : " + e);
  718. return decryptString;
  719. }
  720. }
  721. public static string GetGetDecryptDESWithoutToken(string decryptString)
  722. {
  723. return DecryptDES(decryptString, gameKey.Substring(0, 8));
  724. }
  725. public static string GetDecryptDESDecodeMsg(string decryptString)
  726. {
  727. string descyptKey = GetDescryptKey();
  728. string dataStr = DecryptDES(decryptString, descyptKey);
  729. return dataStr;
  730. }
  731. #endregion
  732. #region http interface
  733. private static void PostJson(string switcher, JSONObject jsonObject, Action<int, string> onCompleted)
  734. {
  735. var jsn = jsonObject.ToString();
  736. ShowLog($"PostJson:Url={switcher},data={jsn}");
  737. HttpPost(instance, switcher, Encoding.Default.GetBytes(jsn), request =>
  738. {
  739. var str = CheckError(request);
  740. if (string.IsNullOrEmpty(str))
  741. {
  742. onCompleted?.Invoke(1, request.downloadHandler.text);
  743. }
  744. else onCompleted?.Invoke(2, str);
  745. });
  746. }
  747. private static void HttpPost(MonoBehaviour holder, string switcher, byte[] body,
  748. Action<UnityWebRequest> onCompleted,
  749. int timeoutSeconds = -1)
  750. {
  751. holder.StartCoroutine(HttpPostHelper(holder, switcher, body, onCompleted, timeoutSeconds));
  752. }
  753. private static IEnumerator<UnityWebRequestAsyncOperation> HttpPostHelper(MonoBehaviour holder, string switcher,
  754. byte[] body,
  755. Action<UnityWebRequest> onCompleted, int timeoutSeconds)
  756. {
  757. using (UnityWebRequest request = new UnityWebRequest(apiUrl + switcher, "POST"))
  758. {
  759. request.uploadHandler = new UploadHandlerRaw(body);
  760. request.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
  761. request.downloadHandler = new DownloadHandlerBuffer();
  762. if (timeoutSeconds > 0) request.timeout = timeoutSeconds;
  763. yield return request.SendWebRequest();
  764. onCompleted?.Invoke(request);
  765. }
  766. }
  767. #endregion
  768. public class OrderInfo
  769. {
  770. public string orderID;
  771. public int orderStatus;
  772. public string goodsID;
  773. public string goodsInfo;
  774. }
  775. private static readonly DateTime _date = new DateTime(1970, 1, 1, 0, 0, 0, 0);
  776. public static int GetUnixTime()
  777. {
  778. TimeSpan ts = DateTime.UtcNow - _date;
  779. return Convert.ToInt32(ts.TotalSeconds);
  780. }
  781. public static string ShowLog(string msg)
  782. {
  783. Debug.Log(msg);
  784. return msg;
  785. }
  786. }
  787. public class UserGraph
  788. {
  789. public string userID;
  790. public int platform; //99:游客登录 0:自注册用户 1:微信登录 2:qq用户 3: vivo 4: oppo 5: huawei 6: 4399 7: 应用包
  791. public string nickName;
  792. public string imageUrl;
  793. }