微信签名及jsSDK的使用

基于node.js的express框架

var https = require('https');
var fs = require('fs');
var path = require('path');
var sign = require(path.join(__dirname, 'sign'));
var _url = require('url');
var BufferHelper = require('bufferhelper');
var request = require("request");

exports.sendTMsg = function (appid, secret, body, fn) {
    this.weixinAccessToken(appid, secret, function (token) {
        var options = {
            method: 'POST',
            url: 'https://api.weixin.qq.com/cgi-bin/message/template/send',
            qs: { access_token: token },
            headers: {
                'cache-control': 'no-cache',
                'content-type': 'application/json'
            },
            body: body,
            json: true
        };

        request(options, function (error, response, body) {
            if (error) throw new Error(error);
            fn(null,body);
        });
    });
}

exports.weixinUserInfoByCode = function (appid, secret, code, fn) {
    var that = this;
    var options = {
        method: 'GET',
        url: 'https://api.weixin.qq.com/sns/oauth2/access_token',
        qs: {
            appid: appid,
            secret: secret,
            code: code,
            grant_type: 'authorization_code'
        },
        headers: {
            'cache-control': 'no-cache'
        }
    };
    request(options, function (error, response, body) {
        if (error) throw new Error(error);
        body = JSON.parse(body);
        var openid = body.openid;
        var token = body.access_token;
        console.log('weixinUserInfoByCode', openid, token, body);
        // that.userInfo(appid, secret, openid, fn);
        that.userInfoCommon(appid, secret, token, openid, fn);
    });
};

/**
 * 通用获取用户信息,未关注用户也可获取
 * @param appid
 * @param secret
 * @param token
 * @param openid
 * @param fn
 */
exports.userInfoCommon = function (appid, secret, token, openid, fn) {

    var options = {
        method: 'GET',
        url: 'https://api.weixin.qq.com/sns/userinfo',
        qs: { access_token: token, openid: openid, lang: 'zh_CN' },
        headers: {
            'cache-control': 'no-cache'
        }
    };

    request(options, function (error, response, body) {
        if (error) throw new Error(error);
        console.log('userInfoCommon', body);
        fn(null, JSON.parse(body));
    });
};

/**
 *
 * @param url
 * @param filename
 * @param fn
 */
exports.downloadFile = function (res, path, filename, fn) {
    res.download(path, filename, fn);
};

/**
 * 创建二维码
 * @param appid
 * @param secret
 * @param scene_str
 * @param expire_seconds
 * @param fn
 */
exports.createQrCode = function (appid, secret, scene_str, expire_seconds, fn) {
    var that = this;
    var data = {};
    if (expire_seconds) {
        data = {
            "expire_seconds": expire_seconds,
            "action_name": "QR_SCENE",
            "action_info": { "scene": { "scene_id": scene_str } }
        };
    } else {
        data = { "action_name": "QR_LIMIT_STR_SCENE", "action_info": { "scene": { "scene_str": scene_str } } };
    }
    this.weixinAccessToken(appid, secret, function (token) {
        // that.requestRawAppJson('https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=' + token, data, 15000, function (err, result) {
        //     if (!err) {
        //         fn(err, JSON.parse(result));
        //     } else {
        //         fn(err, null);
        //     }
        // });
        var options = {
            method: 'POST',
            url: 'https://api.weixin.qq.com/cgi-bin/qrcode/create',
            qs: { access_token: token },
            headers: {
                'cache-control': 'no-cache',
                'content-type': 'application/json'
            },
            body: {
                action_name: 'QR_LIMIT_STR_SCENE',
                action_info: { scene: { scene_str: '18612233895' } }
            },
            json: true
        };

        request(options, function (error, response, body) {
            if (error) throw new Error(error);

            fn(null, body);
        });
    });
};


/**
 * 获取用户基本信息
 * @param appid
 * @param secret
 * @param fn
 */
