NPM : https://github.com/voltrue2/in-app-purchase
var iap = require('in-app-purchase'); iap.config({ //verbose: true, //googlePublicKeyStrSandbox: "", //LIVE 먼저 실행하고 에러나면 SandBox 테스트실행함 googlePublicKeyStrLive: "MIIBIj............", }); iap.setup(function (error) { if (error) { console.log(error); } var googleReceipt = { "data":'{"packageName":"kr.co.test","productId":"kr.co.test.is1","purchaseTime":155435321, "purchaseState":0,"purchaseToken":"oksdf........"}', //{stringified data object} "signature": "qSVwa8E9z........." }; iap.validate(iap.GOOGLE, googleReceipt, function (error, response) { if (error) { console.log(error); } console.log(iap.isValidated(response)); }); });
유니티에서 받는 데이터 중 GoogleReceipt data 값 어떤 걸로 넣는지 찾는데 삽질 2시간 OTL.......
Hash 검증 로직 : node_modules\in-app-purchase\lib\google.js 참고
function validatePublicKey(receipt, pkey, cb) { if (!receipt || !receipt.data) { return cb(new Error('missing receipt data')); } if (!pkey) { return cb(new Error('missing public key')); } if (typeof receipt.data !== 'string') { return cb(new Error('receipt.data must be a string')); } var validater = crypto.createVerify('SHA1'); var valid; validater.update(receipt.data); try { valid = validater.verify(pkey, receipt.signature, 'base64'); } catch (error) { return cb(error); } if (valid) { // validated successfully var data = JSON.parse(receipt.data); data.status = constants.VALIDATION.SUCCESS; return cb(null, data); } // failed to validate cb(new Error('failed to validate purchase')); }
GooglePublicKey는 해당 어플리케이션 들어가서 확인