diff --git a/.gitignore b/.gitignore index c3caea9..3cee0bb 100755 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ run/ .tsbuildinfo.* src/app/public/uploads/ typings/ +resource/.cache diff --git a/package.json b/package.json index 9fba214..170ab67 100755 --- a/package.json +++ b/package.json @@ -1,70 +1,72 @@ { - "name": "cool-admin", - "version": "3.0.0", - "description": "", - "private": true, - "dependencies": { - "@midwayjs/decorator": "^2.7.5", - "@midwayjs/orm": "^1.3.0", - "@midwayjs/web": "^2.7.7", - "egg": "^2.29.3", - "egg-scripts": "^2.13.0", - "egg-view-nunjucks": "^2.3.0", - "ipip-ipdb": "^0.3.0", - "jsonwebtoken": "^8.5.1", - "md5": "^2.3.0", - "midwayjs-cool-core": "^3.0.9", - "midwayjs-cool-oss": "^1.0.9", - "midwayjs-cool-queue": "^1.0.2", - "midwayjs-cool-redis": "^1.0.5", - "mysql2": "^2.2.5", - "svg-captcha": "^1.4.0", - "svg-to-dataurl": "^1.0.0" - }, - "devDependencies": { - "@midwayjs/cli": "^1.2.41", - "@midwayjs/egg-ts-helper": "^1.0.5", - "@midwayjs/luckyeye": "^1.0.2", - "@midwayjs/mock": "^2.7.7", - "@types/jest": "^26.0.20", - "@types/jsonwebtoken": "^8.5.0", - "@types/node": "14", - "cross-env": "^7.0.3", - "jest": "^26.6.3", - "mwts": "^1.1.2", - "ts-jest": "^26.5.2", - "typescript": "^4.2.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "scripts": { - "start": "egg-scripts start --daemon --title=cool-admin-midway --framework=@midwayjs/web --port=8001 --sticky", - "stop": "egg-scripts stop --title=cool-admin-midway", - "start_build": "npm run build && cross-env NODE_ENV=development midway-bin dev", - "docker": "egg-scripts start --title=cool-admin-midway --framework=@midwayjs/web", - "dev": "cross-env ets && cross-env NODE_ENV=local TS_NODE_TYPE_CHECK=false TS_NODE_TRANSPILE_ONLY=true midway-bin dev --ts --port=8001 --sticky", - "test": "midway-bin test", - "cov": "midway-bin cov", - "lint": "mwts check", - "lint:fix": "mwts fix", - "ci": "npm run cov", - "build": "midway-bin build -c", - "check": "luckyeye" - }, - "midway-bin-clean": [ - ".vscode/.tsbuildinfo", - "dist" - ], - "midway-luckyeye": { - "packages": [ - "midway_v2" - ] - }, - "repository": { - "type": "git", - "url": "" - }, - "author": "", - "license": "MIT" -} \ No newline at end of file + "name": "cool-admin", + "version": "3.0.0", + "description": "", + "private": true, + "dependencies": { + "@midwayjs/decorator": "^2.7.5", + "@midwayjs/orm": "^1.3.0", + "@midwayjs/web": "^2.7.7", + "egg": "^2.29.3", + "egg-scripts": "^2.13.0", + "egg-view-nunjucks": "^2.3.0", + "ipip-ipdb": "^0.3.0", + "jsonwebtoken": "^8.5.1", + "md5": "^2.3.0", + "midwayjs-cool-alipay": "^1.0.1", + "midwayjs-cool-core": "^3.0.11", + "midwayjs-cool-oss": "^1.0.10", + "midwayjs-cool-queue": "^1.0.3", + "midwayjs-cool-redis": "^1.0.6", + "midwayjs-cool-wxpay": "^1.0.5", + "mysql2": "^2.2.5", + "svg-captcha": "^1.4.0", + "svg-to-dataurl": "^1.0.0" + }, + "devDependencies": { + "@midwayjs/cli": "^1.2.41", + "@midwayjs/egg-ts-helper": "^1.0.5", + "@midwayjs/luckyeye": "^1.0.2", + "@midwayjs/mock": "^2.7.7", + "@types/jest": "^26.0.20", + "@types/jsonwebtoken": "^8.5.0", + "@types/node": "14", + "cross-env": "^7.0.3", + "jest": "^26.6.3", + "mwts": "^1.1.2", + "ts-jest": "^26.5.2", + "typescript": "^4.2.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "scripts": { + "start": "egg-scripts start --daemon --title=cool-admin-midway --framework=@midwayjs/web --port=8001 --sticky", + "stop": "egg-scripts stop --title=cool-admin-midway", + "start_build": "npm run build && cross-env NODE_ENV=development midway-bin dev", + "docker": "egg-scripts start --title=cool-admin-midway --framework=@midwayjs/web", + "dev": "cross-env ets && cross-env NODE_ENV=local TS_NODE_TYPE_CHECK=false TS_NODE_TRANSPILE_ONLY=true midway-bin dev --ts --port=8001 --sticky", + "test": "midway-bin test", + "cov": "midway-bin cov", + "lint": "mwts check", + "lint:fix": "mwts fix", + "ci": "npm run cov", + "build": "midway-bin build -c", + "check": "luckyeye" + }, + "midway-bin-clean": [ + ".vscode/.tsbuildinfo", + "dist" + ], + "midway-luckyeye": { + "packages": [ + "midway_v2" + ] + }, + "repository": { + "type": "git", + "url": "" + }, + "author": "", + "license": "MIT" +} diff --git a/src/app/modules/demo/controller/app/pay.ts b/src/app/modules/demo/controller/app/pay.ts new file mode 100644 index 0000000..d555514 --- /dev/null +++ b/src/app/modules/demo/controller/app/pay.ts @@ -0,0 +1,67 @@ +import { Inject, Post, Provide } from '@midwayjs/decorator'; +import { Context } from 'egg'; +import { CoolController, BaseController } from 'midwayjs-cool-core'; +import { ICoolWxPay } from 'midwayjs-cool-wxpay'; +import { parseString } from 'xml2js'; + +/** + * 支付示例 + */ +@Provide() +@CoolController() +export class DemoPayController extends BaseController { + // 微信支付 + @Inject('cool:wxpay') + wxpay: ICoolWxPay; + + @Inject() + ctx: Context; + + /** + * 扫码支付 + */ + @Post('/wx') + async wx() { + const orderNum = await this.wxpay.createOrderNum(); + const data = await this.wxpay.getInstance().unifiedOrder({ + out_trade_no: orderNum, + body: '测试微信支付', + total_fee: 1, + trade_type: 'NATIVE', + product_id: 'test001', + }); + return this.ok(data); + } + + /** + * 微信支付通知回调 + */ + @Post('/wxNotify') + async wxNotify() { + let data = ''; + this.ctx.req.setEncoding('utf8'); + this.ctx.req.on('data', chunk => { + data += chunk; + }); + const results = await new Promise((resolve, reject) => { + this.ctx.req.on('end', () => { + parseString(data, { explicitArray: false }, async (err, json) => { + if (err) { + return reject('success'); + } + const checkSign = await this.wxpay.signVerify(json.xml); + if (checkSign && json.xml.result_code === 'SUCCESS') { + // 处理业务逻辑 + console.log('微信支付成功', json.xml); + return resolve(true); + } + return resolve(false); + }); + }); + }); + if (results) { + this.ctx.body = + 'OKSUCCESS'; + } + } +} diff --git a/src/config/config.default.ts b/src/config/config.default.ts index 624de35..3c55464 100644 --- a/src/config/config.default.ts +++ b/src/config/config.default.ts @@ -83,6 +83,34 @@ export default (appInfo: EggAppInfo) => { config.multipart = { fileSize: '100mb', mode: 'file', + whitelist: [ + // images + '.jpg', '.jpeg', // image/jpeg + '.png', // image/png, image/x-png + '.gif', // image/gif + '.bmp', // image/bmp + '.wbmp', // image/vnd.wap.wbmp + '.webp', + '.tif', + '.psd', + // text + '.svg', + '.js', '.jsx', + '.json', + '.css', '.less', + '.html', '.htm', + '.xml', + // tar + '.zip', + '.gz', '.tgz', '.gzip', + // video + '.mp3', + '.mp4', + '.avi', + // 证书 + '.p12', + '.pem' + ] }; // 将egg日志替换成midway diff --git a/src/configuration.ts b/src/configuration.ts index 255ca76..0d0d1e8 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -6,6 +6,8 @@ import * as cool from 'midwayjs-cool-core'; import * as oss from 'midwayjs-cool-oss'; import * as redis from 'midwayjs-cool-redis'; import * as queue from 'midwayjs-cool-queue'; +import * as wxpay from 'midwayjs-cool-wxpay'; +import * as alipay from 'midwayjs-cool-alipay'; // import * as socket from 'midwayjs-cool-socket'; @Configuration({ @@ -21,6 +23,10 @@ import * as queue from 'midwayjs-cool-queue'; redis, // 队列 queue, + // 微信支付 + wxpay, + // 支付宝支付 + alipay // socket //socket ], diff --git a/src/resource/.cache b/src/resource/.cache deleted file mode 100644 index 1dd7452..0000000 --- a/src/resource/.cache +++ /dev/null @@ -1 +0,0 @@ -[{"admin-passwordVersion-1":"1","admin-department-1":"2","admin-perms-1":"3","admin-token-1":"4","admin-token-refresh-1":"5"},{"data":3,"expire":0},{"data":"6","expire":0},{"data":"7","expire":0},{"data":"8","expire":0},{"data":"8","expire":0},"[1,11,12,13]","[\"base:sys:menu:add\",\"base:sys:menu:delete\",\"base:sys:menu:update\",\"base:sys:menu:page\",\"base:sys:menu:list\",\"base:sys:menu:info\",\"base:sys:role:add\",\"base:sys:role:delete\",\"base:sys:role:update\",\"base:sys:role:page\",\"base:sys:role:list\",\"base:sys:role:info\",\"base:sys:log:page\",\"base:sys:log:clear\",\"base:sys:log:getKeep\",\"base:sys:log:setKeep\",\"base:sys:department:list\",\"base:sys:department:add\",\"base:sys:department:update\",\"base:sys:department:delete\",\"base:sys:department:order\",\"base:sys:user:move\",\"base:sys:param:add\",\"base:sys:param:info\",\"base:sys:param:update\",\"base:sys:param:delete\",\"base:sys:param:page\",\"base:sys:param:list\",\"space:info:page\",\"space:info:list\",\"space:info:info\",\"space:info:add\",\"space:info:delete\",\"space:info:update\",\"space:type:page\",\"space:type:list\",\"space:type:info\",\"space:type:add\",\"space:type:delete\",\"space:type:update\",\"base:app:im:message:read\",\"base:app:im:message:page\",\"base:app:im:session:page\",\"base:app:im:session:list\",\"base:app:im:session:unreadCount\",\"base:app:im:session:delete\",\"base:sys:user:add\",\"base:sys:user:delete\",\"base:sys:user:update\",\"base:sys:user:page\",\"base:sys:user:list\",\"base:sys:user:info\",\"base:plugin:info:info\",\"base:plugin:info:update\",\"base:plugin:info:list\",\"base:plugin:info:delete\",\"base:plugin:info:config\",\"base:plugin:info:getConfig\",\"base:plugin:info:enable\",\"task:info:page\",\"task:info:list\",\"task:info:info\",\"task:info:add\",\"task:info:delete\",\"task:info:update\",\"task:info:stop\",\"task:info:start\",\"task:info:once\",\"task:info:log\"]","eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc1JlZnJlc2giOmZhbHNlLCJyb2xlSWRzIjpbIjEiXSwidXNlcm5hbWUiOiJhZG1pbiIsInVzZXJJZCI6MSwicGFzc3dvcmRWZXJzaW9uIjozLCJpYXQiOjE2MTQ5MzcxMzcsImV4cCI6MTYxNDk0NDMzN30.RdVbVrdzfANFqHy4YiJa0WreqhZtGr3ys6X8tEiXfhs"] \ No newline at end of file