收藏
回答

微信支付V3图片上传,返回 400 远程服务器错误,能不能帮我解答啊?

                string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "/temp/", filename);

                var sha256 = Applyments.SHA256File(filePath);

                meta meta = new meta()

                {

                    sha256 = sha256,

                    filename = System.IO.Path.GetFileName(filePath)

                };

                var json = JsonConvert.SerializeObject(meta);

                string mchid = site.WechatMchid;

                string serialNo = site.WechatSerialNo;

                var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();

                string nonce = Guid.NewGuid().ToString("n");

                string method = "POST";

                string uri = "/v3/merchant/media/upload";

                string body = json;

                string message = $"{method}\n{uri}\n{timestamp}\n{nonce}\n{body}\n";

                string signature = Applyments.Sign(message, mchid);

                string auth = $"mchid=\"{mchid}\",nonce_str=\"{nonce}\",timestamp=\"{timestamp}\",serial_no=\"{serialNo}\",signature=\"{signature}\"";

                string value = $"WECHATPAY2-SHA256-RSA2048 {auth}";


                // 定义数据分隔线

                string boundary = string.Format("{0}", DateTime.Now.Ticks.ToString("x"));

                string Url = "https://api.mch.weixin.qq.com/v3/merchant/media/upload";

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);

                request.Method = "POST";

                request.Headers.Add(HttpRequestHeader.Authorization, value);

                //request.Accept = "application/json";

                request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36";

                request.ContentType = "multipart/form-data;boundary=" + boundary;



                // 换行符

                string LINE_END = "\r\n";

                string PREFIX = "--";

                //拼装请求内容第一部分

                StringBuilder strSb = new StringBuilder();

                StringBuilder strSb1 = new StringBuilder();

                strSb1.Append(PREFIX).Append(boundary);

                strSb.Append(PREFIX).Append(boundary).Append(LINE_END)

                     .Append("Content-Disposition: form-data; name=\"meta\";" + LINE_END)

                     .Append("Content-Type: application/json; " + LINE_END)

                     .Append(LINE_END)// 空行

                     .Append("{\"filename\":\"" + meta.filename + "\",\"sha256\":\"" + meta.sha256 + "\"}")

                     .Append(LINE_END);


                //拼装请求内容第二部分

                strSb.Append(PREFIX).Append(boundary).Append(LINE_END)

                           .Append("Content-Disposition: form-data; name=\"file\"; filename=\"" + filename + "\";" + LINE_END)

                           .Append("Content-Type: image/jpeg" + LINE_END)

                           .Append(LINE_END);// 空行


                //拼接图片文件流

                FileStream fs = new FileStream(filePath, FileMode.Open);//可以是其他重载方法 

                byte[] byData = new byte[fs.Length];

                fs.Read(byData, 0, byData.Length);

                fs.Close();

                string stringFiles = Convert.ToBase64String(byData);

                strSb.Append(stringFiles).Append(LINE_END);


                //结尾

                strSb.Append(PREFIX).Append(boundary).Append(PREFIX)

                         .Append(LINE_END);


                byte[] data = Encoding.UTF8.GetBytes(strSb.ToString());

                MemoryStream memoryStream = new MemoryStream();

                memoryStream.Write(data, 0, data.Length);

                // 获取二进制数据

                byte[] postBytes = memoryStream.ToArray();


                request.ContentLength = postBytes.Length;


                using(Stream reqStream = request.GetRequestStream())

                {

                    reqStream.Write(postBytes, 0, postBytes.Length);

                    reqStream.Close();

                }

                HttpWebResponse resp = (HttpWebResponse)request.GetResponse();


                //获取响应内容

                StreamReader reader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);

                string content = reader.ReadToEnd();

                reader.Close();

回答关注问题邀请回答
收藏

1 个回答

登录 后发表内容
问题标签