using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using ToneTuneToolkit.Common; using UnityEngine.Events; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Text; /// /// 对志城综合法宝 /// public class Upload2ZCManager : SingletonMaster { // ================================================== #region 2025.6 VWAIPhoto public static UnityAction OnVWAvatarFinished; private const string VWSUBMITURL = @"https://vw-v-space.studiocapsule.cn/api/device/submitTask"; public void UpgradeVWUserData(string gender, string car, string address, Texture2D file) { uVWUD.gender = gender; uVWUD.car = car; uVWUD.address = address; uVWUD.file = file.EncodeToPNG(); return; } // ================================================== // 提交生成任务 public void SubmitVWUserPhoto() => StartCoroutine(nameof(SubmitVWUserPhotoAction)); private IEnumerator SubmitVWUserPhotoAction() { WWWForm wwwForm = new WWWForm(); wwwForm.AddField("gender", uVWUD.gender); wwwForm.AddField("car", uVWUD.car); wwwForm.AddField("address", uVWUD.address); wwwForm.AddBinaryData("file", uVWUD.file); using (UnityWebRequest www = UnityWebRequest.Post(VWSUBMITURL, wwwForm)) { www.downloadHandler = new DownloadHandlerBuffer(); yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.Log($"[U2ZCM] {www.error}"); yield break; } Debug.Log($"[U2ZCM] {www.downloadHandler.text}"); try { rVWUD = JsonConvert.DeserializeObject(www.downloadHandler.text); } catch { OnVWAvatarFinished?.Invoke(null, false); } if (rVWUD.code != 0) { Debug.Log($"[U2ZCM] Code Error"); yield break; } StartQueryTask(); // 轮询直到出答案 } yield break; } private Upload_VWUserData uVWUD = new Upload_VWUserData(); [SerializeField] private Respon_VWUserData rVWUD = new Respon_VWUserData(); [Serializable] public class Upload_VWUserData { public string gender; public string car; public string address; public byte[] file; } [Serializable] public class Respon_VWUserData { public int code; public Respon_VWUserDataData data; } [Serializable] public class Respon_VWUserDataData { public string task_code; } // ================================================== // 轮询 private int queryCount = 0; private const string VWQUERYURL = @"https://vw-v-space.studiocapsule.cn/api/device/queryTask"; public void StartQueryTask() { StartCoroutine(nameof(QueryTaskAction)); } public void StopQueryTask() { StopCoroutine(nameof(QueryTaskAction)); } private IEnumerator QueryTaskAction() { yield return new WaitForSeconds(5f); // 先等5秒 while (true) { queryCount++; if (queryCount > 12) { Debug.Log($"[U2ZCM] 轮询次数过多,停止查询"); OnVWAvatarFinished?.Invoke(null, false); yield break; } WWWForm wwwForm = new WWWForm(); wwwForm.AddField("task_code", rVWUD.data.task_code); using (UnityWebRequest www = UnityWebRequest.Post(VWQUERYURL, wwwForm)) { www.downloadHandler = new DownloadHandlerBuffer(); yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.Log($"[U2ZCM] {www.error}"); yield break; } Debug.Log($"[U2ZCM] {www.downloadHandler.text}"); rVWAD = JsonConvert.DeserializeObject(www.downloadHandler.text); if (rVWUD.code != 0) { Debug.Log($"[U2ZCM] Code Error"); OnVWAvatarFinished?.Invoke(null, false); yield break; } switch (rVWAD.data.status) { default: break; case 3: queryCount = 0; Debug.Log("[U2ZCM] 开始下载图片"); StartCoroutine(nameof(DownloadAvatarAction), rVWAD.data.avatar_url); // 下载图片 yield break; case 4: OnVWAvatarFinished?.Invoke(null, false); break; } yield return new WaitForSeconds(5f); } } } [SerializeField] private Respon_VWAvatarData rVWAD = new Respon_VWAvatarData(); [Serializable] public class Respon_VWAvatarData { public int code; public string message; public Respon_VWAvatarDataData data; } [Serializable] public class Respon_VWAvatarDataData { public string avatar_url; public int status; public string status_text; } // ================================================== // 获取图片 private IEnumerator DownloadAvatarAction(string url) { using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url)) { yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.Log($"[U2ZCM] {www.error}"); yield break; } debug_peekQRCode = DownloadHandlerTexture.GetContent(www); // DEBUG OnVWAvatarFinished?.Invoke(DownloadHandlerTexture.GetContent(www), true); } yield break; } // ================================================== // 上传图片并获取二维码地址 private const string VWUPLOADURL = @"https://vw-v-space.studiocapsule.cn/api/device/finalUpload"; public void UploadVWResult(Texture2D value) => StartCoroutine(nameof(UploadVWResultAction), value); private IEnumerator UploadVWResultAction(Texture2D t2dResult) { WWWForm wwwForm = new WWWForm(); wwwForm.AddField("task_code", rVWUD.data.task_code); wwwForm.AddBinaryData("file", t2dResult.EncodeToJPG(), "t2d.jpg", "image/jpeg"); using (UnityWebRequest www = UnityWebRequest.Post(VWUPLOADURL, wwwForm)) { www.downloadHandler = new DownloadHandlerBuffer(); yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.Log($"[U2ZCM] {www.error}"); yield break; } Debug.Log($"[U2ZCM] {www.downloadHandler.text}"); rVWRD = JsonConvert.DeserializeObject(www.downloadHandler.text); if (rVWRD.code != 0) { Debug.Log($"[U2ZCM] Code Error"); yield break; } DownloadQRCode(rVWRD.data.qr_url); } yield break; } [SerializeField] private Respon_VWResultData rVWRD = new Respon_VWResultData(); [Serializable] public class Respon_VWResultData { public int code; public string message; public Respon_VWResultDataData data; } [Serializable] public class Respon_VWResultDataData { public string qr_url; public string file_url; } #endregion // ================================================== // ================================================== // ================================================== #region 获取QR图片 public static UnityAction OnQRImageDownloaded; [SerializeField] private Texture2D debug_peekQRCode; public void DownloadQRCode(string url) => StartCoroutine(nameof(DownloadQRCodeAction), url); private IEnumerator DownloadQRCodeAction(string url) { using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url)) { yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.Log($"[U2ZCM] {www.error}"); yield break; } debug_peekQRCode = DownloadHandlerTexture.GetContent(www); // DEBUG OnQRImageDownloaded?.Invoke(DownloadHandlerTexture.GetContent(www)); } yield break; } #endregion // ================================================== #region 上传文件流 private const string uploadURL = @"https://vw-aud.studiocapsule.cn/api/device/uploadWall"; public UnityAction OnUploadFinished; public void UploadData(byte[] fileBytes) => StartCoroutine(nameof(UploadDataAction), fileBytes); private IEnumerator UploadDataAction(byte[] fileBytes) { WWWForm wwwForm = new WWWForm(); wwwForm.AddBinaryData("file", fileBytes); using (UnityWebRequest www = UnityWebRequest.Post(uploadURL, wwwForm)) { // www.SetRequestHeader("Content-Type", "multipart/form-data"); // wwwForm不要手动设置避免boundary消失 www.downloadHandler = new DownloadHandlerBuffer(); yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.Log($"[U2ZCM] {www.error}"); yield break; } Debug.Log($"[U2ZCM] {www.downloadHandler.text}"); ResponData responData = JsonConvert.DeserializeObject(www.downloadHandler.text); // // 解析方案A 动态类型 // dynamic data = responData.data; // string qr = data.qr_url; // 解析方案B JObject data = JObject.FromObject(responData.data); string qr_url = data["qr_url"].ToString(); // Debug.Log(qr_url); DownloadQRCode(qr_url); } yield break; } #endregion // ================================================== public class ResponData { public int code; public string message; public object data; } #region 2025.04 Nike ADT // private const string USERINFOREQUESTURL = @"https://nike-adt.studiocapsule.cn/api/device/scanQr"; // public static UnityAction OnUserInfoDownloaded; // /// // /// 获取用户信息 // /// // /// // public void GetUserInfo(string url) => StartCoroutine(nameof(GetUserInfoAction), url); // private IEnumerator GetUserInfoAction(string url) // { // WWWForm wwwForm = new WWWForm(); // wwwForm.AddField("qr_content", url); // using (UnityWebRequest www = UnityWebRequest.Post(USERINFOREQUESTURL, wwwForm)) // { // www.downloadHandler = new DownloadHandlerBuffer(); // yield return www.SendWebRequest(); // if (www.result != UnityWebRequest.Result.Success) // { // Debug.Log($"[U2ZCM] {www.error}"); // yield break; // } // Debug.Log($"[U2ZCM] {www.downloadHandler.text}"); // try // { // uird = JsonConvert.DeserializeObject(www.downloadHandler.text); // } // catch (Exception) // { // Debug.Log($"[U2ZCM] 解析错误"); // yield break; // } // if (uird.code != 0) // { // if (OnUserInfoDownloaded != null) // { // OnUserInfoDownloaded(null); // } // yield break; // } // if (OnUserInfoDownloaded != null) // { // UserInfo ui = new UserInfo(); // ui.name = uird.data.name; // ui.code = uird.data.code; // ui.save_car = uird.data.save_car; // ui.can_play = uird.data.can_play; // OnUserInfoDownloaded(ui); // } // } // yield break; // } // private Respon_UserInfoData uird = new Respon_UserInfoData(); // [Serializable] // public class Respon_UserInfoData // { // public int code; // public string message; // public UserInfo data; // } // [Serializable] // public class UserInfo // { // public string name; // public string code; // public string save_car; // public string can_play; // } // // ================================================== // private const string USERIMAGEUPLOADURL = @"https://nike-adt.studiocapsule.cn/api/device/upload"; // public static UnityAction OnUserImageUploaded; // [SerializeField] private Upload_UserImageData uUID; // public void UpdateUserImageData(string user_code, Texture2D t2dPhoto) // { // uUID = new Upload_UserImageData(); // uUID.user_code = user_code; // byte[] fileBytes = t2dPhoto.EncodeToPNG(); // uUID.file = fileBytes; // return; // } // public void UploadUserImage() => StartCoroutine(nameof(UploadUserImageAction)); // private IEnumerator UploadUserImageAction() // { // WWWForm wwwForm = new WWWForm(); // wwwForm.AddField("user_code", uUID.user_code); // wwwForm.AddBinaryData("file", uUID.file); // using (UnityWebRequest www = UnityWebRequest.Post(USERIMAGEUPLOADURL, wwwForm)) // { // www.downloadHandler = new DownloadHandlerBuffer(); // yield return www.SendWebRequest(); // if (www.result != UnityWebRequest.Result.Success) // { // Debug.Log($"[U2ZCM] {www.error}"); // yield break; // } // Debug.Log($"[U2ZCM] {www.downloadHandler.text}"); // rUID = JsonConvert.DeserializeObject(www.downloadHandler.text); // if (rUID.code != 0) // { // Debug.Log($"[U2ZCM] Code Error"); // yield break; // } // DownloadQRCode(rUID.data.qr_url); // 搞图 // } // yield break; // } // public class Upload_UserImageData // { // public string user_code; // public byte[] file; // } // private Respon_UserImageData rUID = new Respon_UserImageData(); // [Serializable] // public class Respon_UserImageData // { // public int code; // public string message; // public Respon_UserImageDataData data; // } // [Serializable] // public class Respon_UserImageDataData // { // public string qr_url; // } #endregion }