react-native-billing-verifier
Version:
InAppPurchases verifier for ReactNative applications
54 lines (40 loc) • 1.3 kB
JavaScript
import jsrsasign from 'jsrsasign';
import base64 from 'base-64';
export default function verify(transaction, publicKeyStr) {
return new Promise(function (resolve, reject) {
var sig = new jsrsasign.KJUR.crypto.Signature({ alg: 'SHA1withRSA' }),
key = jsrsasign.KEYUTIL.getKey(formatPublicKey(publicKeyStr));
sig.init(key);
sig.updateString(transaction.receiptData);
if (sig.verify(base64toHEX(transaction.receiptSignature))) {
resolve(transaction);
}
else {
let err = new Error('Purchase or subscribe is not verified');
err.transactionDetails = transaction;
reject(err);
}
});
}
function formatPublicKey(publicKeyStr) {
var chunkSize = 64,
chunks = [],
s = publicKeyStr;
while (s) {
chunks.push(s.substr(0, chunkSize));
s = s.substr(chunkSize);
}
s = chunks.join('\n');
s = '-----BEGIN PUBLIC KEY-----\n' + s + '\n-----END PUBLIC KEY-----';
return s;
};
function base64toHEX(s) {
var raw = base64.decode(s),
h,
res = '';
for (var i = 0; i < raw.length; i++) {
h = raw.charCodeAt(i).toString(16);
res += h.length == 2 ? h : '0' + h;
}
return res.toUpperCase();
}