Commit 8b6483ad authored by 高诸锋's avatar 高诸锋

【fix】

parent fab7e5d5
Pipeline #5752 passed with stage
in 2 seconds
......@@ -17,7 +17,6 @@ class OrderController extends Controller {
message: '订单号格式错误',
},
};
this.showRule = {
sign: 'string',
params: {
......@@ -31,7 +30,6 @@ class OrderController extends Controller {
},
},
};
this.fetchRule = {
sign: { type: 'string', required: true },
params: {
......
......@@ -17,6 +17,16 @@ class PartnerController extends Controller {
},
},
};
this.createRule = {
sign: 'string',
params: {
type: 'object',
rule: {
appKey: 'string',
timestamp: 'string',
},
},
};
}
async show() {
......@@ -32,18 +42,26 @@ class PartnerController extends Controller {
async getToken() {
const { ctx, service } = this;
ctx.status = 200;
try {
ctx.validate(this.createRule);
const token = await service.signature.createTokenForPartner(ctx.request.body);
ctx.body = { code: 0, data: token };
const token = await service.signature.createToken(ctx.request.body);
ctx.body = {
code: 0,
data: { token },
msg: '',
};
} catch (err) {
ctx.logger.error('partnerCreate', JSON.stringify(err));
ctx.status = 200;
if (err.code === 'invalid_param') {
ctx.body = { code: -1, message: err.message || '' };
ctx.body = { code: -1, msg: '请求参数有误' };
return;
}
ctx.body = { code: err.code || -1, message: err.message || '' };
return;
if (/[a-zA-Z]+/.test(err.message)) {
ctx.body = { code: err.code || -1, msg: '系统错误, 请稍后再试' };
return;
}
ctx.body = { code: err.code || -1, msg: err.message || '' };
}
}
......
......@@ -10,17 +10,14 @@ class TaskController extends Controller {
orderId: { type: 'string', required: true },
userId: { type: 'string', required: false },
};
this.submitRule = {
phone: { type: 'string', format: /^1\d{10}$/, required: false },
ID: { type: 'string', format: /^\d{14}(\d{3})?[\dXx]$/, required: false },
email: { type: 'email', required: false },
};
this.fetchCaptureRule = {
type: { type: 'enum', values: ['code', 'phone_code'] },
};
this.taskIdRule = {
taskId: { type: 'string', format: /\d+/ },
};
......@@ -146,7 +143,25 @@ class TaskController extends Controller {
}
async fetchCityConfig() {
const { ctx, service } = this;
try {
ctx.validate(this.cityListRule);
// await service.signature.signatureCheck(ctx.request.body);
const result = await service.scripts.getCityList(ctx.request.body);
ctx.body = result;
return;
} catch (err) {
ctx.status = 200;
if (err.code === 'invalid_param') {
ctx.body = { code: -1, msg: '请求参数有误' };
return;
}
if (/[a-zA-Z]+/.test(err.message)) {
ctx.body = { code: err.code || -1, msg: '系统错误, 请稍后再试' };
return;
}
ctx.body = { code: err.code || -1, msg: err.message || '' };
}
}
}
......
......@@ -23,19 +23,6 @@ class TokenController extends Controller {
const token = await service.signature.createToken(ctx.request.body);
ctx.success({ data: token });
}
// 处理响应状态码的问题
async createForPartner() {
const { ctx, service } = this;
try {
ctx.validate(this.createRule);
} catch (e) {
ctx.body = { code: 101, msg: e.errors };
return;
}
const token = await service.signature.createTokenForPartner(ctx.request.body);
ctx.body = { code: 0, data: token };
}
}
module.exports = TokenController;
......@@ -15,6 +15,7 @@ class ScriptsService extends Service {
this.fetchHelpUrl = scriptsAPI.fetchHelpUrl;
this.redisScriptsKey = scriptsAPI.redisScriptsKey;
this.redisParamsKey = scriptsAPI.redisParamsKey;
this.cityListUrl = scriptsAPI.cityListUrl;
}
async fetchScripts() {
......@@ -171,6 +172,24 @@ class ScriptsService extends Service {
const scriptList = await this.fetchScriptByCityName(city);
return scriptList;
}
async getCityList(params) {
try {
const { cityListUrl, ctx } = this;
const result = await ctx.curl(cityListUrl, {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
contentType: 'json',
method: 'POST',
data: params,
});
return result.data;
} catch (err) {
this.ctx.logger.error(err);
return { code: -1, msg: '系统错误,请稍后重试' };
}
}
}
module.exports = ScriptsService;
......@@ -2,32 +2,17 @@
const Service = require('egg').Service;
const LOCK_SCRIPT = 'return redis.call("set", KEYS[1], ARGV[1], "NX", "EX", ARGV[2])';
const UNLOCK_SCRIPT =
'if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end';
class SignatureService extends Service {
constructor(ctx) {
super(ctx);
const { config } = this;
const { signatureAPI, lockKeys } = config;
const { signatureAPI } = config;
this.baseURL = signatureAPI.host;
this.fetchTokenUrl = signatureAPI.fetchTokenUrl;
this.fetchOrderIdUrl = signatureAPI.fetchOrderIdUrl;
this.signatureUrl = signatureAPI.signatureUrl;
this.signatureType = signatureAPI.signatureType;
this.LOCK_KEY = lockKeys.fecteToken;
this.SCRIPTS_KEY = lockKeys.token;
ctx.app.redis.defineCommand('lock', {
numberOfKeys: 1,
lua: LOCK_SCRIPT,
});
ctx.app.redis.defineCommand('unlock', {
numberOfKeys: 1,
lua: UNLOCK_SCRIPT,
});
}
_request(url, opts) {
......@@ -89,49 +74,6 @@ class SignatureService extends Service {
return result.data.data;
}
// 临时文件
async getToken() {
const { app, ctx, LOCK_KEY, SCRIPTS_KEY } = this;
const { redis } = app;
const result = await redis.get(SCRIPTS_KEY);
if (result) {
return result;
}
const lockVal = ctx.helper.genRandomStr(16);
const locked = await redis.lock(LOCK_KEY, lockVal, 60);
if (locked) {
const signParams = ctx.helper.buildRequestBody();
const token = await this.createToken(signParams);
await redis.set(SCRIPTS_KEY, token, 'EX', 7150);
await redis.unlock(LOCK_KEY, lockVal);
return token;
}
this.getToken();
}
async _checkSuccessForPartner(result) {
if (result.status !== 200) {
const errorMsg = result.data && result.data.error_msg ? result.data.error_msg : 'unknown error';
this.ctx.throw(result.status, errorMsg);
}
if (result.data.code !== 0) {
this.ctx.throw(200, { message: result.data.msg, code: result.data.code });
}
}
// 给合作方创建token
async createTokenForPartner(params) {
const { fetchTokenUrl, ctx } = this;
const result = await this._request(fetchTokenUrl, {
method: 'post',
data: params,
contentType: 'json',
});
ctx.logger.info('【Signature】createToken params', params, 'result:', result.data);
this._checkSuccessForPartner(result);
return result.data.data.token;
}
}
module.exports = SignatureService;
......@@ -2,28 +2,14 @@
const Service = require('egg').Service;
const LOCK_SCRIPT = 'return redis.call("set", KEYS[1], ARGV[1], "NX", "EX", ARGV[2])';
const UNLOCK_SCRIPT =
'if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end';
class TaskService extends Service {
constructor(ctx) {
super(ctx);
const { config: { taskAPI, LOCK_KEY } } = this;
const { config: { taskAPI } } = this;
this.taskAPI = taskAPI;
this.baseURL = taskAPI.host;
this.LOCK_KEY = LOCK_KEY;
ctx.app.redis.defineCommand('lock', {
numberOfKeys: 1,
lua: LOCK_SCRIPT,
});
ctx.app.redis.defineCommand('unlock', {
numberOfKeys: 1,
lua: UNLOCK_SCRIPT,
});
}
_request(url, opts) {
const { ctx, baseURL } = this;
url = `${baseURL}${url}`;
......@@ -102,35 +88,6 @@ class TaskService extends Service {
ctx.logger.info(`【Task】fetchTask ${fetchTaskUrl} params`, data, result.data);
return result.data;
}
// async _fetchScripts() {
// const { taskAPI } = this;
// const { fecthHubsUrl } = taskAPI;
// const result = await this._request(fecthHubsUrl, {
// method: 'get',
// contentType: 'json',
// });
// return result;
// }
// async fetchScripts() {
// const { app, ctx, LOCK_KEY, SCRIPTS_KEY } = this;
// const { redis } = app;
// const result = await redis.get(SCRIPTS_KEY);
// if (result) {
// return JSON.parse(result);
// }
// const lockVal = ctx.helper.genRandomStr(16);
// const locked = await redis.lock(LOCK_KEY, lockVal, 60);
// if (locked) {
// const scripts = await this._fetchScripts();
// await redis.set(SCRIPTS_KEY, JSON.stringify(scripts), 'EX', 300);
// await redis.unlock(LOCK_KEY, lockVal);
// return scripts;
// }
// this.fetchScripts();
// }
}
module.exports = TaskService;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment