2013-10-25 72 views
2

經過幾天的努力,努力獲得某些東西來工作並且沒有獲得任何地方,我想知道是否有人在Node.js上獲得了iOS Receipt Validation。我試過節點模塊iap_verifier發現here,但我無法讓它爲我正常工作。我從蘋果服務器收到的唯一回復是21002,數據格式不正確。用Node.js驗證iOS收據

有一件事情對我來說是一個蘋果服務器的客戶端驗證請求,我直接從Apple here提供的教程中獲取,代碼如下所示。

// The transaction looks ok, so start the verify process. 

// Encode the receiptData for the itms receipt verification POST request. 
NSString *jsonObjectString = [self encodeBase64:(uint8_t *)transaction.transactionReceipt.bytes 
             length:transaction.transactionReceipt.length]; 

// Create the POST request payload. 
NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\", \"password\" : \"%@\"}", 
        jsonObjectString, ITC_CONTENT_PROVIDER_SHARED_SECRET]; 

NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding]; 


// Use ITMS_SANDBOX_VERIFY_RECEIPT_URL while testing against the sandbox. 
NSString *serverURL = ITMS_SANDBOX_VERIFY_RECEIPT_URL; 

// Create the POST request to the server. 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:serverURL]]; 
[request setHTTPMethod:@"POST"]; 
[request setHTTPBody:payloadData]; 
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
[conn start]; 

我有一堆不同的代碼,我一直在使用它來發送各種各樣的東西到我的節點服務器。而我所有的不同嘗試都失敗了。我甚至嘗試過漏斗的「payloadData」我構建了在客戶端驗證上面的例子到我的服務器併發送,爲蘋果服務器用下面的代碼:

function verifyReceipt(receiptData, responder) 
{ 

var options = { 
    host: 'sandbox.itunes.apple.com', 
    port: 443, 
    path: '/verifyReceipt', 
    method: 'POST', 
    headers: { 
     'Content-Type': 'application/x-www-form-urlencoded', 
     'Content-Length': Buffer.byteLength(receiptData) 
    } 
}; 

var req = https.request(options, function(res) { 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) { 
     console.log("body: " + chunk); 
    }); 
}); 

req.write(receiptData); 
req.end(); 
} 

當函數傳遞payloadData。從蘋果收到的迴應總是21002年。我仍然基本上是一個節點新手,所以我無法弄清楚究竟發生了什麼問題。我認爲當我將數據從ObjC發送到我的節點服務器時,可能會發生一些數據損壞情況,所以也許我沒有正確傳輸數據。

如果有人能指出我的方向是正確的,或者提供一些他們如何獲得收據驗證以便在節點中工作的例子,那將是一個很大的幫助。如果有人對iap_verifier模塊有任何經驗,以及它需要什麼數據,那將是非常棒的。我將提供我需要的任何代碼示例,因爲我現在已經爲這個過程奮戰了幾天。

謝謝!

+0

如果你有工作一個地方,爲什麼不記錄網絡流量和然後重複發生的事情? – WiredPrairie

+0

你有沒有得到這個工作!?如果是的話,你可以分享.. – Learn2Code

回答

3

您是否已經正確組合了receiptData?與蘋果規格Accordlying它的格式應爲

{"receipt-data": "your base64 receipt"} 

修改代碼包裹的base64收據字符串收據數據對象的驗證應該工作

function (receiptData_base64, production, cb) 
{ 
    var url = production ? 'buy.itunes.apple.com' : 'sandbox.itunes.apple.com' 
    var receiptEnvelope = { 
     "receipt-data": receiptData_base64 
    }; 
    var receiptEnvelopeStr = JSON.stringify(receiptEnvelope); 
    var options = { 
     host: url, 
     port: 443, 
     path: '/verifyReceipt', 
     method: 'POST', 
     headers: { 
      'Content-Type': 'application/x-www-form-urlencoded', 
      'Content-Length': Buffer.byteLength(receiptEnvelopeStr) 
     } 
    }; 

    var req = https.request(options, function(res) { 
     res.setEncoding('utf8'); 
     res.on('data', function (chunk) { 
      console.log("body: " + chunk); 
      cb(true, chunk); 
     }); 
     res.on('error', function (error) { 
      console.log("error: " + error); 
      cb(false, error); 
     }); 
    }); 
    req.write(receiptEnvelopeStr); 
    req.end(); 
} 
2

對於使用npm library "request"任何人,這裏是如何避免令人煩惱的21002錯誤。

formFields = { 
    'receipt-data': receiptData_64 
    'password': yourAppleSecret 
} 

verifyURL = 'https://buy.itunes.apple.com/verifyReceipt' // or 'https://sandbox.itunes.apple.com/verifyReceipt' 

req = request.post({url: verifyURL, json: formFields}, function(err, res, body) { 
    console.log('Response:', body); 
}) 
2

這是我使用npm request-promise庫自動更新訂閱的工作解決方案。 沒有JSON字符串化-ING的身體形態,我收到了21002錯誤(在接收數據屬性的數據格式不正確或缺失)

const rp = require('request-promise'); 

var verifyURL = 'https://sandbox.itunes.apple.com/verifyReceipt'; 
// use 'https://buy.itunes.apple.com/verifyReceipt' for production 

var options = { 
    uri: verifyURL, 
    method: 'POST', 
    headers: { 
     'User-Agent': 'Request-Promise', 
     'Content-Type': 'application/x-www-form-urlencoded', 
    }, 
    json: true 
}; 

options.form = JSON.stringify({ 
    'receipt-data': receiptData, 
    'password': password 
}); 

rp(options).then(function (resData) { 
    devLog.log(resData); // 0 
}).catch(function (err) { 
    devLog.log(err); 
});