wechat-api
Version:
微信公共平台Node库 API
769 lines (723 loc) • 22.9 kB
JavaScript
'use strict';
var path = require('path');
var fs = require('fs');
var formstream = require('formstream');
var util = require('./util');
var wrapper = util.wrapper;
var postJSON = util.postJSON;
var make = util.make;
/**
* 上传Logo
* Examples:
* ```
* api.uploadLogo('filepath', callback);
* ```
* Callback:
*
* - `err`, 调用失败时得到的异常
* - `result`, 调用正常时得到的对象
*
* Result:
* ```
* {
* "errcode":0,
* "errmsg":"ok",
* "url":"http://mmbiz.qpic.cn/mmbiz/iaL1LJM1mF9aRKPZJkmG8xXhiaHqkKSVMMWeN3hLut7X7hicFNjakmxibMLGWpXrEXB33367o7zHN0CwngnQY7zb7g/0"
* }
* ```
*
* @name uploadLogo
* @param {String} filepath 文件路径
* @param {Function} callback 回调函数
*/
make(exports, 'uploadLogo', function (filepath, callback) {
var that = this;
fs.stat(filepath, function (err, stat) {
if (err) {
return callback(err);
}
var form = formstream();
form.file('buffer', filepath, path.basename(filepath), stat.size);
var url = that.fileServerPrefix + 'media/uploadimg?access_token=' + that.token.accessToken;
var opts = {
dataType: 'json',
type: 'POST',
timeout: 60000, // 60秒超时
headers: form.headers(),
stream: form
};
that.request(url, opts, wrapper(callback));
});
});
/**
* @name addLocations
* @param {Array} locations 位置
* @param {Function} callback 回调函数
*/
make(exports, 'addLocations', function (locations, callback) {
var data = {
location_list: locations
};
var url = this.endpoint + '/card/location/batchadd?access_token=' + this.token.accessToken;
this.request(url, postJSON(data), wrapper(callback));
});
make(exports, 'getLocations', function (offset, count, callback) {
var data = {
offset: offset,
count: count
};
var url = this.endpoint + '/card/location/batchget?access_token=' + this.token.accessToken;
this.request(url, postJSON(data), wrapper(callback));
});
make(exports, 'getColors', function (callback) {
var url = this.endpoint + '/card/getcolors?access_token=' + this.token.accessToken;
this.request(url, {dataType: 'json'}, wrapper(callback));
});
make(exports, 'createCard', function (card, callback) {
var url = this.endpoint + '/card/create?access_token=' + this.token.accessToken;
var data = {card: card};
this.request(url, postJSON(data), wrapper(callback));
});
exports.getRedirectUrl = function (url, encryptCode, cardId) {
// TODO
};
make(exports, 'createQRCode', function (card, callback) {
var url = this.endpoint + '/card/qrcode/create?access_token=' + this.token.accessToken;
var data = {
action_name: 'QR_CARD',
action_info: {
card: card
}
};
this.request(url, postJSON(data), wrapper(callback));
});
/**
* 创建用于投放的卡卷二维码,支持投放单张卡卷和多张卡卷
* Examples:
* ```
* api.createCardQRCode('info', 'expire_seconds', callback);
* ```
* Callback:
*
* - `err`, 调用失败时得到的异常
* - `result`, 调用正常时得到的对象
*
* Result:
* ```
* {
* "errcode": 0,
* "errmsg": "ok",
* "ticket": "gQHB8DoAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL0JIV3lhX3psZmlvSDZmWGVMMTZvAAIEsNnKVQMEIAMAAA==",//获取ticket后需调用换取二维码接口获取二维码图片,详情见字段说明。
* "expire_seconds": 1800,
* "url": "http://weixin.qq.com/q/BHWya_zlfioH6fXeL16o ",
* "show_qrcode_url": " https://mp.weixin.qq.com/cgi-bin/showqrcode? ticket=gQH98DoAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL0czVzRlSWpsamlyM2plWTNKVktvAAIE6SfgVQMEgDPhAQ%3D%3D"
* }
* ```
*
* @name createCardQRCode
* @param {Object} info 卡卷信息,支持单张和多张模式
* 二维码投放单张卡卷
* ```
* {
* "expire_seconds": 1800,
* "card": {
* "card_id": "pAtUNs1c3cBtMs5KeL8FP1f3fOaE"
* }
* }
* ```
* ```
* 二维码投放多张卡卷
* {
* "expire_seconds": 1800,
* "multiple_card": {
* "card_list": [
* {
* "card_id": "pAtUNs-HV0evhGTWbU3ohp99tW7k"
* },
* {
* "card_id": "pAtUNs1c3cBtMs5KeL8FP1f3fOaE"
* }
* ]
* }
* }
* @param {number} expire_seconds 二维码的有效时间,范围是60 ~ 1800秒。不填默认为永久有效。
* @param {Function} callback 回调函数
*/
make(exports, 'createCardQRCode', function (info, expire_seconds, callback) {
if(typeof expire_seconds === 'function') {
callback = expire_seconds;
expire_seconds = null;
}
var url = this.endpoint + '/card/qrcode/create?access_token=' + this.token.accessToken;
var data = {
action_name: 'QR_'+Object.keys(info)[0].toUpperCase(),
expire_seconds: expire_seconds,
action_info: info
};
this.request(url, postJSON(data), wrapper(callback));
});
make(exports, 'consumeCode', function (code, cardId, callback) {
var url = this.endpoint + '/card/code/consume?access_token=' + this.token.accessToken;
var data = {
code: code,
card_id: cardId
};
this.request(url, postJSON(data), wrapper(callback));
});
make(exports, 'decryptCode', function (encryptCode, callback) {
var url = this.endpoint + '/card/code/decrypt?access_token=' + this.token.accessToken;
var data = {
encrypt_code: encryptCode
};
this.request(url, postJSON(data), wrapper(callback));
});
make(exports, 'deleteCard', function (cardId, callback) {
var url = this.endpoint + '/card/delete?access_token=' + this.token.accessToken;
var data = {
card_id: cardId
};
this.request(url, postJSON(data), wrapper(callback));
});
make(exports, 'getCode', function (code, cardId, callback) {
var url = this.endpoint + '/card/code/get?access_token=' + this.token.accessToken;
var data = {
code: code
};
if (typeof cardId !== 'function') {
data.card_id = cardId;
} else {
callback = cardId;
}
this.request(url, postJSON(data), wrapper(callback));
});
make(exports, 'getCards', function (offset, count, status_list, callback) {
var url = this.endpoint + '/card/batchget?access_token=' + this.token.accessToken;
var data = {
offset: offset,
count: count
};
if (typeof status_list !== 'function') {
data.status_list = status_list;
} else {
callback = status_list;
}
this.request(url, postJSON(data), wrapper(callback));
});
make(exports, 'getCard', function (cardId, callback) {
var url = this.endpoint + '/card/get?access_token=' + this.token.accessToken;
var data = {
card_id: cardId
};
this.request(url, postJSON(data), wrapper(callback));
});
make(exports, 'updateCode', function (code, cardId, newcode, callback) {
var url = this.endpoint + '/card/code/update?access_token=' + this.token.accessToken;
var data = {
code: code,
card_id: cardId,
newcode: newcode
};
this.request(url, postJSON(data), wrapper(callback));
});
make(exports, 'unavailableCode', function (code, cardId, callback) {
var url = this.endpoint + '/card/code/unavailable?access_token=' + this.token.accessToken;
var data = {
code: code
};
if (typeof cardId !== 'function') {
data.card_id = cardId;
} else {
callback = cardId;
}
this.request(url, postJSON(data), wrapper(callback));
});
make(exports, 'updateCard', function (cardId, cardType, cardInfo, callback) {
var url = this.endpoint + '/card/update?access_token=' + this.token.accessToken;
var data = {
card_id: cardId
};
data[cardType.toLowerCase()] = cardInfo;
this.request(url, postJSON(data), wrapper(callback));
});
make(exports, 'updateCardStock', function (cardId, num, callback) {
var url = this.endpoint + '/card/modifystock?access_token=' + this.token.accessToken;
var data = {
card_id: cardId
};
if (num > 0) {
data.increase_stock_value = Math.abs(num);
} else {
data.reduce_stock_value = Math.abs(num);
}
this.request(url, postJSON(data), wrapper(callback));
});
make(exports, 'activateMembercard', function (info, callback) {
var url = this.endpoint + '/card/membercard/activate?access_token=' + this.token.accessToken;
this.request(url, postJSON(info), wrapper(callback));
});
/**
* 设置开卡字段接口
* ```
* Examples:
* ```
* api.activateMembercardUserForm(info, callback);
*
* ```
* Callback:
*
* - `err`, 调用失败时得到的异常
* - `result`, 调用正常时得到的对象
*
* Result:
* ```
* {
* "errcode":0,
* "errmsg":"ok"
* }
* ```
*
* @name activateMembercardUserForm
* @param {Object} info 参数
* @param {Function} callback 回调函数
*/
make(exports, 'activateMembercardUserForm', function (info, callback) {
var url = this.endpoint + '/card/membercard/activateuserform/set?access_token=' + this.token.accessToken;
this.request(url, postJSON(info), wrapper(callback));
});
make(exports, 'getMembercard', function (info, callback) {
var url = this.endpoint + '/card/membercard/userinfo/get?access_token=' + this.token.accessToken;
this.request(url, postJSON(info), wrapper(callback));
});
make(exports, 'updateMembercard', function (info, callback) {
var url = this.endpoint + '/card/membercard/updateuser?access_token=' + this.token.accessToken;
this.request(url, postJSON(info), wrapper(callback));
});
make(exports, 'updateMovieTicket', function (info, callback) {
var url = this.endpoint + '/card/movieticket/updateuser?access_token=' + this.token.accessToken;
this.request(url, postJSON(info), wrapper(callback));
});
make(exports, 'checkInBoardingPass', function (info, callback) {
var url = this.endpoint + '/card/boardingpass/checkin?access_token=' + this.token.accessToken;
this.request(url, postJSON(info), wrapper(callback));
});
make(exports, 'updateLuckyMonkeyBalance', function (code, cardId, balance, callback) {
var url = this.endpoint + '/card/luckymonkey/updateuserbalance?access_token=' + this.token.accessToken;
var data = {
'code': code,
'card_id': cardId,
'balance': balance
};
this.request(url, postJSON(data), wrapper(callback));
});
make(exports, 'updateMeetingTicket', function (info, callback) {
var url = this.endpoint + '/card/meetingticket/updateuser?access_token=' + this.token.accessToken;
this.request(url, postJSON(info), wrapper(callback));
});
make(exports, 'setTestWhitelist', function (info, callback) {
var url = this.endpoint + '/card/testwhitelist/set?access_token=' + this.token.accessToken;
this.request(url, postJSON(info), wrapper(callback));
});
/**
* 导入code接口
* 接口说明
* 开发者可调用该接口将自定义code导入微信卡券后台,由微信侧代理存储并下发code,本接口仅用于支持自定义code的卡券参与互通。
* code:
* ```
* [
* "11111",
* "22222",
* "33333"
* ]
* ```
* Examples:
* ```
* api.importCustomizedCodes('cardId', code, callback);
*
* ```
* Callback:
*
* - `err`, 调用失败时得到的异常
* - `result`, 调用正常时得到的对象
*
* Result:
* ```
* {
* "errcode":0,
* "errmsg":"ok"
* }
* ```
*
* @name importCustomizedCodes
* @param {String} cardId 卡券ID
* @param {Array} code 待导入自定义code
* @param {Function} callback 回调函数
*/
make(exports, 'importCustomizedCodes', function (cardId, code, callback) {
var url = this.endpoint + '/card/code/deposit?access_token=' + this.token.accessToken;
var data = {
'card_id': cardId,
'code': code
};
this.request(url, postJSON(data), wrapper(callback));
});
/**
* 核查code接口
* 接口说明
* 支持开发者调用该接口查询code导入微信后台的情况。
* code:
* ```
* [
* "11111",
* "22222",
* "33333"
* ]
* ```
* Examples:
* ```
* api.checkCustomizedCodes('cardId', code, callback);
* ```
* Callback:
*
* - `err`, 调用失败时得到的异常
* - `result`, 调用正常时得到的对象
*
* Result:
* ```
* {
* "errcode":0,
* "errmsg":"ok",
* "exist_code":["11111","22222"],
* "not_exist_code":["33333"]
* }
* ```
*
* @name checkCustomizedCodes
* @param {String} cardId 卡券ID
* @param {Array} code 待核查自定义code
* @param {Function} callback 回调函数
*/
make(exports, 'checkCustomizedCodes', function (cardId, code, callback) {
var url = this.endpoint + '/card/code/checkcode?access_token=' + this.token.accessToken;
var data = {
'card_id': cardId,
'code': code
};
this.request(url, postJSON(data), wrapper(callback));
});
/**
* 查询导入code数目接口
* 接口说明
* 支持开发者调用该接口查询code导入微信后台成功的数目。
* Examples:
* ```
* api.getDepositCodesCount('cardId', callback);
* ```
* Callback:
*
* - `err`, 调用失败时得到的异常
* - `result`, 调用正常时得到的对象
*
* Result:
* ```
* {
* "errcode":0,
* "errmsg":"ok",
* "count":123
* }
* ```
*
* @name getDepositCodesCount
* @param {String} cardId 卡券ID
* @param {Function} callback 回调函数
*/
make(exports, 'getDepositCodesCount', function (cardId, callback) {
var url = this.endpoint + '/card/code/getdepositcount?access_token=' + this.token.accessToken;
var data = {
'card_id': cardId
};
this.request(url, postJSON(data), wrapper(callback));
});
/**
* 拉取卡券概况数据
* @param {String} beginDate 开始时间
* @param {String} endDate 结束时间(结束时间不能为当天,不然会报错,可设为昨天)
* @param {int} source 卡券来源,0为公众平台创建的卡券数据、1是API创建的卡券数据
*/
make(exports, 'getTotalCardDataInfo', function (beginDate, endDate, source, callback) {
var url = this.endpoint + '/datacube/getcardbizuininfo?access_token=' + this.token.accessToken;
var data = {
'begin_date': beginDate,
'end_date': endDate,
'cond_source': source
};
this.request(url, postJSON(data), wrapper(callback));
});
/**
* 获取免费券数据
* @param {String} cardId cardId 卡券ID
* @param {String} beginDate 开始时间
* @param {String} endDate 结束时间(结束时间不能为当天,不然会报错,可设为昨天)
* @param {int} source 卡券来源,0为公众平台创建的卡券数据、1是API创建的卡券数据
*/
make(exports, 'getCardDataInfo', function (cardId, beginDate, endDate, source, callback) {
var url = this.endpoint + '/datacube/getcardcardinfo?access_token=' + this.token.accessToken;
var data = {
'begin_date': beginDate,
'end_date': endDate,
'cond_source': source,
'card_id': cardId
};
this.request(url, postJSON(data), wrapper(callback));
});
/**
* 设置商户的核销员
* 接口说明
* 开发者需调用该接口设置商户的核销员,并指定核销员的门店。
* Examples:
* ```
* api.addConsumer('username', 'locationId', callback);
* ```
* Callback:
*
* - `err`, 调用失败时得到的异常
* - `result`, 调用正常时得到的对象
*
* Result:
* ```
* {
* "errcode":0,
* "errmsg":"ok"
* }
* ```
*
* @name addConsumer
* @param {String} username 店员的微信号,开发者须确认该微信号在设置之前已 经关注”卡券商户助手公众号“
* @param {String} locationId 当前核销员关联的门店值
* @param {Function} callback 回调函数
*/
make(exports, 'addConsumer', function (username, locationId, callback) {
var url = this.endpoint + '/card/consumer/add?access_token=' + this.token.accessToken;
var data = {
'username': username,
'is_super_consumer': true
};
if (locationId) {
data.location_id = locationId;
data.is_super_consumer = false;
}
this.request(url, postJSON(data), wrapper(callback));
});
/**
* 卡券开放类目查询接口
* 接口说明
* 通过调用该接口查询卡券开放的类目ID,类目会随业务发展变更,请每次用接口去查询获取实时卡券类目。
* 注意:
* 1. 本接口查询的返回值还有卡券资质ID,此处的卡券资质为:已微信认证的公众号通过微信公众平台申请卡券功能时,所需的资质。
* 2.对于第三方开发者代制(无公众号)模式,子商户无论选择什么类目,均暂不需按照此返回提供资质,返回值仅参考类目ID 即可。
* Examples:
* ```
* api.getApplyProtocol(callback);
* ```
* Callback:
*
* - `err`, 调用失败时得到的异常
* - `result`, 调用正常时得到的对象
*
* Result:
* ```
* {
* "category": [
* {
* "primary_category_id": 1,
* "category_name": "美食",
* "secondary_category": [
* {
* "secondary_category_id": 101,
* "category_name": "粤菜",
* "need_qualification_stuffs": [
* "food_service_license_id",
* "food_service_license_bizmedia_id"
* ],
* "can_choose_prepaid_card": 1,
* "can_choose_payment_card": 1
* },
* }
* ],
* "errcode":0,
* "errmsg":"ok"
* }
* ```
*
* @name getApplyProtocol
* @param {Object} options 子商户相关资料
* @param {Function} callback 回调函数
*/
make(exports, 'getApplyProtocol', function (callback) {
var url = this.endpoint + '/card/getapplyprotocol?access_token=' + this.token.accessToken;
this.request(url, {dataType: 'json'}, wrapper(callback));
});
/**
* 创建子商户接口
* 接口说明
* 支持母商户调用该接口传入子商户的相关资料,并获取子商户ID,用于子商户的卡券功能管理。
* 子商户的资质包括:商户名称、商户logo(图片)、卡券类目、授权函(扫描件或彩照)、授权函有效期截止时间。
* Examples:
* ```
* api.submitSubmerchant(options, callback);
* ```
* options:
* {
* "brand_name": "aaaaaa",
* "app_id":"xxxxxxxxxxx",
* "logo_url": "http://mmbiz.xxxx",
* "protocol": "xxxxxxxxxx",
* "agreement_media_id":"xxxxxxxxxx",
* "operator_media_id":"xxxxxxxx",
* "end_time": 1438990559,
* "primary_category_id": 1,
* "secondary_category_id": 101
* }
*
* Callback:
*
* - `err`, 调用失败时得到的异常
* - `result`, 调用正常时得到的对象
*
* @name submitSubmerchant
* @param {Object} options 子商户相关资料
* @param {Function} callback 回调函数
*/
make(exports, 'submitSubmerchant', function (options, callback) {
var url = this.endpoint + '/card/submerchant/submit?access_token=' + this.token.accessToken;
var data = {
'info': options
};
this.request(url, postJSON(data), wrapper(callback));
});
/**
* 更新子商户接口
* 接口说明
* 支持调用该接口更新子商户信息。
* Examples:
* ```
* api.updateSubmerchant(options, callback);
* ```
* options:
* {
* "merchant_id": 12,
* "brand_name": "aaaaaa",
* "app_id":"xxxxxxxxxxx",
* "logo_url": "http://mmbiz.xxxx",
* "protocol": "xxxxxxxxxx",
* "agreement_media_id":"xxxxxxxxxx",
* "operator_media_id":"xxxxxxxx",
* "end_time": 1438990559,
* "primary_category_id": 1,
* "secondary_category_id": 101
* }
*
* Callback:
*
* - `err`, 调用失败时得到的异常
* - `result`, 调用正常时得到的对象
*
* @name updateSubmerchant
* @param {Object} options 子商户相关资料
* @param {Function} callback 回调函数
*/
make(exports, 'updateSubmerchant', function (options, callback) {
var url = this.endpoint + '/card/submerchant/update?access_token=' + this.token.accessToken;
var data = {
'info': options
};
this.request(url, postJSON(data), wrapper(callback));
});
/**
* 拉取单个子商户信息接口
* 接口说明
* 通过指定的子商户merchant_id,拉取该子商户的基础信息。
* 注意,用母商户去调用接口,但接口内传入的是子商户的merchant_id。
* Examples:
* ```
* api.getSubmerchant('merchantId', callback);
* ```
* Callback:
*
* - `err`, 调用失败时得到的异常
* - `result`, 调用正常时得到的对象
*
* @name getSubmerchant
* @param {String} merchantId 子商户相关资料
* @param {Function} callback 回调函数
*/
make(exports, 'getSubmerchant', function (merchantId, callback) {
var url = this.endpoint + '/card/submerchant/get?access_token=' + this.token.accessToken;
var data = {
'merchant_id': merchantId
};
this.request(url, postJSON(data), wrapper(callback));
});
/**
* 批量拉取子商户信息接口
* 接口说明
* 母商户可以通过该接口批量拉取子商户的相关信息,一次调用最多拉取100个子商户的信息,可以通过多次拉去满足不同的查询需求
* Examples:
* ```
* api.batchgetSubmerchant(data, callback);
* ```
* Callback:
*
* - `err`, 调用失败时得到的异常
* - `result`, 调用正常时得到的对象
*
* @name batchgetSubmerchant
* @param {Object} data 查询条件 {"begin_id": 0,"limit": 50,"status": "CHECKING"}
* @param {Function} callback 回调函数
*/
make(exports, 'batchgetSubmerchant', function (data, callback) {
var url = this.endpoint + '/card/submerchant/batchget?access_token=' + this.token.accessToken;
this.request(url, postJSON(data), wrapper(callback));
});
/**
* 拉取拉取会员信息接口
* 接口说明
* 支持开发者根据CardID和Code查询会员信息。
* Examples:
* ```
* api.getMemberCardUserInfo({"card_id": abd5e78412e5d12ff,"code": 5566778811002233}, callback);
* ```
* Callback:
*
* - `err`, 调用失败时得到的异常
* - `result`, 调用正常时得到的对象
*
* @name getMemberCardUserInfo
* @param {Object} info 查询条件 {"card_id": abd5e78412e5d12ff,"code": 5566778811002233}
* @param {Function} callback 回调函数
*/
make(exports, 'getMemberCardUserInfo', function (info, callback) {
var url = this.endpoint + '/card/membercard/userinfo/get?access_token=' + this.token.accessToken;
var data = info;
this.request(url, postJSON(data), wrapper(callback));
});
/**
* 更新会员信息
* 接口说明
* 当会员持卡消费后,支持开发者调用该接口更新会员信息。会员卡交易后的每次信息变更需通过该接口通知微信,便于后续消息通知及其他扩展功能。
* Examples:
* ```
* api.updateMemberCardUserInfo(data, callback);
* ```
* Callback:
*
* - `err`, 调用失败时得到的异常
* - `result`, 调用正常时得到的对象
*
* @name getMemberCardUserInfo
* @param {Object} data 查询条件 {"card_id": abd5e78412e5d12ff,"code": 5566778811002233, "record_bonus" : 3000}
* @param {Function} callback 回调函数
*/
make(exports, 'updateMemberCardUserInfo', function (data, callback) {
var url = this.endpoint + '/card/membercard/updateuser?access_token=' + this.token.accessToken;
this.request(url, postJSON(data), wrapper(callback));
});