diff --git a/src/modules/user/entity/info.ts b/src/modules/user/entity/info.ts index 44048f0..df34eed 100644 --- a/src/modules/user/entity/info.ts +++ b/src/modules/user/entity/info.ts @@ -26,6 +26,9 @@ export class UserInfoEntity extends BaseEntity { @Column({ comment: '状态 0-禁用 1-正常', default: 1 }) status: number; - @Column({ comment: '登录方式 0-小程序 1-公众号 2-H5', default: 0 }) + @Column({ comment: '登录方式 0-小程序 1-公众号 2-H5 3-APP', default: 0 }) loginType: number; + + @Column({ comment: '标签,多个标签按“,”隔开', nullable: true }) + labels: string; } diff --git a/src/modules/user/service/login.ts b/src/modules/user/service/login.ts index c8b36b9..58f5b5f 100644 --- a/src/modules/user/service/login.ts +++ b/src/modules/user/service/login.ts @@ -99,11 +99,12 @@ export class UserLoginService extends BaseService { ); return this.wxLoginToken(wxUserInfo); } else { - throw new Error('微信登录失败'); + throw new CoolCommException('微信登录失败'); } } /** +<<<<<<< HEAD * 保存微信信息 * @param wxUserInfo * @param type @@ -120,6 +121,19 @@ export class UserLoginService extends BaseService { type, }); return wxUserInfo; +======= + * 保存/更新 微信信息(根据微信规则,用户头像昵称无法在此获取,需要通过chooseAvatar进行获取) + * @param wxUserInfo 微信里的用户信息 + * @returns + */ + async saveWxInfo(wxUserInfo) { + const wxInfo = await this.userWxEntity.findOneBy({ openid: wxUserInfo.openid }); + if (!wxInfo) { + await this.userWxEntity.insert(wxInfo); + } + await this.userWxEntity.save(Object.assign(wxInfo, wxUserInfo)); + return wxInfo; +>>>>>>> 6a9a421c61366184f92aea3f742a577d944d2879 } /** @@ -135,21 +149,28 @@ export class UserLoginService extends BaseService { iv ); if (wxUserInfo) { +<<<<<<< HEAD // 保存 wxUserInfo = await this.saveWxInfo(wxUserInfo, 0); return await this.wxLoginToken(wxUserInfo); +======= + wxUserInfo = await this.saveWxInfo(wxUserInfo); + return this.wxLoginToken(wxUserInfo, 0); +>>>>>>> 6a9a421c61366184f92aea3f742a577d944d2879 } } /** * 微信登录 获得token * @param wxUserInfo 微信用户信息 + * @param loginType 登录方式 0-小程序 1-公众号 2-H5 * @returns */ - async wxLoginToken(wxUserInfo) { + async wxLoginToken(wxUserInfo, loginType) { const unionid = wxUserInfo.unionid ? wxUserInfo.unionid : wxUserInfo.openid; - let userInfo: any = await this.userInfoEntity.findOneBy({ unionid }); + let userInfo: UserInfoEntity = await this.userInfoEntity.findOneBy({ unionid }); if (!userInfo) { +<<<<<<< HEAD const avatarUrl = await this.file.downAndUpload( wxUserInfo.avatarUrl, uuid() + '.png' @@ -183,7 +204,22 @@ export class UserLoginService extends BaseService { throw new CoolCommException( '刷新token失败,请检查refreshToken是否正确或过期' ); +======= + userInfo = new UserInfoEntity(); + Object.assign(userInfo, { + unionid, + loginType, + ...wxUserInfo + }); + await this.userInfoEntity.insert(userInfo); +>>>>>>> 6a9a421c61366184f92aea3f742a577d944d2879 } + if (userInfo.status === 0) { + throw new CoolCommException('您已违规被禁用'); + } + // 更新登录时间 + await this.userInfoEntity.save(Object.assign(userInfo, wxUserInfo)); + return this.token({ userId: userInfo.id }); } /** diff --git a/src/modules/user/service/wx.ts b/src/modules/user/service/wx.ts index 2d2ec87..46ab3a4 100644 --- a/src/modules/user/service/wx.ts +++ b/src/modules/user/service/wx.ts @@ -2,6 +2,10 @@ import { Config, Provide } from '@midwayjs/decorator'; import { BaseService, CoolCommException } from '@cool-midway/core'; import axios from 'axios'; import * as crypto from 'crypto'; +import * as _ from 'lodash'; + +// 微信请求域名 +const wxBaseUrl = 'https://api.weixin.qq.com'; /** * 微信 @@ -26,9 +30,8 @@ export class UserWxService extends BaseService { * @param secret */ public async getWxToken(type = 'mp') { - //@ts-ignore const conf = this.config.wx[type]; - return await axios.get('https://api.weixin.qq.com/cgi-bin/token', { + return await axios.get(wxBaseUrl + '/cgi-bin/token', { params: { grant_type: 'client_credential', appid: conf.appid, @@ -43,7 +46,7 @@ export class UserWxService extends BaseService { */ async openOrMpUserInfo(token) { return await axios - .get('https://api.weixin.qq.com/sns/userinfo', { + .get(wxBaseUrl + '/sns/userinfo', { params: { access_token: token.access_token, openid: token.openid, @@ -56,13 +59,13 @@ export class UserWxService extends BaseService { } /** - * 获得token嗯 + * 获得token * @param code * @param conf */ async openOrMpToken(code, conf) { const result = await axios.get( - 'https://api.weixin.qq.com/sns/oauth2/access_token', + wxBaseUrl + '/sns/oauth2/access_token', { params: { appid: conf.appid, @@ -83,7 +86,7 @@ export class UserWxService extends BaseService { async miniSession(code) { const { appid, secret } = this.config.wx.mini; const result = await axios.get( - 'https://api.weixin.qq.com/sns/jscode2session', + wxBaseUrl + '/sns/jscode2session', { params: { appid, @@ -113,15 +116,10 @@ export class UserWxService extends BaseService { iv, session.session_key ); - if (info) { - delete info['watermark']; - return { - ...info, - openid: session['openid'], - unionid: session['unionid'], - }; - } - return null; + delete info['watermark']; + info.openid = session['openid']; + info.unionid = session['unionid']; + return _.pickBy({ ...info }); } /** @@ -149,17 +147,11 @@ export class UserWxService extends BaseService { encryptedData = Buffer.from(encryptedData, 'base64'); iv = Buffer.from(iv, 'base64'); try { - // 解密 const decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv); - // 设置自动 padding 为 true,删除填充补位 decipher.setAutoPadding(true); - // @ts-ignore let decoded = decipher.update(encryptedData, 'binary', 'utf8'); - // @ts-ignore decoded += decipher.final('utf8'); - // @ts-ignore - decoded = JSON.parse(decoded); - return decoded; + return JSON.parse(decoded); } catch (err) { throw new CoolCommException('获得信息失败'); }