'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, }; // ctx.body = renderData; await ctx.render('wechat/bind.ejs', renderData); } catch (e) { console.log(e); ctx.body = e; } } 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({ wx_openid: ctx.session.wechatToken.openid }); if (wxAccountData) { throw '该微信号已绑定过本项目账号'; } const user = await app.wechat.oauth.getUser(ctx.session.wechatToken.openid); const result2 = await ctx.service.projectAccount.bindWx(accountData.id, ctx.session.wechatToken.openid, user.nickname); if (!result2) { throw '绑定失败'; } const projectData = await ctx.service.project.getDataById(accountData.project_id); // 绑定成功通知 const templateId = 'ElT988uf7EV8ROPKSAX7z7tN9ZxZCDMaXK5ouc9N49E'; const url = ''; const msgData = { first: { value: '微信绑定成功', }, keyword1: { value: accountData.account, }, keyword2: { value: '项目编号' + projectData.code + ' 账号' + accountData.account + ' 绑定成功', }, remark: { value: '欢迎使用纵横云计量,我们竭诚为您服务。', }, }; await app.wechat.api.sendTemplate(ctx.session.wechatToken.openid, templateId, url, '', msgData); ctx.body = '绑定成功'; } 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) { console.log(error); ctx.body = error; } } 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; };