12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- // iOS 充值校验
- var https = require('https');
- var events = require('events');
- var util = require('util');
- var iOS = function(sandbox) {
- this.emitter = new events.EventEmitter(this);
- if (sandbox) {
- this.url = 'sandbox.itunes.apple.com';
- } else {
- this.url = 'buy.itunes.apple.com';
- }
- }
- var parse = function(emitter, status, receipt) {
- if (status != 0) {
- var message;
- if (status == 21000) {
- message = "App Store无法读取你提供的JSON数据(21000)";
- } else if (status == 21002) {
- message = "收据数据不符合格式(21002)";
- } else if (status == 21003) {
- message = "收据无法被验证(21003)";
- } else if (status == 21004) {
- message = "你提供的共享密钥和账户的共享密钥不一致(21004)";
- } else if (status == 21005) {
- message = "收据服务器当前不可用(21005)";
- } else if (status == 21006) {
- message = "收据是有效的,但订阅服务已经过期(21006)";
- } else if (status == 21007) {
- message = "收据信息是测试用(sandbox),但却被发送到产品环境中验证(21007)";
- } else if (status == 21008) {
- message = "收据信息是产品环境中使用,但却被发送到测试环境中验证(21008)";
- } else {
- message = "未知状态码(" + status + ")";
- }
- emitter.emit('error', new Error(message))
- return;
- }
- var in_app = receipt.in_app
- var length = in_app.length
- for (var i=0; i< length; ++i) {
- var order = in_app[i]
- if (order && order.product_id) {
- emitter.emit('progress', order, i, length);
- }
- }
- }
- iOS.prototype.verify = function(receipt) {
- var bytes = JSON.stringify({"receipt-data":receipt});
- var options = {
- hostname: this.url,
- port: 443,
- path: '/verifyReceipt',
- method: 'POST',
- headers: {
- 'Content-Type': 'Application/json',
- 'Content-Length':bytes.length
- }
- };
- var emitter = this.emitter
- var req = https.request(options, function (res){
- var byteArray = [];
- var size = 0;
- res.on('data', function (data){
- byteArray.push(data);
- size += data.length;
- });
- res.on('end', function (){
- var buf = Buffer.concat(datas, size);
- var content = JSON.parse(buf.toString())
- parse(emitter, content.status, content.receipt)
- });
- res.on('error', function (err) {
- emitter.emit('fault', err)
- });
- }).on('error', function(err){
- emitter.emit('fault', err)
- });
- req.write(bytes);
- req.end();
- return this
- }
- iOS.prototype.on = function(eventName, callback) {
- this.emitter.on(eventName, callback);
- return this
- }
- util.inherits(iOS, events.EventEmitter); //继承
- module.exports = iOS
|