Commit 6cb7c4d5 by 宋毅

Merge branch 'center-channel' of gitlab.gongsibao.com:jiangyong/zhichan into center-channel

parents 14ac5993 3df92378
var APIBase = require("../../api.base");
var system = require("../../../system");
var settings = require("../../../../config/settings");
class QcAPI2 extends APIBase {
constructor() {
super();
this.centerorderSve = system.getObject("service.common.qcCenterOrderSve");
this.baseOrderSve = system.getObject("service.common.baseCenterOrderSve");
}
/**
* 接口跳转-POST请求
* action_process 执行的流程
* action_type 执行的类型
* action_body 执行的参数
*/
async springBoard(pobj, qobj, req) {
if (!pobj.actionType) {
return system.getResult(null, "actionType参数不能为空");
}
var result = await this.opActionProcess(pobj, pobj.actionType, req);
return result;
}
async opActionProcess(pobj, action_type, req) {
var opResult = null;
switch (action_type) {
case "getNeedSolutionDetailByUser"://获取方案详情
opResult = await this.baseOrderSve.reqCenterOrderApi(pobj, "action/baseapi/springBoard");
break;
case "submitIcpProgramme"://icp方案提交
opResult = await this.baseOrderSve.submitIcpProgramme(pobj);
break;
case "receiveProgrammeNo"://接收渠道方案号(测试)
opResult = await this.baseOrderSve.reqCenterOrderApi(pobj);
break;
// case "submitIcpMaterial"://icp材料提交
// opResult = await this.baseOrderSve.submitIcpMaterial(pobj);
// break;
// case "acceptIcpPartnerNotification"://icp通知状态变更
// opResult = await this.baseOrderSve.acceptIcpPartnerNotification(pobj);
// break;
case "abolishIcpProgramme"://服务商icp方案关闭
opResult = await this.baseOrderSve.abolishIcpProgramme(pobj);
break;
case "getProgrammeInfoByChannelNeedNo"://获取需求方案列表
opResult = await this.baseOrderSve.reqCenterOrderApi(pobj, "action/baseapi/springBoard");
break;
case "serviceProviderSubmitMaterial"://交付商提交材料信息
opResult = await this.baseOrderSve.serviceProviderSubmitMaterial(pobj);
break;
case "serviceProviderNotification"://交付商通知状态变更
opResult = await this.baseOrderSve.serviceProviderNotification(pobj);
break;
case "closeOrderDelivery"://交付商关闭交付单
opResult = await this.baseOrderSve.closeOrderDelivery(pobj);
break;
// --------- 文网文 ---------
case "serviceSubmitOption"://服务商提交服务操作(文网文)2020-9-26
opResult = await this.baseOrderSve.serviceSubmitOption(pobj);
break;
case "submitWangwenSolution"://提交方案(文网文)2020-9-26
opResult = await this.baseOrderSve.submitWangwenSolution(pobj);
break;
case "closeNeed"://关闭需求(文网文)2020-9-28
opResult = await this.baseOrderSve.closeNeed(pobj);
break;
case "recordLog"://提交沟通记录(文网文)2020-9-28
opResult = await this.baseOrderSve.recordLog(pobj);
break;
case "recordLogList"://查询沟通记录(文网文)2020-9-29
opResult = await this.baseOrderSve.recordLogList(pobj);
break;
// --------- 食品 ---------
case "foodServiceSubmitOption"://服务商提交服务操作(文网文)2020-9-26
opResult = await this.baseOrderSve.foodServiceSubmitOption(pobj);
break;
case "submitFoodSolution"://提交方案(文网文)2020-9-26
opResult = await this.baseOrderSve.submitFoodSolution(pobj);
break;
case "foodCloseNeed"://关闭需求(文网文)2020-9-28
opResult = await this.baseOrderSve.foodCloseNeed(pobj);
break;
case "foodRecordLog"://提交沟通记录(文网文)2020-9-28
opResult = await this.baseOrderSve.foodRecordLog(pobj);
break;
case "foodRecordLogList"://查询沟通记录(文网文)2020-9-29
opResult = await this.baseOrderSve.foodRecordLogList(pobj);
break;
default:
opResult = system.getResult(null, "action_type参数错误");
break;
}
return opResult;
}
}
module.exports = QcAPI2;
\ No newline at end of file
var APIBase = require("../../api.base");
var system = require("../../../system");
var settings = require("../../../../config/settings");
const uuidv4 = require('uuid/v4');
/**
* icp通知接口(百度icp接入)
* 庄冰 2020.10.22
*/
class Consultation extends APIBase {
constructor() {
super();
this.gatewaypushlogSve = system.getObject("service.common.gatewaypushlogSve");
}
getUUID() {
var uuid = uuidv4();
var u = uuid.replace(/\-/g, "");
return u;
}
getResultSuccess(requestId) {
return {
"requestId": requestId,
"success": true,
"errorMsg": "",
"errorCode": "ok"
}
}
getResultFail(errmsg) {
var self = this;
return {
"requestId": self.getUUID(),
"success": false,
"errorMsg": errmsg,
"errorCode": "ok"
};
}
//icp需求提交
async submit(pobj,obj,req) {
var self = this;
if(!pobj.appInfo || !pobj.appInfo.uapp_key || !pobj.appInfo.uapp_secret){
return self.getResultFail("未知应用或应用未启用");
}
if (!pobj.intentionBizId) {
return self.getResultFail("intentionBizId不能为空");
}
if (!pobj.phone) {
return self.getResultFail("mobile不能为空");
}
if (!pobj.consultType) {
return self.getResultFail("consultType不能为空");
}
pobj.type = pobj.consultType;
pobj.mobile = pobj.phone;
pobj.action_type = "submitIcpNeed";
if (pobj.area) {
switch (pobj.area) {
case "1":
pobj.area = "北京";
break;
case "2":
pobj.area = "上海";
break;
case "3":
pobj.area = "福建";
break;
case "4":
pobj.area = "广西";
break;
case "5":
pobj.area = "广东";
break;
case "6":
pobj.area = "安徽";
break;
case "7":
pobj.area = "河南";
break;
case "8":
pobj.area = "湖北";
break;
case "9":
pobj.area = "浙江";
break;
case "10":
pobj.area = "江苏";
break;
case "11":
pobj.area = "山东";
break;
case "12":
pobj.area = "陕西";
break;
case "13":
pobj.area = "宁夏";
break;
case "14":
pobj.area = "甘肃";
break;
case "15":
pobj.area = "新疆";
break;
case "16":
pobj.area = "青海";
break;
case "17":
pobj.area = "天津";
break;
case "18":
pobj.area = "重庆";
break;
case "19":
pobj.area = "河北";
break;
case "20":
pobj.area = "山西";
break;
case "21":
pobj.area = "辽宁";
break;
case "22":
pobj.area = "吉林";
break;
case "23":
pobj.area = "黑龙江";
break;
case "24":
pobj.area = "江西";
break;
case "25":
pobj.area = "湖南";
break;
case "26":
pobj.area = "四川";
break;
case "27":
pobj.area = "贵州";
break;
case "28":
pobj.area = "云南";
break;
case "29":
pobj.area = "内蒙古";
break;
case "30":
pobj.area = "西藏";
break;
case "31":
pobj.area = "含外资";
break;
case "32":
pobj.area = "全外资";
break;
case "33":
pobj.area = "香港";
break;
case "34":
pobj.area = "海南";
break;
default:
pobj.area = "";
break;
}
}
if (!pobj.area) {
return self.getResultFail("area参数错误");
}
var param = {
requestId: req.requestId || self.getUUID(),
requestUrl: "/icp/consultation/submit",
requestjson: JSON.stringify(pobj),//请求地址
pushUrl: "/action/intentionapi/springBoard",//调用地址
pushActionType: "submitIcpNeed",//调用参数
pushtimes: 0,//推送次数
pushStatus: "wts",//推送状态
}
await self.gatewaypushlogSve.create(param);
return self.getResultSuccess(param.requestId);
}
}
module.exports = Consultation;
\ No newline at end of file
var APIBase = require("../../api.base");
var system = require("../../../system");
var settings = require("../../../../config/settings");
const uuidv4 = require('uuid/v4');
/**
* icp通知接口(百度icp接入)
* 庄冰 2020.10.22
*/
class Feedback extends APIBase {
constructor() {
super();
this.gatewaypushlogSve = system.getObject("service.common.gatewaypushlogSve");
}
getUUID() {
var uuid = uuidv4();
var u = uuid.replace(/\-/g, "");
return u;
}
getResultSuccess(requestId) {
return {
"requestId": requestId,
"success": true,
"errorMsg": "",
"errorCode": "ok"
}
}
getResultFail(errmsg) {
var self = this;
return {
"requestId": self.getUUID(),
"success": false,
"errorMsg": errmsg,
"errorCode": "ok"
};
}
//icp需求反馈
async submit(pobj,obj,req) {
var self = this;
if(!pobj.appInfo || !pobj.appInfo.uapp_key || !pobj.appInfo.uapp_secret){
return self.getResultFail("未知应用或应用未启用");
}
if (!pobj.intentionBizId) {
return self.getResultFail("intentionBizId不能为空");
}
if (!pobj.description) {
return self.getResultFail("description不能为空");
}
if (!pobj.intentionStatus) {
return self.getResultFail("intentionStatus不能为空");
}
var param = {
requestId: req.requestId || self.getUUID(),
requestUrl: "/icp/feedback/submit",
requestjson: JSON.stringify(pobj),//请求地址
pushUrl: "/action/intentionapi/springBoard",//调用地址
pushActionType: "icpFeedbackSubmit",//调用参数
pushtimes: 0,//推送次数
pushStatus: "wts",//推送状态
}
await self.gatewaypushlogSve.create(param);
return self.getResultSuccess(param.requestId);
}
}
module.exports = Feedback;
\ No newline at end of file
var APIBase = require("../../api.base");
var system = require("../../../system");
var settings = require("../../../../config/settings");
const uuidv4 = require('uuid/v4');
/**
* icp通知接口(百度icp接入)
* 庄冰 2020.10.22
*/
class Order extends APIBase {
constructor() {
super();
this.gatewaypushlogSve = system.getObject("service.common.gatewaypushlogSve");
}
getUUID() {
var uuid = uuidv4();
var u = uuid.replace(/\-/g, "");
return u;
}
getResultSuccess(requestId) {
return {
"requestId": requestId,
"success": true,
"errorMsg": "",
"errorCode": "ok"
}
}
getResultFail(errmsg) {
var self = this;
return {
"requestId": self.getUUID(),
"success": false,
"errorMsg": errmsg,
"errorCode": "ok"
};
}
//icp状态变更
async notify(pobj,obj,req) {
var self = this;
if(!pobj.appInfo || !pobj.appInfo.uapp_key || !pobj.appInfo.uapp_secret){
return self.getResultFail("未知应用或应用未启用");
}
if (!pobj.orderNo) {
return self.getResultFail("orderNo不能为空");
}
if(!pobj.isDirectBuy || pobj.isDirectBuy=="0"){
pobj.isDirectBuy=0;
}
pobj.status = 1;
if (pobj.isDirectBuy==0 && !pobj.bizId) {
return self.getResultFail("非直接下单bizId不能为空");
}
if (pobj.isDirectBuy==1 && !pobj.phone) {
return self.getResultFail("直接下单phone不能为空");
}
if (pobj.isDirectBuy==1 && !pobj.consultType) {
return self.getResultFail("直接下单consultType不能为空");
}
pobj.action_type = "icpOrderStatus";
var param = {
requestId: req.requestId || self.getUUID(),
requestUrl: "/icp/order/notify",
requestjson: JSON.stringify(pobj),//请求地址
pushUrl: "/action/intentionapi/springBoard",//调用地址
pushActionType: "icpNotifyNew",//调用参数
pushtimes: 0,//推送次数
pushStatus: "wts",//推送状态
}
await self.gatewaypushlogSve.create(param);
return self.getResultSuccess(param.requestId);
}
}
module.exports = Order;
\ No newline at end of file
...@@ -541,7 +541,7 @@ class CenterorderService extends AppServiceBase { ...@@ -541,7 +541,7 @@ class CenterorderService extends AppServiceBase {
//-----------接入百度ICP------start-------zhuangbing--2020.10.22------------------------- //-----------接入百度ICP------start-------zhuangbing--2020.10.22-------------------------
async icppaysuccessNew(pobj) { async icppaysuccessNew(pobj) {
var sobj = { var sobj = {
actionType: "getaliicpProduce", actionType: "getIcpProduce",
// actionBody: { typeCode: itemResult.data.channelTypeCode, province: itemResult.data.province }, // actionBody: { typeCode: itemResult.data.channelTypeCode, province: itemResult.data.province },
actionBody: { typeCode: pobj.actionBody.channelTypeCode, province: pobj.actionBody.province }, actionBody: { typeCode: pobj.actionBody.channelTypeCode, province: pobj.actionBody.province },
appInfo: pobj.appInfo, appInfo: pobj.appInfo,
......
const system = require("../../../system")
const settings = require("../../../../config/settings")
const md5 = require("MD5");
class SignService{
constructor() {
this.centerAppUrl = settings.centerAppUrl();
this.restClient = system.getObject("util.restClient");
}
async restPostUrl(pobj, url) {
try {
var rtn = await this.restClient.execPost(pobj, url);
if (!rtn || !rtn.stdout) {
return system.getResult(null, "restPost data is empty");
}
var result = JSON.parse(rtn.stdout);
return result;
} catch (e) {
var errorMsg = "error:" + e.stack;
return system.getResult(null, errorMsg);
}
}
async getAppInfoByAppKey(appkey){
let url = this.centerAppUrl + 'payment/paymentApi/getAppInfoByAppKey';
let appInfoRt = await this.restPostUrl({ appKey: appkey }, url);
return appInfoRt;
}
/**
* 验证签名
* @param {*} params 要验证的参数
* @param {*} app_secret 应用的校验key
*/
async verifySign(params, app_secret) {
if (!params) {
return system.getResult(null, "请求参数为空");
}
if (!params.sign) {
return system.getResult(null, "请求参数sign为空");
}
var signArr = [];
var keys = Object.keys(params).sort();
if (keys.length == 0) {
return system.getResult(null, "请求参数信息为空");
}
for (let k = 0; k < keys.length; k++) {
const tKey = keys[k];
if (tKey != "sign" && params[tKey]) {
let tmpKeyValue = params[tKey];
if (tmpKeyValue instanceof Array || tmpKeyValue instanceof Object) {
tmpKeyValue = JSON.stringify(tmpKeyValue);
}
signArr.push(tKey + "=" + tmpKeyValue);
}
}
if (signArr.length == 0) {
return system.getResult(null, "请求参数组装签名参数信息为空");
}
var resultSignStr = signArr.join("&") + "&key=" + app_secret;
var resultTmpSign = md5(resultSignStr).toUpperCase();
if (params.sign != resultTmpSign) {
return system.getResult(null, "返回值签名验证失败");
}
return system.getResultSuccess();
}
async createSign(params, app_key) {
if (!params) {
return system.getResultFail(-310, "请求参数为空");
}
var signArr = [];
var keys = Object.keys(params).sort();
if (keys.length == 0) {
return system.getResultFail(-330, "请求参数信息为空");
}
for (let k = 0; k < keys.length; k++) {
const tKey = keys[k];
if (tKey != "sign" && params[tKey] && !(params[tKey] instanceof Array)) {
signArr.push(tKey + "=" + params[tKey]);
}
}
if (signArr.length == 0) {
return system.getResultFail(-350, "请求参数组装签名参数信息为空");
}
var resultSignStr = signArr.join("&") + "&key=" + app_key;
var resultTmpSign = md5(resultSignStr).toUpperCase();
return system.getResultSuccess(resultTmpSign);
}
}
module.exports = SignService;
// var task = new SignService();
// var obj = {
// "intentionBizId": "zhuangbingceshi008",
// "phone": "13075556693",
// "userName": "庄冰",
// "description": "1111111111111222",
// "area": "1",
// "consultType": 5
// };
// task.createSign(obj,"7cbb892450174167b5c7e01we4716t51").then(d=>{
// console.log(d,"!!!!!!!!!!!!!!!!!!!!!!!!!!");
// });
...@@ -1252,17 +1252,6 @@ class UtilsOrderService extends AppServiceBase { ...@@ -1252,17 +1252,6 @@ class UtilsOrderService extends AppServiceBase {
if (actionBody.quantity !=actionBody.deliveryData.nclones.length || Number(actionBody.quantity) !=actionBody.deliveryData.nclones.length) { if (actionBody.quantity !=actionBody.deliveryData.nclones.length || Number(actionBody.quantity) !=actionBody.deliveryData.nclones.length) {
return system.getResult(null, "订单数量有误,100030"); return system.getResult(null, "订单数量有误,100030");
} }
pobj.actionType = "getProductDetail";
var url = settings.centerAppUrl() + "action/opProduct/springBoard";
var productItemResult = await this.restPostUrl(pobj, url);
if (productItemResult.status != 0) {
return productItemResult;
}
pobj.actionBody.product_info = productItemResult.data;
pobj.actionType = "getProductInterface";
pobj.actionBody.product_id = productItemResult.data.id;
var productItemInterfaceResult = await this.restPostUrl(pobj, url);
pobj.actionBody.product_info.interface_info = productItemInterfaceResult.data;
let nclones = actionBody.deliveryData.nclones;//大项集合 let nclones = actionBody.deliveryData.nclones;//大项集合
let product_item = [];//产品项 let product_item = [];//产品项
for(let i = 0;i < nclones.length ; i ++){ for(let i = 0;i < nclones.length ; i ++){
...@@ -1276,7 +1265,6 @@ class UtilsOrderService extends AppServiceBase { ...@@ -1276,7 +1265,6 @@ class UtilsOrderService extends AppServiceBase {
actionBody.totalSum = 0; actionBody.totalSum = 0;
actionBody.quantity = 1; actionBody.quantity = 1;
actionBody.deliveryData.nclones = [nclone] actionBody.deliveryData.nclones = [nclone]
var verifyResult = await this.isOrderVerify(pobj, pobj.actionBody);
actionBody.payTotalSum = actionBody.totalSum; actionBody.payTotalSum = actionBody.totalSum;
let saveResult = await this.addOrder(pobj,actionBody); let saveResult = await this.addOrder(pobj,actionBody);
if(saveResult.status !=0){ if(saveResult.status !=0){
......
const system = require("../system");
class baiduClient {
constructor() {
this.pushlogSve = system.getObject("service.common.pushlogSve");
}
//2020 1027 laolan 调用百度网关
async baiduPost(baidRreqUrl, accessKeyId, accessKeySecret, endpoint, actionBody) {
accessKeyId = "ff2571490b4c4fb5add57385dc5e8f66";
accessKeySecret = "9d86f04a85db4cdfa95ba8ad28009188";
endpoint = "https://iam.bj.baidubce.com";
var param = {
data: actionBody,
timeout: 20000,
headers: {
accept: 'application/json'
}
};
console.log(JSON.stringify(param), "______________峰擎---百度云参数_______");
var result = await this.baiduPost(baidRreqUrl, param);
console.log(JSON.stringify(result), "______________峰擎---百度云返回结果_______");
return result;
}
//百度接口 2020-10-27 laolan
async baiduReqbyget(obj, cbk) {
var action = obj.action;
var reqbody = obj.reqbody;
try {
var reqBaiduClient = null;// { ... this.baiduClient };
var res = await reqBaiduClient.request(action, reqbody, {
timeout: 10000, // default 3000 ms 修改3000为10000,原因ConfirmIcpIntention BizIds 超过5条会超时
formatAction: true, // default true, format the action to Action
formatParams: true, // default true, format the parameter name to first letter upper case
method: 'GET', // set the http method, default is GET
headers: {}, // set the http request headers
});
this.pushlogSve.createDb({
op: "new-baiduReqbyget",
content: JSON.stringify(obj),//推送的参数信息
resultInfo: JSON.stringify(res),
returnType: '1',
logLevel: '1',
opTitle: "new-baiduReqbyget推送百度信息返回成功"
});
return system.getResultSuccess(res);
} catch (e) {
this.pushlogSve.createFailLogDb({
appid: obj.appInfo ? obj.appInfo.uapp_id || "" : "",
appkey: obj.appInfo ? obj.appInfo.uapp_key || "" : "",
requestId: obj.requestId || "",
content: JSON.stringify(obj),//推送的参数信息
resultInfo: "error:" + JSON.stringify(e),
clientIp: obj.clientIp || "",
failType: 1,
opTitle: "new-baiduReqbyget推送百度信息返回异常",
pushNumber: obj.pushNumber || 1
});
return system.getResultFail(-200, "出现异常,error:" + e.stack);
}
}
}
module.exports = baiduClient;
...@@ -19,6 +19,6 @@ module.exports = { ...@@ -19,6 +19,6 @@ module.exports = {
"putUserPwdByMobile", "icpNotifyNew" "putUserPwdByMobile", "icpNotifyNew"
], ],
apiMustUserpinList: ["submitNeed", "paySuccess", "icpNotify", "getLoginInfo", "icpNotifyNew"], apiMustUserpinList: ["submitNeed", "paySuccess", "icpNotify", "getLoginInfo", "icpNotifyNew"],
apiSecretPathList: ["/baidu/icp"] apiSecretPathList: ["/api/icp/consultation/submit","/api/icp/feedback/submit","/api/icp/order/notify"]
} }
} }
...@@ -3,6 +3,7 @@ const utilsAuthSve = system.getObject("service.utilsSve.utilsAuthSve"); ...@@ -3,6 +3,7 @@ const utilsAuthSve = system.getObject("service.utilsSve.utilsAuthSve");
const logCtl = system.getObject("service.common.oplogSve"); const logCtl = system.getObject("service.common.oplogSve");
const utilsOrderSve = system.getObject("service.utilsSve.utilsOrderSve"); const utilsOrderSve = system.getObject("service.utilsSve.utilsOrderSve");
const utilsFeishuSve = system.getObject("service.utilsSve.utilsFeishuSve"); const utilsFeishuSve = system.getObject("service.utilsSve.utilsFeishuSve");
const signSve = system.getObject("service.common.signSve");
const xml2js = require('xml2js'); const xml2js = require('xml2js');
const jwt = require('jsonwebtoken'); const jwt = require('jsonwebtoken');
const { PDICT } = require("../../config/businessConfig"); const { PDICT } = require("../../config/businessConfig");
...@@ -405,6 +406,39 @@ module.exports = function (app) { ...@@ -405,6 +406,39 @@ module.exports = function (app) {
res.end(JSON.stringify(result)); res.end(JSON.stringify(result));
return; return;
} }
if (PDICT.apiSecretPathList.indexOf(req.originalUrl) >= 0) {
//TODO:验证数据签名
var appkey = req.headers["appkey"] || "";
if (!appkey) {
result.msg = "req headers appkey can not be empty";
result.data = null;
res.end(JSON.stringify(result));
return;
}
//1.通过appkey 获取appInfo
var appRes = await signSve.getAppInfoByAppKey(appkey);
if(!appRes || appRes.status!=0){
result.msg = "获取应用信息失败";
result.data = null;
res.end(JSON.stringify(result));
return;
}
var appInfo = appRes.data;
//2.通过appsecret 验签
var signParams = req.body;
var verifyRes = await signSve.verifySign(req.body,appInfo.uapp_secret);
if(verifyRes && verifyRes.status==0){
req.body.appInfo = appInfo;
req.appInfo = appInfo;
req.actionProcess = appInfo.app_code;
next();
return;
}else{
res.end(JSON.stringify(verifyRes));
return;
}
}
if (["getAppTokenByHosts", "getAppTokenByAppKey", "getTmNclFilterSearch"].indexOf(req.body.actionType) >= 0) { if (["getAppTokenByHosts", "getAppTokenByAppKey", "getTmNclFilterSearch"].indexOf(req.body.actionType) >= 0) {
req.body.actionBody.appHosts = req.host; req.body.actionBody.appHosts = req.host;
next(); next();
......
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