wechat_controller.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Ellisran
  6. * @date 2020/7/2
  7. * @version
  8. */
  9. const moment = require('moment');
  10. // const Controller = require('egg').Controller;
  11. const crypto = require('crypto');
  12. const maintainConst = require('../const/maintain');
  13. const wxConst = require('../const/wechat_template.js');
  14. const smsTypeConst = require('../const/sms_type');
  15. module.exports = app => {
  16. class WechatController extends app.BaseController {
  17. /**
  18. * 接入微信
  19. *
  20. * @param {Object} ctx - egg全局页面
  21. * @return {void}
  22. */
  23. async index(ctx) {
  24. try {
  25. const signature = ctx.query.signature;
  26. const timestamp = ctx.query.timestamp;
  27. const nonce = ctx.query.nonce;
  28. const echostr = ctx.query.echostr;
  29. const array = [ctx.app.config.wechatAll.token, timestamp, nonce];
  30. array.sort();
  31. const tempStr = array.join('');
  32. const hashCode = crypto.createHash('sha1');
  33. const resultCode = hashCode.update(tempStr, 'utf8').digest('hex');
  34. if (resultCode === signature) {
  35. ctx.body = echostr;
  36. // res.send(echostr);
  37. } else {
  38. throw '验证失败';
  39. }
  40. } catch (e) {
  41. console.log(e);
  42. }
  43. }
  44. /**
  45. * 微信登录验证
  46. *
  47. * @param {Object} ctx - egg全局页面
  48. * @return {void}
  49. */
  50. async oauth(ctx) {
  51. const redirect_uri = ctx.query.redirect_uri;
  52. const url = await app.wechat.oauth.getAuthorizeURL(redirect_uri, '', 'snsapi_userinfo');
  53. ctx.redirect(url);
  54. }
  55. /**
  56. * 绑定页面
  57. *
  58. * @param {Object} ctx - egg全局页面
  59. * @return {void}
  60. */
  61. async bind(ctx) {
  62. try {
  63. const user = await app.wechat.oauth.getUser(ctx.session.wechatToken.openid);
  64. const errorMessage = ctx.session.loginError;
  65. // 显示完删除
  66. ctx.session.loginError = null;
  67. // 获取系统维护信息
  68. const maintainData = await ctx.service.maintain.getDataById(1);
  69. const renderData = {
  70. maintainData,
  71. maintainConst,
  72. errorMessage,
  73. user,
  74. };
  75. await ctx.render('wechat/bind.ejs', renderData);
  76. } catch (e) {
  77. const renderData = {
  78. status: 1,
  79. msg: e,
  80. };
  81. await ctx.render('wechat/tips.ejs', renderData);
  82. }
  83. }
  84. async bindwx(ctx) {
  85. try {
  86. const result = await ctx.service.projectAccount.accountCheck(ctx.request.body);
  87. if (!result) {
  88. throw '用户名或密码错误';
  89. }
  90. if (result === 2) {
  91. throw '该账号已被停用,请联系销售人员';
  92. }
  93. const accountData = result;
  94. if (accountData.wx_openid || ctx.session.wechatToken.openid === accountData.wx_openid) {
  95. throw '该账号已经绑定过微信';
  96. }
  97. const wxAccountData = await ctx.service.projectAccount.getDataByCondition({ project_id: accountData.project_id, wx_openid: ctx.session.wechatToken.openid });
  98. if (wxAccountData) {
  99. throw '该微信号已绑定过本项目账号';
  100. }
  101. const user = await app.wechat.api.getUser(ctx.session.wechatToken.openid);
  102. if (user.subscribe === 0) {
  103. throw '先关注公众号才能绑定项目';
  104. }
  105. const result2 = await ctx.service.projectAccount.bindWx(accountData.id, ctx.session.wechatToken.openid, user.nickname, user.unionid);
  106. if (!result2) {
  107. throw '绑定失败';
  108. }
  109. const projectData = await ctx.service.project.getDataById(accountData.project_id);
  110. // 绑定成功通知
  111. const templateId = 'JGJeWU2FT4syWKUE5haEf3iiqaRJ1XrsxY1PKixqLpw';
  112. const url = '';
  113. const msgData = {
  114. first: {
  115. value: '您好,纵横云计量与微信绑定成功。',
  116. },
  117. keyword1: {
  118. value: projectData.code,
  119. },
  120. keyword2: {
  121. value: accountData.account,
  122. },
  123. keyword3: {
  124. value: moment(new Date()).format('YYYY-MM-DD'),
  125. },
  126. remark: {
  127. value: '感谢您的使用。',
  128. },
  129. };
  130. await app.wechat.api.sendTemplate(ctx.session.wechatToken.openid, templateId, url, '', msgData);
  131. const renderData = {
  132. status: 0,
  133. msg: '绑定成功',
  134. };
  135. await ctx.render('wechat/tips.ejs', renderData);
  136. } catch (error) {
  137. this.log(error);
  138. ctx.session.loginError = error;
  139. ctx.redirect('/wx/bind');
  140. }
  141. }
  142. // 设置用户微信登录项目,跳转到对应wap页面
  143. async url2wap(ctx) {
  144. try {
  145. if (!ctx.query.project || !ctx.query.url) {
  146. throw '参数有误';
  147. }
  148. const code = ctx.query.project;
  149. // 查找项目数据
  150. const projectData = await ctx.service.project.getProjectByCode(code.toString().trim());
  151. if (projectData === null) {
  152. throw '不存在项目数据';
  153. }
  154. const pa = await ctx.service.projectAccount.getDataByCondition({ project_id: projectData.id, wx_openid: ctx.session.wechatToken.openid });
  155. if (!pa) {
  156. throw '该微信号未绑定此项目';
  157. }
  158. if (pa.enable !== 1) {
  159. throw '该账号已被停用,请联系销售人员';
  160. }
  161. // 设置项目和用户session记录
  162. const result = await ctx.service.projectAccount.accountLogin({ project: projectData, accountData: pa }, 3);
  163. if (!result) {
  164. throw '登录出错';
  165. }
  166. ctx.redirect(ctx.query.url);
  167. } catch (error) {
  168. const renderData = {
  169. status: 1,
  170. msg: error,
  171. };
  172. await ctx.render('wechat/tips.ejs', renderData);
  173. }
  174. }
  175. async project(ctx) {
  176. try {
  177. // const user = await app.wechat.oauth.getUser(ctx.session.wechatToken.openid);
  178. const openid = ctx.session.wechatToken.openid;
  179. // const openid = 'fasdfklahsdklf';
  180. const paList = await ctx.service.projectAccount.getAllDataByCondition({ where: { wx_openid: openid } });
  181. const pidList = ctx.app._.uniq(ctx.app._.map(paList, 'project_id'));
  182. const pList = [];
  183. const redirect_url = ctx.protocol + '://' + ctx.host + '/wap/dashboard';
  184. for (const p of pidList) {
  185. const pro = await ctx.service.project.getDataById(p);
  186. pList.push(pro);
  187. }
  188. if (pList.length === 0) {
  189. throw '该微信号未绑定任何项目';
  190. }
  191. // 获取系统维护信息
  192. const maintainData = await ctx.service.maintain.getDataById(1);
  193. const renderData = {
  194. maintainData,
  195. maintainConst,
  196. // user,
  197. pList,
  198. redirect_url,
  199. };
  200. // ctx.body = renderData;
  201. await ctx.render('wechat/project.ejs', renderData);
  202. } catch (e) {
  203. const renderData = {
  204. status: 1,
  205. msg: e,
  206. };
  207. await ctx.render('wechat/tips.ejs', renderData);
  208. }
  209. }
  210. async oauthTxt(ctx) {
  211. ctx.body = 't3MkWAMqplVxPjmr';
  212. }
  213. async testwx(ctx) {
  214. try {
  215. const sck = 'https://scn.ink/';
  216. // 微信模板通知
  217. const tender = {
  218. data: {
  219. name: 'XXX标段',
  220. },
  221. info: {
  222. deal_info: {
  223. buildName: 'XX项目',
  224. },
  225. },
  226. };
  227. ctx.tender = tender;
  228. const stageInfo = await ctx.service.stage.getDataById(1704);
  229. const shenpiUrl = await ctx.helper.urlToShort(ctx.protocol + '://' + ctx.host + '/wap/tender/1998/stage/' + stageInfo.order);
  230. const wechatData = {
  231. wap_url: sck + shenpiUrl,
  232. qi: stageInfo.order,
  233. status: wxConst.status.success,
  234. tips: wxConst.tips.success,
  235. code: 'P1002',
  236. };
  237. // ctx.body = { tender, wechatData };
  238. await ctx.helper.sendWechat(133, smsTypeConst.const.JL, smsTypeConst.judge.result.toString(), wxConst.template.stage, wechatData);
  239. ctx.body = 'success';
  240. } catch (error) {
  241. console.log(error);
  242. ctx.body = error;
  243. }
  244. }
  245. }
  246. return WechatController;
  247. };