验证收据失败错误:无法使用Node.js验证购买

时间:2019-01-18 09:21:16

标签: javascript ios node.js in-app-purchase web-deployment

我正在尝试设置一个node.js服务器以验证来自AppStore connect的应用购买中的收据。我遵循了这个https://github.com/voltrue2/in-app-purchase库,但是收到错误消息,提示我的收据未定义,failed to validate receipt也未定义。我在这里做错任何事。我仍在本地服务器上进行测试。我希望它能够正常运行,然后再将其托管在Heroku上。我在这里怎么办?

const iap = require('in-app-purchase');

iap.config({
  applePassword: 'MySecretKey',
  test: true
});

iap.setup()
  .then(() => {
    iap.validateOnce(receipt, appleSecretString).then(onSuccess).catch(onError);
  })
    .catch((error) => {
    if (error) {
        console.log('Validation error' + error);
    }
});

iap.validate(iap.APPLE, function (error, appleResponse) {
  console.log(iap.APPLE);
  if (error) {
    console.log('Failed to validate receipt' + error);
  }
  if (iap.isValidated(appleResponse)) {
    console.log('Validation successful');
  }
});

这是日志

  
    

iapserver:服务器侦听端口3000 + 0ms     验证错误ReferenceError:收据未定义     苹果     无法验证收据错误:无法验证购买

  

1 个答案:

答案 0 :(得分:0)

从该错误看来,您实际上并未将收据文件传递到validateOnce函数中。在该代码运行之前的某个地方,您需要设置:

const receipt = req.query.receipt;

并通过以下方式调用您的API:

http://localhost:3000/verifyReceipt?receipt=<YOUR_RECEIPT_DATA>

您可以预先手动verify your receipt以确保其有效。

将所有内容放在一起,您将得到类似的东西:

var express = require('express');
var app = express();

const iap = require('in-app-purchase');


app.get('/verifyReceipt', function(req, res){

  const receipt = req.query.receipt;

  iap.config({
    applePassword: 'MySecretKey',
    test: true
  });

  iap.setup()
    .then(() => {
      iap.validateOnce(receipt, appleSecretString).then(onSuccess).catch(onError);
    })
      .catch((error) => {
      if (error) {
          console.log('Validation error' + error);
          res.status(400).send({valid: false});
      }
  });

  iap.validate(iap.APPLE, function (error, appleResponse) {
    console.log(iap.APPLE);
    if (error) {
      console.log('Failed to validate receipt' + error);
      res.status(400).send({valid: false});
    }
    if (iap.isValidated(appleResponse)) {
      console.log('Validation successful');
      res.status(200).send({valid: true});
    }
  });
});

app.listen(3000);

请注意,这只会在购买时验证收据,如果您要实施订阅,则还需要定期刷新收据以确保其用户未取消。这是有关实现订阅的良好指南:iOS Subscriptions are Hard