You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
4.4 KiB
113 lines
4.4 KiB
'use strict';
|
|
const request = require('superagent');
|
|
const moment = require('moment')
|
|
let wechatExpires = {//企业微信access_token过期
|
|
accessToken: null,
|
|
expire: null
|
|
}
|
|
//相应的
|
|
const WechatApi = {
|
|
getAccessToken: '/gettoken',//获取企业微信token相当于鉴权
|
|
getUserId: '/user/getuserid',//根据电话号码查询企业用户id
|
|
postSendMesg: '/message/send',//发送信息
|
|
|
|
}
|
|
const sendType = {
|
|
'mini': 'miniprogram_notice',
|
|
}
|
|
|
|
module.exports = function (app, opts) {
|
|
const getGetToken = async (opts) => {
|
|
console.log(`wechatInfo , accessToken:${wechatExpires && wechatExpires.accessToken}, expire: ${wechatExpires && wechatExpires.expire}`)
|
|
/**if access_token超时,重新请求 */
|
|
if (wechatExpires && wechatExpires.accessToken && wechatExpires.expire && moment(wechatExpires.expire).isSameOrAfter(moment())) {
|
|
return true;
|
|
} else {
|
|
const { reqUrl, corpid, corpsecret } = opts.weChat || {};
|
|
console.log('Wechat getAccessToken:', moment());
|
|
const accessToken = await request.get(`${reqUrl}${WechatApi.getAccessToken}?corpid=${corpid}&corpsecret=${corpsecret}`);
|
|
// const accessToken = await ctx.app.business.request.get(`${reqUrl}${WechatApi.getAccessToken}?corpid=${corpid}&corpsecret=${corpsecret}`);
|
|
const { errmsg, access_token, expires_in } = accessToken && accessToken.body;
|
|
if ('ok' != errmsg) {
|
|
console.log('请求企业微信鉴权失败')
|
|
} else {
|
|
wechatExpires = {
|
|
accessToken: access_token,
|
|
expire: moment().add(expires_in - 600, 's').format('YYYY-MM-DD HH:mm:ss')
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
//获取用户id
|
|
const getUserId = async (opts, phoneNum) => {
|
|
console.log(`info: getGetToken--start-- `)
|
|
await getGetToken(opts)
|
|
console.log(`info: getGetToken--end-- `)
|
|
const res = await request.post(`${opts.weChat.reqUrl}${WechatApi.getUserId}?access_token=${wechatExpires.accessToken}`, { mobile: phoneNum })
|
|
if(res.body.errmsg==='ok'){
|
|
return res.body.userid
|
|
|
|
}else{
|
|
return null
|
|
}
|
|
|
|
}
|
|
//发送超期提醒消息
|
|
async function sendWechat({ opts, data, msgtype = sendType["mini"], exDep = '' }) {
|
|
let rslt={}
|
|
console.log(`info: sendMesg--enter-- `);
|
|
try {
|
|
const { touser } = data;
|
|
if (touser && touser.length) {
|
|
let sendData = {};
|
|
if (sendType["mini"] == msgtype) {//小程序通知
|
|
const { appid } = opts.weChat || {};
|
|
const { userId, content, url, title, description, noDescription = false } = data;
|
|
sendData = {
|
|
"touser": touser.join("|"),
|
|
"msgtype": "miniprogram_notice",
|
|
"miniprogram_notice": {
|
|
"appid": appid,
|
|
"page": `${url ? url : 'package/approvalCenter/approvalCenter'}?userId=${userId}&msgRet=${true}`,
|
|
"title": title || "超期提醒",
|
|
"description": description || "详情如下,请您尽快处理",
|
|
"content_item": content
|
|
}
|
|
}
|
|
if (noDescription) {
|
|
delete sendData.miniprogram_notice.description;
|
|
}
|
|
}
|
|
console.log(`info: getGetToken--start-- `)
|
|
await getGetToken(opts)
|
|
console.log(`info: getGetToken--end-- `)
|
|
/**
|
|
* 返回示例
|
|
* {"errcode" : 0,
|
|
"errmsg" : "ok",
|
|
"invaliduser" : ["userid1","userid2","CorpId1/userid1","CorpId2/userid2"], // 不区分大小写,返回的列表都统一转为小写
|
|
"invalidparty" : ["partyid1","partyid2","LinkedId1/partyid1","LinkedId2/partyid2"],
|
|
"invalidtag":["tagid1","tagid2"]
|
|
}
|
|
*
|
|
*/
|
|
rslt = await request.post(`${opts.weChat.reqUrl}${WechatApi.postSendMesg}?access_token=${wechatExpires.accessToken}`, sendData)
|
|
console.log(`info: WechatApi.postSendMesg----end-- `)
|
|
return rslt
|
|
} else {
|
|
console.log('缺少参数,请检查')
|
|
return rslt
|
|
}
|
|
} catch (err) {
|
|
console.log('发送消息失败', err && err.message)
|
|
}
|
|
}
|
|
|
|
return {
|
|
getGetToken,
|
|
getUserId,
|
|
sendWechat
|
|
}
|
|
}
|