Commit a4ba3e12 by 王栋源

wdy

parent 9a6967b6
var APIBase = require("../../api.base");
var system = require("../../../system");
class PaymentAPI extends APIBase {
constructor() {
super();
this.utilstlbankSve = system.getObject("service.utilsSve.utilstlbankSve");
}
async test(pobj, query, req) {
// var tmp = await this.orderSve.createLicense(pobj.action_body);
return system.getResultSuccess({req:"ok"});
}
async h5payment(p,o,r){
var a=await this.utilstlbankSve.getH5Url(o.app_id,o.order_num,o.total_fee,null,o.body_desc,null,o.opType);
return a;
}
async getQrCode(pobj,o,r){
var rtn=await this.utilstlbankSve.getQrCode(pobj.actionBody.uapp_id,pobj.actionBody.order_num,pobj.actionBody.total_fee,pobj.actionBody.body_desc,pobj.actionBody.opType);
return rtn;
}
async queryOrder(pobj,o,r){
var rtn=await this.utilstlbankSve.queryOrder(pobj.actionBody.uapp_id,pobj.actionBody.trxid);
return rtn;
}
async receiveCallBackNotify(pobj,o,r){
var rtn=await this.utilstlbankSve.receiveCallBackNotify(pobj.actionBody.parmas, pobj.client_ip);
return rtn;
}
exam() {
return "";
}
classDesc() {
return {
groupName: "",
groupDesc: "",
name: "",
desc: "",
exam: "",
};
}
methodDescs() {
return [
{
methodDesc: "",
methodName: "",
paramdescs: [
{
paramDesc: "",
paramName: "",
paramType: "",
defaultValue: "",
}
],
rtnTypeDesc: "",
rtnType: ""
}
];
}
}
module.exports = PaymentAPI;
\ No newline at end of file
var System = require("../../../system");
var settings = require("../../../../config/settings");
// const uiconfig = System.getUiConfig2(settings.wxconfig.appId);
// const logCtl = System.getObject("web.oplogCtl");
// const cacheManager = System.getObject("db.cacheManager");
const querystring = require('querystring');
// var moment = require("moment");
const md5 = require("MD5");
class utilsTlBankSve {
constructor() {
this.wxMethod = "W01";//微信订单支付
this.aliMethod = "A01";//阿里订单支付
this.notifyUrl = "https://igirl.gongsibao.com/api/tl/zxNotify";
this.restClient = System.getObject("util.restClient");
this.oplogDao = System.getObject("db.common.oplogDao");
}
async getpaymentinfo(appid) {
var sql = "select * from p_app_payparam where uapp_id=" + appid;
var appinfo = await this.oplogDao.customQuery(sql);
if (appinfo) {
console.log(appinfo);
return appinfo[0];
} else {
return null
}
}
async getappinfo(appid) {
var sql = "select * from p_app where uapp_id=" + appid;
var appinfo = await this.oplogDao.customQuery(sql);
if (appinfo) {
console.log(appinfo);
return appinfo[0];
} else {
return null
}
}
//-------------------------------------------h5支付-----------------开始
/**
* 唤起H5支付---只供简单应用
* @param {*} company_id 公司ID
* @param {*} pay_title 支付显示标题
* @param {*} total_sum 支付金额
* @param {*} order_no 订单号
* @param {*} returl 支付成功后返回的url
*/
async getH5Url(app_id, pay_title, total_sum, order_no, returl) {
// appid:00000003,商户号(mch_id):990440148166000,md5key(pay_key):a0ea3fa20dbd7bb4d5abf1d59d63bae8
// var payParam = await this.companypayparamDao.getOneByCompanyId(company_id, 1);
var payParam = await this.getpaymentinfo(app_id);
if (!payParam) {
return { status: -210, msg: "公司没有对应的支付凭证" }
}
var timestamp = Date.now();
var jsonObj = {
appid: payParam.pay_appid,
cusid: payParam.mch_id,
version: 12,
trxamt: total_sum,//单位为分
reqsn: order_no,//order_num + "_" + company_id.toString(),
charset: "UTF-8",
returl: returl,
notify_url: payParam.notifyUrl || this.notifyUrl,
body: pay_title,
remark: "h5paypagesywdy",
randomstr: timestamp.toString()//随机字符串,不长于32位
}
var param_result = await this.getReqBeforeParam(jsonObj, "1352105537612345789");
if (param_result.status != 0) {
return param_result;
}
var paramStr = Object.keys(jsonObj).sort().map(key => {
return `${encodeURIComponent(key)}=${encodeURIComponent(jsonObj[key])}`
}).join('&');
return { status: 0, payUrl: "https://syb.allinpay.com/apiweb/h5unionpay/unionorder?" + paramStr };
}
//-------------------------------------------h5支付-----------------结束
//----------------------------------------------------------------------------------------请求银行接口开始---------------------------------------------------
/*
company_id:公司id、
order_num:订单号、
total_fee:订单金额单位为分、
product_id:产品id、
body_desc:内容描述(可以是产品名称)、
create_ip:创建ip、
opType:操作类型,1微信、2支付宝
返回错误码:成功为1
返回错误码:成功为1
-210:公司没有对应的支付凭证
-230:请求参数信息为空
-250:请求组装签名参数信息为空
-280:请求结算接口返回失败
-310:返回值信息data为空
-230:返回值参数信息为空
-250:返回值组装签名参数信息为空
-280:返回值签名验证失败
-400:请求接口请求返回值错误
-410:请求结算接口返回空
*/
async getQrCode(app_id, order_num, total_fee, body_desc, opType) {//获取微信支付二维码
// var payParam = await this.companypayparamDao.getOneByCompanyId(company_id, 1);
var payParam = await this.getpaymentinfo(app_id);
if (!payParam) {
return { status: -210, msg: "公司没有对应的支付凭证" }
}
var reqMethod = this.wxMethod;
if (opType == "alipay") {
reqMethod = this.aliMethod;
}
var timestamp = Date.now();
var jsonObj = {
appid: payParam.pay_appid,
cusid: payParam.mch_id,
trxamt: total_fee,//单位为分
reqsn: "qft" + order_num + "_" + app_id.toString(),
paytype: reqMethod,
randomstr: timestamp.toString(),//随机字符串,不长于32位
body: body_desc,
notify_url: this.notifyUrl,
}
var param_result = await this.getReqBeforeParam(jsonObj, payParam.pay_key);
if (param_result.status != 0) {
return param_result;
}
var reqUrl = payParam.pay_url + "/pay";
var result = await this.execReqInfo("getQrCode", reqUrl, param_result.req_param);
if (result.status != 0) {
return result;
}
var signResult = await this.resultSign(result.data, payParam.pay_key);
if (signResult.status != 0) {
return signResult;
}
result.data = {
payinfo: result.data.payinfo,
reqsn: result.data.reqsn,//商户订单号
chnltrxid: result.data.chnltrxid,// 支付渠道交易单号,如支付宝,微信平台的交易单号
trxid: result.data.trxid,// 交易单号,平台的交易流水号
// 交易状态,0000:交易成功、1001:交易不存在、
//2008或者2000 : 交易处理中,请查询交易,如果是实时交易(例如刷卡支付,交易撤销,退货),建议每隔一段时间(10秒)查询交易、
//3888-流水号重复、其他3开头的错误码代表交易失败
trxstatus: result.data.trxstatus,
fintime: result.data.fintime,// 交易完成时间 yyyyMMddHHmmss
errmsg: result.data.errmsg,// 错误原因
};
return result;
}
async getReqBeforeParam(jsonObj, pay_key) {//获取请求前的参数信息
jsonObj.key = pay_key;
var reqResult = { status: 0, msg: "ok", req_param: null };
var signArr = [];
var keys = Object.keys(jsonObj).sort();
if (keys.length == 0) {
reqResult.status = -230;
reqResult.msg = "请求参数信息为空";
return reqResult;
}
for (let k = 0; k < keys.length; k++) {
const tKey = keys[k];
if (tKey != "sign" && jsonObj[tKey]) {
signArr.push(tKey + "=" + jsonObj[tKey]);
}
}
if (signArr.length == 0) {
reqResult.status = -250;
reqResult.msg = "请求组装签名参数信息为空";
return reqResult;
}
var signStr = signArr.join("&");
var tmpSign = md5(signStr).toUpperCase();
jsonObj.sign = tmpSign;
delete jsonObj["key"];
reqResult.req_param = jsonObj;
return reqResult;
}
async resultSign(resultData, pay_key) {//返回值进行验签
var rtnResult = { status: 0, msg: "SUCCESS" };
if (!resultData || !resultData.appid) {
rtnResult.status = -310;
rtnResult.msg = "返回值信息data为空";
return rtnResult;
}
resultData.key = pay_key;
var resultSignArr = [];
var keys = Object.keys(resultData).sort();
if (keys.length == 0) {
rtnResult.status = -330;
rtnResult.msg = "返回值参数信息为空";
return rtnResult;
}
for (let k = 0; k < keys.length; k++) {
const tKey = keys[k];
if (tKey != "sign" && resultData[tKey]) {
resultSignArr.push(tKey + "=" + resultData[tKey]);
}
}
if (resultSignArr.length == 0) {
rtnResult.status = -350;
rtnResult.msg = "返回值组装签名参数信息为空";
return rtnResult;
}
var resultSignStr = resultSignArr.join("&");
var resultTmpSign = md5(resultSignStr).toUpperCase();
delete resultData["key"];
if (resultData.sign != resultTmpSign) {
rtnResult.status = -380;
rtnResult.msg = "返回值签名验证失败";
return rtnResult;
}
return rtnResult;
}
async execReqInfo(self_method_name, reqUrl, param) {
try {
var req_param = querystring.stringify(param);
var rtn = await this.restClient.execPost2(req_param, reqUrl);
var rtnResult = { status: 0, msg: "SUCCESS", data: {} };
if (rtn && rtn.stdout) {
var tmpResult = JSON.parse(rtn.stdout);
if (tmpResult.retcode == "FAIL") {
rtnResult.status = -400;
rtnResult.msg = tmpResult.retmsg;
} else {
rtnResult.data = tmpResult;
}
} else {
rtnResult.status = -410;
rtnResult.msg = '请求结算接口返回空';
}
return rtnResult;
} catch (e) {
throw new Error(e.stack);
}
}
/*
company_id:公司id、
order_num:订单号、
opType:操作类型,1微信、2支付宝
返回错误码:成功为1
-210:公司没有对应的支付凭证
-230:请求参数信息为空
-250:请求组装签名参数信息为空
-280:请求结算接口返回失败
-310:返回值信息data为空
-230:返回值参数信息为空
-250:返回值组装签名参数信息为空
-280:返回值签名验证失败
-400:请求接口请求返回值错误
-410:请求结算接口返回空
*/
async queryOrder(uapp_id, trxid) {//查询订单支付状态
var payParam = await this.getpaymentinfo(uapp_id);
if (!payParam) {
return { status: -210, msg: "公司没有对应的支付凭证" }
}
var timestamp = Date.now();
var jsonObj = {
appid: payParam.pay_appid,
cusid: payParam.mch_id,
// reqsn: order_num + "_" + uapp_id.toString(),//reqsn和trxid必填其一
trxid: trxid,//平台交易流水
randomstr: timestamp.toString(),//随机字符串,不长于32位
}
var param_result = await this.getReqBeforeParam(jsonObj, payParam.pay_key);
if (param_result.status != 0) {
return param_result;
}
var reqUrl = payParam.pay_url + "/query";
console.log(param_result.req_param, "data............");
var result = await this.execReqInfo("queryOrder", reqUrl, param_result.req_param);
if (result.status != 0) {
return result;
}
var signResult = await this.resultSign(result.data, payParam.pay_key);
if (signResult.status != 0) {
return signResult;
}
result.data = {
trxcode: result.data.trxcode,//交易类型,VSP501 微信支付、VSP511 支付宝支付
trxamt: result.data.trxamt,//交易金额 单位为分
reqsn: result.data.reqsn,//商户订单号
chnltrxid: result.data.chnltrxid,// 支付渠道交易单号,如支付宝,微信平台的交易单号
trxid: result.data.trxid,// 交易单号,平台的交易流水号
// 交易状态,0000:交易成功、1001:交易不存在、
//2008或者2000 : 交易处理中,请查询交易,如果是实时交易(例如刷卡支付,交易撤销,退货),建议每隔一段时间(10秒)查询交易、
//3888-流水号重复、其他3开头的错误码代表交易失败
trxstatus: result.data.trxstatus,
fintime: result.data.fintime,// 交易完成时间 yyyyMMddHHmmss
errmsg: result.data.errmsg,// 错误原因
};
return result;
}
async getReqBeforeParam(jsonObj, pay_key) {//获取请求前的参数信息
jsonObj.key = pay_key;
var reqResult = { status: 0, msg: "ok", req_param: null };
var signArr = [];
var keys = Object.keys(jsonObj).sort();
if (keys.length == 0) {
reqResult.status = -230;
reqResult.msg = "请求参数信息为空";
return reqResult;
}
for (let k = 0; k < keys.length; k++) {
const tKey = keys[k];
if (tKey != "sign" && jsonObj[tKey]) {
signArr.push(tKey + "=" + jsonObj[tKey]);
}
}
if (signArr.length == 0) {
reqResult.status = -250;
reqResult.msg = "请求组装签名参数信息为空";
return reqResult;
}
var signStr = signArr.join("&");
var tmpSign = md5(signStr).toUpperCase();
jsonObj.sign = tmpSign;
delete jsonObj["key"];
reqResult.req_param = jsonObj;
return reqResult;
}
async receiveCallBackNotify(parmas, client_ip) {//收到通联回调通知---post请求
var result = "FAIL";
try {
if (!parmas) {
result = "回调parmas中参数信息为空";
return result;
}
var isVerify = await this.verifyCallBackParams(parmas);
if (isVerify) {
result = isVerify;
return result;
}
let attachList = [];
if (parmas.cusorderid.indexOf("_") >= 0) {
attachList = parmas.cusorderid.split("_");
}
else {
attachList.push(parmas.cusorderid);
}
if (attachList.length < 2) {
result = "回调cusorderid参数错误,没有_标识";
return result;
}
var uappid = attachList.length == 2 ? attachList[1] : attachList[2];
var payParam = await this.getpaymentinfo(uappid);
if (!payParam) {
result.return_msg = "回调公司没有对应的支付凭证";
return jsonBuilder.buildObject(result);
}
var appinfo = await this.getappinfo(uappid);
if (!appinfo) {
result.return_msg = "回调公司没有对应的支付凭证";
return jsonBuilder.buildObject(result);
}
var signResult = await this.resultSign(parmas, payParam.pay_key);
if (signResult.status != 0) {
result = signResult.msg;
return result;
}
//解析支付参数
parmas.out_trade_no = attachList[0].substr(3);
parmas.uappid = attachList.length == 2 ? attachList[1] : attachList[2];
//重写新签名
var newparmas = await this.getReqBeforeParam(parmas, appinfo.upp_secret);
var backResult = await this.execReqInfo(null,payParam.notify_url,newparmas);
if (backResult.status != 0) {
result = backResult.msg;
return result;
}
return result;
} catch (e) {
result = "回调业务处理---error异常";
return result;
}
}
async verifyCallBackParams(getParams) {//验证回调参数
if (!getParams.trxcode) {
return "回调trxcode参数为空";
}
if (getParams.trxcode != "VSP501" && getParams.trxcode != "VSP511") {
return "回调trxcode值错误";
}
if (!getParams.trxstatus || getParams.trxstatus != "0000") {
return "回调trxstatus信息为空或不等于0000";
}
if (!getParams.cusorderid) {
return "回调商户订单号cusorderid参数为空";
}
return "";
}
async opBackNotify(getParams, opDesc) {//操作回调业务逻辑
try {
//日志记录
logCtl.info({
optitle: (new Date()).Format("yyyy-MM-dd hh:mm:ss") + ":支付回调信息=====" + opDesc + ",method=" + getParams.trxcode,
op: "base/service/impl/utilszxbankSve.js/opBackNotify",
content: JSON.stringify(getParams),
clientIp: getParams.client_ip || ""
});
//获取充值业务锁
var locker = await cacheManager["ZxPayLocker"].enter(getParams.trxid);
if (locker && locker == "1") {
if (getParams.trxcode == "VSP501") {
getParams.req_accountType = "wx";
} else {
getParams.req_accountType = "alipay";
}
// if (getParams.method == "VSP511") {
// getParams.req_accountType="alipay";
// }
return await this.notifyOpDb(getParams);
}
else {
// await cacheManager["ZxPayLocker"].release(getParams.trxid);//---测试时放开
logCtl.info({
optitle: "通联回调操作频繁---太频繁了,太频繁了",
op: "/app/config/routes/api.js",
content: "参数=" + JSON.stringify(getParams),
clientIp: getParams.client_ip || ""
});
return { status: -510, msg: "中信回调操作频繁---太频繁了,太频繁了" };
}
} catch (e) {
await cacheManager["ZxPayLocker"].release(getParams.trxid);
throw new Error(e.stack);
}
}
}
module.exports = utilsTlBankSve;
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