exports.userInfo = function (appid, secret, openid, fn) {
    this.weixinAccessToken(appid, secret, function (token) {
        https.get('https://api.weixin.qq.com/cgi-bin/user/info?access_token=' + token + '&openid=' + openid + '&lang=zh_CN', function (result) {
            var user_info = '';
            result.setEncoding('utf8');
            result.on('data', function (data) {
                user_info += data;
            });
            result.on('end', function () {
                user_info = JSON.parse(user_info);
                fn(user_info);
            });
        });
    });
};

/**
 * 获取微信API调用的apiTicket
 * @param appid
 * @param secret
 * @param fn
 */
exports.weixinTicket = function (appid, secret, fn) {
    var ticket_json = path.join(__dirname, 'ticket.json');
    var data = JSON.parse(fs.readFileSync(ticket_json));
    console.log(data, 'ticket.json');
    if ((data.expire_time * 1) < ((new Date().getTime()) * 1)) {
        this.weixinAccessToken(appid, secret, function (token) {
            https.get('https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=' + token, function (apiTicket) {
                apiTicket.on('data', function (ticket) {
                    ticket = JSON.parse(ticket);
                    fs.writeFile(ticket_json, JSON.stringify({
                        "ticket": ticket.ticket,
                        "expire_time": (new Date().getTime() + 7000 * 1000)
                    }, null, 4), function (err) {
                    });
                    fn(ticket.ticket);
                });
            });
        });
    } else {
        fn(data.ticket);
    }
};

/**
 * 获取微信AccessToken
 * @param appid
 * @param secret
 * @param fn 返回TOKEN
 */
exports.weixinAccessToken = function (appid, secret, fn) {
    var access_token_json = path.join(__dirname, 'access_token.json');
    var data = JSON.parse(fs.readFileSync(access_token_json));
    if ((data.expire_time * 1) < ((new Date().getTime()) * 1)) {
        https.get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + appid + '&secret=' + secret, function (accessToken) {
            accessToken.on('data', function (token) {
                token = JSON.parse(token);
                fs.writeFile(access_token_json, JSON.stringify({
                    "access_token": token.access_token,
                    "expire_time": (new Date().getTime() + 7000 * 1000)
                }, null, 4), function (err) {
                });
                fn(token.access_token);
            });
        });
    } else {
        fn(data.access_token);
    }
};

/**
 * 微信调用weixin.js认证签名
 * @param appid
 * @param secret
 * @param fn
 */
exports.weixinSign = function (appid, secret, url, title, desc, imgUrl, fn) {
    this.weixinTicket(appid, secret, function (ticket) {
        url = url.split('#')[0];
        sign.encrypt(ticket, url, function (sign_data) {
            var weixin = {
                //sign: sign_data.signature,
                config: "{debug: false,appId:'" + appid + "',timestamp: '" + sign_data.timestamp + "',nonceStr: '" + sign_data.nonceStr + "',signature: '" + sign_data.signature + "',jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline']}",
                onMenuShareTimeline: "{title: '" + title + "',  link: '" + url + "', imgUrl: '" + imgUrl + "',success: function () {},cancel: function () {}}",
                onMenuShareAppMessage: "{title: '" + title + "', desc: '" + desc + "', link: '" + url + "', imgUrl: '" + imgUrl + "', type: 'link', dataUrl: '',success: function () {},cancel: function () {}}"
            };
            fn(weixin);
        });
    });
};

// 扫一扫签名 ops:{obj},{functionName:"func"}
exports.weixinScaningSigin = function (appid, secret, url,ops,fn) {
    this.weixinTicket(appid, secret, function (ticket) {
        url = url.split('#')[0];
        sign.encrypt(ticket, url, function (sign_data) {
            let config = {
                debug:false,
                appId:appid,
                timestamp:sign_data.timestamp,
                nonceStr:sign_data.nonceStr,
                signature:sign_data.signature,
                jsApiList:['scanQRCode' ]
            }

            let scanQRCode = {
                needResult:1,
                scanType:['qrCode','barCode'],
                success:function (res) {
                    ops.functionName(res)
                }
            };
            let weixin = {
                //sign: sign_data.signature,
                config: JSON.stringify(config),
                // scanQRCode:JSON.stringify(scanQRCode)
                scanQRCode: "{"
                +"needResult: 1," // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
                +"scanType: [\"qrCode\",\"barCode\"]," // 可以指定扫二维码还是一维码,默认二者都有
                +"success: function (res) {"
                +""+ops.functionName+"(res);"
                +"}}"
            };
            fn(weixin);
        });

    })
}


