2014-04-08 18 views
8

Tôi xác minh ios tôi in app purchase nhận trên máy chủ của tôi sử dụng dịch vụ C# webiOS xác minh trong biên nhận mua ứng dụng với C#

tôi đã nhận như chuỗi bằng cách làm dưới đây trong Xcode:

- (void) completeTransaction: (SKPaymentTransaction *)transaction 
{ 
    NSString* receiptString = [[NSString alloc] initWithString:transaction.payment.productIdentifier]; 

    NSLog(@"%@",receiptString); 

    NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; 

    NSData *receipt = [NSData dataWithContentsOfURL:receiptURL]; 

    NSString *jsonObjectString = [receipt base64EncodedStringWithOptions:0]; 

} 

và tôi gửi chuỗi (biên lai) đó tới dịch vụ web của tôi là C# làm thông số. Đây là phương pháp dịch vụ web của tôi:

[WebMethod(Description = "Purchase Item Verify")] 
public string PurchaseItem(string receiptData) 
{ 
    string returnmessage = ""; 

    try 
    { 
     var json = "{ 'receipt-data': '" + receiptData + "'}"; 

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

     HttpWebRequest request; 
     request = WebRequest.Create("https://sandbox.itunes.apple.com/verifyReceipt") as HttpWebRequest; 
     request.Method = "POST"; 
     request.ContentType = "application/json"; 
     request.ContentLength = postBytes.Length; 

     Stream postStream = request.GetRequestStream(); 
     postStream.Write(postBytes, 0, postBytes.Length); 
     postStream.Close(); 

     var sendresponse = (HttpWebResponse)request.GetResponse(); 

     string sendresponsetext = ""; 
     using (var streamReader = new StreamReader(sendresponse.GetResponseStream())) 
     { 
      sendresponsetext = streamReader.ReadToEnd(); 
     } 
     returnmessage = sendresponsetext; 

    } 
    catch (Exception ex) 
    { 
     ex.Message.ToString(); 
    } 
    return returnmessage; 
} 

Nó luôn trả về {"status":21002}. Tôi đã tìm kiếm hai ngày, nhưng vẫn không thể tìm ra giải pháp. Ai đó có thể giúp tôi không, tôi đang làm gì?

** Tôi đang thử nghiệm trên sandbox đó là lý do tại sao tôi sử dụng URL hộp cát. Tôi có thể xác minh biên nhận giao dịch trong ứng dụng của mình.

+0

Hi Jerry, dis bạn gửi jsonObjectString đến dịch vụ web? Trên thực tế tôi cũng bị mắc kẹt cùng một vấn đề. –

+0

Vui lòng giải quyết vấn đề này https://stackoverflow.com/questions/48188231/validating-receipt-with-the-app-store-in-net-is-success-but-when-sent-the-same –

Trả lời

12

tôi có giải pháp

Mã thức mà làm việc cho tôi là:

public string PurchaseItem(string receiptData) 
{ 
    string returnmessage = ""; 
    try 
    { 
     // var json = "{ 'receipt-data': '" + receiptData + "'}"; 

     var json = new JObject(new JProperty("receipt-data", receiptData)).ToString(); 

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

     // HttpWebRequest request; 
     var request = System.Net.HttpWebRequest.Create("https://sandbox.itunes.apple.com/verifyReceipt"); 
     request.Method = "POST"; 
     request.ContentType = "application/json"; 
     request.ContentLength = postBytes.Length; 

     //Stream postStream = request.GetRequestStream(); 
     //postStream.Write(postBytes, 0, postBytes.Length); 
     //postStream.Close(); 

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

     // var sendresponse = (HttpWebResponse)request.GetResponse(); 

     var sendresponse = request.GetResponse(); 

     string sendresponsetext = ""; 
     using (var streamReader = new StreamReader(sendresponse.GetResponseStream())) 
     { 
      sendresponsetext = streamReader.ReadToEnd().Trim(); 
     } 
     returnmessage = sendresponsetext; 

    } 
    catch (Exception ex) 
    { 
     ex.Message.ToString(); 
    } 
    return returnmessage; 

Chi hai và một nửa ngày chỉ để thay đổi một phương pháp. Cảm ơn Chúa.

+2

Nếu có bất kỳ vấn đề nào an ủi, bạn có lẽ chỉ cần lưu tôi hai ngày rưỡi làm việc. Tôi sẽ thêm một phụ lục nhỏ cho câu trả lời, điều này cũng sẽ giúp mọi người quản lý đăng ký. Ngoài ra, có thể xác nhận mã trên hoạt động tốt trong Xamarin, vì vậy bạn có thể thực hiện xác nhận biên nhận trên điện thoại nếu bạn sử dụng khung Xamarin.iOS. – Nande

+0

ႊ Cảm ơn @Nande vì thông tin đã thêm –

+0

Tôi đã gọi gần thay vì xóa và nhận "Không thể kết nối với máy chủ từ xa" sau khi thực hiện kết nối thành công (và ngoại lệ bên trong chỉ cho tôi biết máy chủ bị ngắt kết nối). bất cứ ai khác tìm kiếm vấn đề này sẽ đến đây. Chúc may mắn (và cảm ơn bạn OP) –

1

Để quản lý đăng ký, câu trả lời của @Jerry Naing cũng yêu cầu cung cấp bí mật được chia sẻ của bạn (có thể được truy xuất/tạo từ iTunes Connect). Cách dễ nhất để bao gồm điều này chỉ là thêm một thuộc tính bổ sung trong dòng xác định json var.

var json = new JObject(new JProperty("receipt-data", receiptData), new JProperty("password", "put_your_shared_secret_here")).ToString(); 

Không cung cấp bí mật dùng chung sẽ dẫn đến phản hồi trạng thái 21004.

3

Dưới đây là một thực hiện không đồng bộ thay thế sử dụng HttpClient:

public static async Task<string> CheckReceiptWithAppStore() 
    { 
     string responseStr = null; 

     string uri = "https://sandbox.itunes.apple.com/verifyReceipt"; 

     string receiptData = // Get your receipt from wherever you store it 

     var json = new JObject(new JProperty("receipt-data", receiptData), 
      new JProperty("password", "paste-your-shared-secret-here")).ToString(); 

     using (var httpClient = new HttpClient()) 
     {   

      if (receiptData != null) 
      { 
       HttpContent content = new StringContent(json); 

       try 
       { 
        Task<HttpResponseMessage> getResponse = httpClient.PostAsync(uri, content); 
        HttpResponseMessage response = await getResponse; 
        responseStr = await response.Content.ReadAsStringAsync(); 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine("Error verifying receipt: " + e.Message); 
       } 
      } 
     } 

     return responseStr; 
    } 

Bí mật chia sẻ là không cần thiết cho việc mua bán dựa không đăng ký.

Các vấn đề liên quan