Пример #1
0
function send(access_token, openid, type, obj) {

    let data = {
        touser: openid,
        msgtype: type
    };
    data[type] = obj;

    console.log('send', data, access_token);

    let resp = co.yield(fetch(`https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=${access_token}`, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(data)
    }));

    if (resp.ok) {
        let ret = co.yield(resp.json());
        if (ret.errcode) {
            throw {message: ret.errmsg, errno: ret.errcode}
        }
    } else {
        throw {message: 'errno ' + resp.status, errno: resp.status}
    }
}
Пример #2
0
export function getUserInfo(access_token, openid) {
    let resp = co.yield(fetch(`https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${openid}&lang=zh_CN`));

    if (resp.ok) {
        return co.yield(resp.json());
    } else {
        throw {message: 'errno ' + resp.status, errno: resp.status}
    }
}
Пример #3
0
export function getBaseInfo(name, code) {
    let receiver = receivers[name];

    let resp = co.yield(fetch(`https://api.weixin.qq.com/sns/oauth2/access_token?appid=${receiver.appid
        }&secret=${receiver.secret}&code=${code}&grant_type=authorization_code`));

    if (resp.ok) {
        return co.yield(resp.json());
    } else {
        throw {message: 'errno ' + resp.status, errno: resp.status}
    }
}
Пример #4
0
export function getJsPayConfig(name, openid, remote_ip, order_id, body, price, notify_url) {
    //console.log('getJsPayConfig', arguments);

    let receiver = receivers[name];

    let nonceStr = Math.random().toString(36).substr(2, 6);
    let params = {
        appid: {TEXT: receiver.appid},
        body: {TEXT: body, CDATA: true},
        device_info: {TEXT: 'WEB'},
        mch_id: {TEXT: receiver.mch_id},
        nonce_str: {TEXT: nonceStr},
        notify_url: {TEXT: notify_url},
        openid: {TEXT: openid},
        out_trade_no: {TEXT: order_id},
        spbill_create_ip: {TEXT: remote_ip},
        total_fee: {TEXT: (price * 100 | 0)},
        trade_type: {TEXT: 'JSAPI'}
    };

    let signature = pay_signature(params, receiver.mch_key);

    params.sign = {TEXT: signature};

    let payload = build(params);
    let resp = co.yield(fetch(`https://api.mch.weixin.qq.com/pay/unifiedorder`, {
        method: 'POST',
        body: payload
    }));

    let respData = getPayResult(name, resp);

    let now = Date.now();
    let ts = now / 1000 | 0;
    let signStr = `appId=${receiver.appid}&nonceStr=${nonceStr}&package=prepay_id=${respData.prepay_id.TEXT}&signType=MD5&timeStamp=${ts}&key=${receiver.mch_key}`;
    info(`created js pay config: order:${order_id} price:${price} ip:${remote_ip} openid:${openid}`);
    return {
        timestamp: ts, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
        nonceStr: nonceStr, // 支付签名随机串,不长于 32 位
        'package': 'prepay_id=' + respData.prepay_id.TEXT, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
        signType: 'MD5', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
        paySign: md5(signStr, 'hex').toUpperCase() // 支付签名
    }
}
Пример #5
0
export function getClientAccessToken(name) {
    let receiver = receivers[name];
    let now = Date.now();

    if (cachedToken.expires < now) {
        let resp = co.yield(fetch(`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${receiver.appid
            }&secret=${receiver.secret}`));
        if (resp.ok) {
            let ret = co.yield(resp.json());
            if (ret.errcode) {
                throw {message: ret.errmsg, errno: ret.errcode}
            }
            cachedToken = {
                access_token: ret.access_token,
                expires: now + ret.expires_in * 1000 - 3000
            };
        } else {
            throw {message: 'errno ' + resp.status, errno: resp.status}
        }
    }
    return cachedToken.access_token;

}
Пример #6
0
export function getJsConfig(name, url) {
    let now = Date.now();
    let receiver = receivers[name];

    if (cachedTicket.expires < now) {
        console.log('acquire new ticket');
        let access_token = getClientAccessToken(name);
        let resp = co.yield(fetch(`https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${access_token}&type=jsapi`));
        if (resp.ok) {
            let ret = co.yield(resp.json());
            if (ret.errcode) {
                throw {message: ret.errmsg, errno: ret.errcode}
            }
            cachedTicket = {
                ticket: ret.ticket,
                expires: now + ret.expires_in * 1000 - 3000
            };
        } else {
            throw {message: 'errno ' + resp.status, errno: resp.status}
        }
    }


    let ts = now / 1000 | 0;
    let nonceStr = Math.random().toString(36).substr(2, 6);
    let signStr = `jsapi_ticket=${cachedTicket.ticket}&noncestr=${nonceStr}&timestamp=${ts}&url=${url}`;
    console.log('jsapi sign', signStr);
    let signature = sha1(signStr, 'hex');

    return {
        appId: receiver.appid,
        timestamp: ts,
        nonceStr: nonceStr,
        signature: signature,
        jsApiList: ['chooseWXPay']
    }
}