| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 | 'use strict';/** * * * @author Ellisran * @date 2020/7/2 * @version */const moment = require('moment');// const Controller = require('egg').Controller;const crypto = require('crypto');const maintainConst = require('../const/maintain');const wxConst = require('../const/wechat_template.js');const smsTypeConst = require('../const/sms_type');module.exports = app => {    class WechatController extends app.BaseController {        /**         * 接入微信         *         * @param {Object} ctx - egg全局页面         * @return {void}         */        async index(ctx) {            try {                const signature = ctx.query.signature;                const timestamp = ctx.query.timestamp;                const nonce = ctx.query.nonce;                const echostr = ctx.query.echostr;                const array = [ctx.app.config.wechatAll.token, timestamp, nonce];                array.sort();                const tempStr = array.join('');                const hashCode = crypto.createHash('sha1');                const resultCode = hashCode.update(tempStr, 'utf8').digest('hex');                if (resultCode === signature) {                    ctx.body = echostr;                    // res.send(echostr);                } else {                    throw '验证失败';                }            } catch (e) {                console.log(e);            }        }        /**         * 微信登录验证         *         * @param {Object} ctx - egg全局页面         * @return {void}         */        async oauth(ctx) {            const redirect_uri = ctx.query.redirect_uri;            const url = await app.wechat.oauth.getAuthorizeURL(redirect_uri, '', 'snsapi_userinfo');            ctx.redirect(url);        }        /**         * 绑定页面         *         * @param {Object} ctx - egg全局页面         * @return {void}         */        async bind(ctx) {            try {                const user = await app.wechat.oauth.getUser(ctx.session.wechatToken.openid);                const errorMessage = ctx.session.loginError;                // 显示完删除                ctx.session.loginError = null;                // 获取系统维护信息                const maintainData = await ctx.service.maintain.getDataById(1);                const renderData = {                    maintainData,                    maintainConst,                    errorMessage,                    user,                };                await ctx.render('wechat/bind.ejs', renderData);            } catch (e) {                const renderData = {                    status: 1,                    msg: e,                };                await ctx.render('wechat/tips.ejs', renderData);            }        }        async bindwx(ctx) {            try {                const result = await ctx.service.projectAccount.accountCheck(ctx.request.body);                if (!result) {                    throw '用户名或密码错误';                }                if (result === 2) {                    throw '该账号已被停用,请联系销售人员';                }                const accountData = result;                if (accountData.wx_openid || ctx.session.wechatToken.openid === accountData.wx_openid) {                    throw '该账号已经绑定过微信';                }                const wxAccountData = await ctx.service.projectAccount.getDataByCondition({ project_id: accountData.project_id, wx_openid: ctx.session.wechatToken.openid });                if (wxAccountData) {                    throw '该微信号已绑定过本项目账号';                }                const user = await app.wechat.api.getUser(ctx.session.wechatToken.openid);                if (user.subscribe === 0) {                    throw '先关注公众号才能绑定项目';                }                const result2 = await ctx.service.projectAccount.bindWx(accountData.id, ctx.session.wechatToken.openid, user.nickname, user.unionid);                if (!result2) {                    throw '绑定失败';                }                const projectData = await ctx.service.project.getDataById(accountData.project_id);                // 绑定成功通知                const templateId = 'JGJeWU2FT4syWKUE5haEf3iiqaRJ1XrsxY1PKixqLpw';                const url = '';                const msgData = {                    first: {                        value: '您好,纵横云计量与微信绑定成功。',                    },                    keyword1: {                        value: projectData.code,                    },                    keyword2: {                        value: accountData.account,                    },                    keyword3: {                        value: moment(new Date()).format('YYYY-MM-DD'),                    },                    remark: {                        value: '感谢您的使用。',                    },                };                await app.wechat.api.sendTemplate(ctx.session.wechatToken.openid, templateId, url, '', msgData);                const renderData = {                    status: 0,                    msg: '绑定成功',                };                await ctx.render('wechat/tips.ejs', renderData);            } catch (error) {                this.log(error);                ctx.session.loginError = error;                ctx.redirect('/wx/bind');            }        }        // 设置用户微信登录项目,跳转到对应wap页面        async url2wap(ctx) {            try {                if (!ctx.query.project || !ctx.query.url) {                    throw '参数有误';                }                const code = ctx.query.project;                // 查找项目数据                const projectData = await ctx.service.project.getProjectByCode(code.toString().trim());                if (projectData === null) {                    throw '不存在项目数据';                }                const pa = await ctx.service.projectAccount.getDataByCondition({ project_id: projectData.id, wx_openid: ctx.session.wechatToken.openid });                if (!pa) {                    throw '该微信号未绑定此项目';                }                if (pa.enable !== 1) {                    throw '该账号已被停用,请联系销售人员';                }                // 设置项目和用户session记录                const result = await ctx.service.projectAccount.accountLogin({ project: projectData, accountData: pa }, 3);                if (!result) {                    throw '登录出错';                }                ctx.redirect(ctx.query.url);            } catch (error) {                const renderData = {                    status: 1,                    msg: error,                };                await ctx.render('wechat/tips.ejs', renderData);            }        }        async project(ctx) {            try {                // const user = await app.wechat.oauth.getUser(ctx.session.wechatToken.openid);                const openid = ctx.session.wechatToken.openid;                // const openid = 'fasdfklahsdklf';                const paList = await ctx.service.projectAccount.getAllDataByCondition({ where: { wx_openid: openid } });                const pidList = ctx.app._.uniq(ctx.app._.map(paList, 'project_id'));                const pList = [];                const redirect_url = ctx.protocol + '://' + ctx.host + '/wap/dashboard';                for (const p of pidList) {                    const pro = await ctx.service.project.getDataById(p);                    pList.push(pro);                }                if (pList.length === 0) {                    throw '该微信号未绑定任何项目';                }                // 获取系统维护信息                const maintainData = await ctx.service.maintain.getDataById(1);                const renderData = {                    maintainData,                    maintainConst,                    // user,                    pList,                    redirect_url,                };                // ctx.body = renderData;                await ctx.render('wechat/project.ejs', renderData);            } catch (e) {                const renderData = {                    status: 1,                    msg: e,                };                await ctx.render('wechat/tips.ejs', renderData);            }        }        async oauthTxt(ctx) {            ctx.body = 't3MkWAMqplVxPjmr';        }        async testwx(ctx) {            try {                const sck = 'https://scn.ink/';                // 微信模板通知                const tender = {                    data: {                        name: 'XXX标段',                    },                    info: {                        deal_info: {                            buildName: 'XX项目',                        },                    },                };                ctx.tender = tender;                const stageInfo = await ctx.service.stage.getDataById(1704);                const shenpiUrl = await ctx.helper.urlToShort(ctx.protocol + '://' + ctx.host + '/wap/tender/1998/stage/' + stageInfo.order);                const wechatData = {                    wap_url: sck + shenpiUrl,                    qi: stageInfo.order,                    status: wxConst.status.success,                    tips: wxConst.tips.success,                    code: 'P1002',                };                // ctx.body = { tender, wechatData };                await ctx.helper.sendWechat(133, smsTypeConst.const.JL, smsTypeConst.judge.result.toString(), wxConst.template.stage, wechatData);                ctx.body = 'success';            } catch (error) {                console.log(error);                ctx.body = error;            }        }    }    return WechatController;};
 |