2015-06-28 48 views
3

我正在开发一个使用Parse作为后端的iOS应用程序,并且用户使用Apple的自动续订订阅IAP进行订阅。在订阅和恢复购买功能期间,我将收据作为云代码函数中的参数传递,然后通过Parse将其发送到Apple的服务器,如this SO answer中所述。使用云代码验证自动续订订阅收据并更新Parse

我想解析HTTPResponse并使用JSON收据的expires_date属性更新Parse中的用户对象。我认为我的Cloud Code函数必须稍微偏离一点,因为我的控制台显示Result: TypeError: Cannot read property 'status' of undefined,这意味着HTTPResponse.data是未定义的(?)。我的功能如下,然后是控制台日志。

而且,我不是我是否应该使用receiptlatest_receipt,或latest_receipt_info用于访问expires_date产权清晰的100%,所以我在那里有一些额外的变量只是为了测试什么出来。

(感谢您的帮助,云代码是我曾经写过的唯一的JavaScript。)

Parse.Cloud.define('validateReceipt', function (request, response) { 
var user = request.user; 
var receiptAsBase64EncodedString = request.params.receiptData; 

var postData = { 
    method: 'POST', 
    url: 'https://sandbox.itunes.apple.com/verifyReceipt', 
    body: { 'receipt-data': receiptAsBase64EncodedString, 
      'password': 'SECRET' } 
} 

Parse.Cloud.httpRequest(postData).then(function (httpResponse) { 
    // httpResponse is a Parse.Cloud.HTTPResponse 

    var json = httpResponse.data; // Response body as a JavaScript object. 
    var validationStatus = json.status; // App Store validation status code. If 0, the receipt is valid, but may be expired 
    var receiptJSON = json.receipt; // Receipt data as a JSON object 
    var latestReceipt = json.latest_receipt; 
    var latestReceiptInfo = json.latest_receipt_info; 

    console.log('JSON: ' + json); 

    console.log('Latest Receipt Info: ' + latestReceiptInfo); 

    console.log('Validation status: ' + validationStatus); 

    var now = new Date().getTime(); 
    var expirationDate = latestReceiptInfo.expires_date; 
    console.log('Now: ' + now) 
    console.log('Expiration Date: ' + expirationDate) 


    if (expirationDate > now) { //updates expiration date 
     user.set("accountExpDate", expirationDate); 
     user.set("accountStatus", 1); 
     user.save(); 

     return response.success('Subscription Active, expiration date: ' + expirationDate); 

    } else { 
     user.set("accountStatus", 2); 
     user.save(); 

     return response.error('Subscription Expired, expiration date: ' + expirationDate); 
    } 
}) 

}); 

控制台登录

E2015-06-28T22:48:51.919Z]v138 Ran cloud function validateReceipt for user pvoG72hGuw with: 
Input: {"receiptData":"MII6bwYJKoZIhvcNAQcCoII6YDCCOlwCAQExCzAJBgUrDgMCGgUAMIIqIAYJKoZIhvcNAQcBoIIqEQSCKg0xgioJMAoCAQgCAQEEAhYAMAoCARQCAQEEAgwAMAsCAQECAQEEAwIBADALAgELAgEBBAMCAQAwCwIBDgIBAQQDAgFSMAsCAQ8CAQEEAwIBADALAgEQAgEBBAMCAQAwCwIBGQIBAQQDAgEDMAwCAQoCAQEEBBYCNCswDQIBAwIBAQQFDAMxLjAwDQIBDQIBAQQFAgMBOawwDQIBEwIBAQQFDAMxLjAwDgIBCQIBAQQGAgRQMjM0MBgCAQQCAQIEEB6oAGDFiz0t9OTppvGHMk4wGwIBAAIBAQQTDBFQcm9kdWN0aW9uU2FuZGJveDAcAgECAgEBBBQMEmNvLnByb3BlcmFwcHMuTG9mdDAcAgEFAgEBBBSFjiOc9pL+F1eDnK0S59Cv/fKyGDAeAgEMAgEBBBYWFDIwMTUtMDYtMjhUMjI6NDg6NDRaMB4CARICAQEEFhYUMjAxMy0wOC0wMVQwNzowMDowMFowRgIBBwIBAQQ+94xiArNdLTIUTMQebLCAxw5A6CJKxQPcT/kPPgN9TEatwcc63wvluCAiLWS9DM7CGrNUnGnPDou8MrAG3jkwRwIBBgIBAQQ/z23kkC0s7JavH... (truncated) 
Result: TypeError: Cannot read property 'status' of undefined 
at main.js:179:36 
at e (Parse.js:3:8736) 
at Parse.js:3:8185 
at Array.forEach (native) 
at Object.x.each.x.forEach [as _arrayEach] (Parse.js:1:661) 
at c.extend.resolve (Parse.js:3:8136) 
at Object.<anonymous> (<anonymous>:575:17) 

编辑

console.log(JSON.stringify(httpResponse, null, 4));给我

I2015-06-28T23:54:02.813Z]{ 
"uuid": "4ed0bfc8-b8c2-0815-e71c-a9b4c41e3a8d", 
"status": 200, 
"headers": { 
    "Date": "Sun, 28 Jun 2015 23:54:02 GMT", 
    "apple-timing-app": "6 ms", 
    "cache-control": "max-age=0", 
    "connection": "keep-alive", 
    "content-encoding": "gzip", 
    "content-length": "36", 
    "edge-control": "cache-maxage=0", 
    "expires": "Sun, 28 Jun 2015 23:54:02 GMT", 
    "itspod": "100", 
    "pod": "100", 
    "set-cookie": "mzf_dr=0; version=\"1\"; expires=Thu, 01-Jan-1970 00:00:00 GMT; path=/WebObjects; domain=.apple.com", 
    "x-apple-application-instance": "990263", 
    "x-apple-application-site": "SB", 
    "x-apple-jingle-correlation-key": "LTHOCJJYK6EOORRQRWZ6RNO6HU", 
    "x-apple-lokamai-no-cache": "true", 
    "x-apple-orig-url": "http://sandbox.itunes.apple.com/WebObjects/MZFinance.woa/wa/verifyReceipt", 
    "x-apple-translated-wo-url": "/WebObjects/MZFinance.woa/wa/verifyReceipt", 
... (truncated) 
+0

它看起来像var json = httpResponse.data;未定义 – messerbill

+0

是的,这就是它告诉我的,但我不明白为什么它是未定义的。 – blwinters

+0

尝试在控制台中打印httpResponse – messerbill

回答

1

试试这个:

var validationStatus = JSON.parse(httpResponse["text"])["status"]; 

解决这个问题对我来说。

相关问题