exports.http_request = function (url, json) {
    var json = json || {};
    json.data = json.data || {};
    json.method = json.method || 'GET';
    json.headers = json.headers || {};
    json.headers['Content-Type'] = 'application/json';
    //json.headers['http']='multipart/form-data';
    // json.headers['Authorization'] = 'Bearer ' + token;

    var postData = JSON.stringify(json.data);//从json对象中解析出字符串
    //请求参数
    var options = {
        host: url,
        //path   : '/HYT9101/zsyy9101' + json.path,
        path: json.path,
        method: json.method,
        headers: json.headers
    };
    //发送请求
    var req = https.request(options, function (res) {
        var chunks = '';
        var size = 0;
        res.setEncoding('utf8');//设置返回内容的编码
        //存储返回的响应数据
        res.on('data', function (chunk) {
            chunks += chunk;
            size += chunk.length;
        });
        res.on('end', function () {
            //响应完成,获取完整响应数据
            //var data = JSON.parse(Buffer.concat(chunks, size).toString());
            if (typeof json.callback == 'function')
                json.callback(chunks);
        });
    });
    //请求错误时执行的方法
    req.on('error', function (e) {
        console.log('problem with request: ' + e.message);
    });

    // write data to request body
    req.write(postData);//请求体
    req.end();//请求结束
};

exports.requestRawAppJson = function (api, params, timeout, callback, method) {
    method = !method ? 'POST' : method;
    // if (api.indexOf('http') == -1) {
    //     api = this.SERVER_DEFAULT + api;
    // }
    try {
        //将method转为大写
        method = method.toUpperCase();
        //效验method
        if (!method) {
            throw new Error('method is invalid');
        }

        //效验timeout
        if (parseInt(timeout) !== timeout || timeout < 1) {
            timeout = 15000;
        }

        //var builder = new xml2js.Builder();
        //var xml = "" + encodeURIComponent(builder.buildObject(params) + "");
        var xml = JSON.stringify(params);
        // xml = xml.replace(/\"/g,'\\\"');
        var urlParams = _url.parse(api);
        var host = urlParams.hostname;
        var path = urlParams.path;
        var port = urlParams.port ? urlParams.port : 80;
        var requestOption = {
            host: host,
            port: port,
            path: path,
            method: method,
            headers: {
                'Content-Type': 'application/json',//'application/json; charset=utf-8' ,
                // 'Content-Length': Buffer.byteLength(xml)
            }
        };

    } catch (e) {
        return typeof callback === 'function' && callback(e, null);
    }
    //Modify by Hinbor 20150702 http.request处理回传数据的标准写法
    var req = https.request(requestOption, function (res) {
        res.setEncoding('utf8');
        var bufferHelper = new BufferHelper();
        res.on('data', function (data) {
            bufferHelper.concat(data.toString());
        }).on('end', function () {
            //Add by Hinbor 20150702注意标准的调用方法中写法是这样的bufferHelper.toBuffers.toString(),这种方式是错误的
            // var jsonObj = bufferHelper.buffers.toString();
            var jsonObj = bufferHelper.buffers.join('');
            typeof callback === 'function' && callback(null, jsonObj);
        });
    });

    req.on('error', function (e) {
        typeof callback === 'function' && callback(e, null);
    });

    req.write(xml);

    req.setTimeout(timeout, function () {
        req.abort();
    });

    req.end();
};

exports.request_common = function (params, url, method, fn) {
    var options = {
        method: method,
        url: url,//'https://api.weixin.qq.com/cgi-bin/qrcode/create',
        // qs     : {access_token: token},
        headers: {
            'cache-control': 'no-cache',
            'content-type': 'application/json'
        },
        body: params,
        json: true,
    };
    request(options, function (error, response, body) {
        if (error) body = 'error';
        fn(body);
    });
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值