首页 > 解决方案 > Apple Valiidating Receipt Exeption(现有连接被远程主机强行关闭)

问题描述

我在验证我的沙盒收据时遇到问题。设备将收据发送到我的 Azure App Service,后者向 Apple Receipt Vaildation 服务器发出 POST 请求。但是,在大约 50% 的请求中,我收到一条错误消息:

System.Net.WebException: The SSL connection could not be established, see inner exception. Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host

其他 50% 确实可以正常工作。

C# 代码:

[HttpPost("{isSandbox}")]
        public bool Post(bool isSandbox, [FromBody] myReceipt myReceipt)
        {
            try
            {
                var json = new JObject(new JProperty("receipt-data", myReceipt.ReceiptString),
                           new JProperty("password", myReceipt.Password),
                           new JProperty("exclude-old-transactions", "true")).ToString();

                ASCIIEncoding ascii = new ASCIIEncoding();
                byte[] postBytes = Encoding.UTF8.GetBytes(json);

                var url = "https://buy.itunes.apple.com/verifyReceipt";
                if(isSandbox)
                {
                    url = "https://sandbox.itunes.apple.com/verifyReceipt";
                }
                var request = WebRequest.Create(url);
                request.Method = "POST";
                request.ContentType = "application/json";
                request.ContentLength = postBytes.Length;

                using (var stream = request.GetRequestStream())
                {
                    stream.Write(postBytes, 0, postBytes.Length);
                    stream.Flush();
                }

                var sendresponse = request.GetResponse();

                string sendresponsetext = "";
                using (var streamReader = new StreamReader(sendresponse.GetResponseStream()))
                {
                    sendresponsetext = streamReader.ReadToEnd().Trim();
                }
                var responseObject = JsonConvert.DeserializeObject<responseBody>(sendresponsetext);
                if (responseObject.Latest_receipt_info[0].Expires_date == null)
                {
                    return false;
                }
                DateTime expireDate = Convert.ToDateTime(responseObject.Latest_receipt_info[0].Expires_date.Replace(" Etc/GMT", ""));
                if (expireDate >= DateTime.Now || responseObject.Latest_receipt_info[0].Is_trial_period == "true")
                {
                    // User has premium
                    return true;
                }
                return false;
            }
            catch (Exception error)
            {
                telemetry.TrackEvent("Exeption: " + error);
                return false;
            }
        }

这段代码大部分来自:使用 C# 在应用购买收据中验证 iOS

问题是对我来说它不是 100% 可靠的。知道为什么会这样吗?这仅发生在沙盒验证中吗?

标签: c#iosweb-servicespostreceipt-validation

解决方案


推荐阅读