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} } }
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} } }
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} } }
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() // 支付签名 } }
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; }
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}×tamp=${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'] } }