mirror of
				https://gitee.com/technical-laohu/mpay.git
				synced 2025-11-04 16:53:44 +08:00 
			
		
		
		
	更新后端查询收银平台订单明细功能
This commit is contained in:
		@@ -159,6 +159,42 @@ class PayManageController extends BaseController
 | 
			
		||||
            return json(backMsg(1, '上传失败'));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    // 获取账号交易流水
 | 
			
		||||
    public function getAccountTrade()
 | 
			
		||||
    {
 | 
			
		||||
        $req_info = $this->request->get();
 | 
			
		||||
        $req_pid = $req_info['pid'];
 | 
			
		||||
        $req_aid = $req_info['aid'];
 | 
			
		||||
        // 加载配置文件
 | 
			
		||||
        $config = \think\facade\Config::load("payconfig/{$req_pid}_{$req_aid}", 'payconfig');
 | 
			
		||||
        // 收款平台账号配置
 | 
			
		||||
        $pay_config = isset($config['pay']) ? $config['pay'] : [];
 | 
			
		||||
        // 配置检查
 | 
			
		||||
        if ($pay_config) {
 | 
			
		||||
            // 账号配置信息
 | 
			
		||||
            $aid = $pay_config['aid'];
 | 
			
		||||
            if ($req_aid != $aid) return '监听收款配置不一致';
 | 
			
		||||
        } else {
 | 
			
		||||
            return '监听收款配置文件名错误';
 | 
			
		||||
        }
 | 
			
		||||
        // 登陆账号
 | 
			
		||||
        $config = ['username' => $pay_config['account'], 'password' => $pay_config['password']];
 | 
			
		||||
        // 收款查询
 | 
			
		||||
        $query = $pay_config['query'];
 | 
			
		||||
        // 实例监听客户端
 | 
			
		||||
        $payclient_name = $pay_config['payclass'];
 | 
			
		||||
        $payclient_path = "\\payclient\\{$payclient_name}";
 | 
			
		||||
        $Payclient = new $payclient_path($config);
 | 
			
		||||
        // 获取支付明细
 | 
			
		||||
        $records = $Payclient->getOrderInfo($query);
 | 
			
		||||
        if ($records) {
 | 
			
		||||
            // 收款流水
 | 
			
		||||
            return json(backMsg(0, '查询成功', $records));
 | 
			
		||||
        } else {
 | 
			
		||||
            return json(backMsg(1, '查询空订单'));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 生成账号配置
 | 
			
		||||
    private function createAccountConfig($acc)
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										112
									
								
								public/static/js/helper.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								public/static/js/helper.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,112 @@
 | 
			
		||||
// 插件配置
 | 
			
		||||
const plugins = [
 | 
			
		||||
  {
 | 
			
		||||
    name: '收钱吧',
 | 
			
		||||
    host: 'web-platforms-msp.shouqianba.com',
 | 
			
		||||
    method: 'POST',
 | 
			
		||||
    orderQuery: '/api/transaction/findTransactions',
 | 
			
		||||
    channelKey: 'terminal_device_fingerprint',
 | 
			
		||||
    moneyKey: 'original_amount',
 | 
			
		||||
    listPath: 'data.records'
 | 
			
		||||
  }
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
// 登陆配置
 | 
			
		||||
const logins = [
 | 
			
		||||
  {
 | 
			
		||||
    name: '新商城',
 | 
			
		||||
    host: 'localhost',
 | 
			
		||||
    method: 'GET',
 | 
			
		||||
    orderQuery: '/api/Order/getOrders',
 | 
			
		||||
    accPath: 'order_id',
 | 
			
		||||
    pswPath: 'money',
 | 
			
		||||
  }
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
// 提取订单信息
 | 
			
		||||
function extractOrderInfo(response, plugins) {
 | 
			
		||||
  plugins.forEach((plugin) => {
 | 
			
		||||
    const urlObj = new URL(response.url);
 | 
			
		||||
    if (plugin.host === urlObj.hostname
 | 
			
		||||
      && plugin.orderQuery === urlObj.pathname
 | 
			
		||||
      && plugin.method === response.method) {
 | 
			
		||||
      const jsonDatas = JSON.parse(response.response);
 | 
			
		||||
      const orderDatas = eval(`jsonDatas.${plugin.listPath}`);
 | 
			
		||||
      let lists = [];
 | 
			
		||||
      orderDatas.forEach((orderData) => {
 | 
			
		||||
        const data = {
 | 
			
		||||
          '终端编号': orderData[plugin.channelKey],
 | 
			
		||||
          '订单金额': orderData[plugin.moneyKey]
 | 
			
		||||
        };
 | 
			
		||||
        lists.push(data);
 | 
			
		||||
      })
 | 
			
		||||
      console.log(plugin.name);
 | 
			
		||||
      console.table(lists);
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 提取登陆信息
 | 
			
		||||
function extractLoginInfo(request, logins) {
 | 
			
		||||
  logins.forEach((login) => {
 | 
			
		||||
    const urlObj = new URL(request.url);
 | 
			
		||||
    if (login.host === urlObj.hostname
 | 
			
		||||
      && login.orderQuery === urlObj.pathname
 | 
			
		||||
      && login.method === request.method) {
 | 
			
		||||
      const jsonData = JSON.parse(request.request);
 | 
			
		||||
      const acc = eval(`jsonData.${login.accPath}`);
 | 
			
		||||
      const psw = eval(`jsonData.${login.pswPath}`);
 | 
			
		||||
      const data = {
 | 
			
		||||
        '账号': acc,
 | 
			
		||||
        '密码': psw
 | 
			
		||||
      };
 | 
			
		||||
      console.log(login.name);
 | 
			
		||||
      console.table(data);
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// XHR 重写
 | 
			
		||||
var oldOpen = XMLHttpRequest.prototype.open;
 | 
			
		||||
var oldSend = XMLHttpRequest.prototype.send;
 | 
			
		||||
XMLHttpRequest.prototype.open = function (method, url) {
 | 
			
		||||
  this._url = url;
 | 
			
		||||
  this._method = method;
 | 
			
		||||
  const res = {
 | 
			
		||||
    url: this.responseURL,
 | 
			
		||||
    method: this._method,
 | 
			
		||||
    response: this._body
 | 
			
		||||
  }
 | 
			
		||||
  extractLoginInfo(res, logins);
 | 
			
		||||
  return oldOpen.apply(this, arguments);
 | 
			
		||||
};
 | 
			
		||||
XMLHttpRequest.prototype.send = function (body) {
 | 
			
		||||
  this._body = body;
 | 
			
		||||
  this.addEventListener('load', function () {
 | 
			
		||||
    const res = {
 | 
			
		||||
      url: this.responseURL,
 | 
			
		||||
      method: this._method,
 | 
			
		||||
      response: this.responseText
 | 
			
		||||
    }
 | 
			
		||||
    console.log(res);
 | 
			
		||||
    
 | 
			
		||||
    extractOrderInfo(res, plugins);
 | 
			
		||||
  });
 | 
			
		||||
  return oldSend.apply(this, arguments);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// fetch 重写
 | 
			
		||||
window.au_fetch = window.fetch;
 | 
			
		||||
window.fetch = function (url, options) {
 | 
			
		||||
  // console.log('Fetch URL:', url);
 | 
			
		||||
  // console.log('Fetch Options:', options);
 | 
			
		||||
  return window.au_fetch.apply(window, [url, options]).then((response) => {
 | 
			
		||||
    const res = {
 | 
			
		||||
      url: url,
 | 
			
		||||
      method: options.method,
 | 
			
		||||
      response: response.text()
 | 
			
		||||
    }
 | 
			
		||||
    extractOrderInfo(res, plugins);
 | 
			
		||||
    return response;
 | 
			
		||||
  });
 | 
			
		||||
};
 | 
			
		||||
@@ -40,6 +40,11 @@
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="main-container">
 | 
			
		||||
                <div class="layui-text">
 | 
			
		||||
                    <p>终端编号如何填写,<strong><a href="https://f0bmwzqjtq2.feishu.cn/docx/HBVrdrsACo36bzxUCSPcjOBNnyb?from=from_copylink" target="_blank"><strong>请查看文档</strong></a></p>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="bottom">
 | 
			
		||||
            <div class="button-container">
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,11 @@
 | 
			
		||||
	<meta charset="utf-8">
 | 
			
		||||
	<title>收款管理</title>
 | 
			
		||||
	<link rel="stylesheet" href="/component/pear/css/pear.css" />
 | 
			
		||||
	<style>
 | 
			
		||||
		.account-trade {
 | 
			
		||||
			padding: 15px;
 | 
			
		||||
		}
 | 
			
		||||
	</style>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body class="pear-container">
 | 
			
		||||
@@ -119,6 +124,7 @@
 | 
			
		||||
				{ title: '启用状态', field: 'state', align: 'center', templet: '#account-state' },
 | 
			
		||||
				{ title: '监听模式', field: 'pattern', align: 'center' },
 | 
			
		||||
				{ title: '监听地址 / 自定义模版', field: 'checkUrl', align: 'center', minWidth: 300, event: 'copy', templet: '#account-checkUrl' },
 | 
			
		||||
				{ title: '收款平台流水', field: 'trade', align: 'center', templet: '<div><a href="javascript:;" lay-event="queryTrade" data-url="/api/PayManage/getAccountTrade?pid={{= d.pid }}&aid={{= d.id }}"><span class="layui-badge layui-bg-green">查询</span></a></div>' },
 | 
			
		||||
				{ title: '收款码数量', field: 'channel', align: 'center', templet: '<div><a href="javascript:;" lay-event="channelList"><span class="layui-badge layui-bg-green">{{= d.channel }}</span></a></div>' },
 | 
			
		||||
				{ title: '操作', align: 'center', fixed: 'right', templet: '<div><a href="javascript:;" class="layui-font-green" lay-event="edit"><strong>编辑</strong></a></div>' }
 | 
			
		||||
			]]
 | 
			
		||||
@@ -147,18 +153,21 @@
 | 
			
		||||
					account.editAccount(id);
 | 
			
		||||
				} else if (obj.event === 'channelList') {
 | 
			
		||||
					account.channelList(id);
 | 
			
		||||
				} else if (obj.event === 'queryTrade') {
 | 
			
		||||
					const url = this.getAttribute('data-url');
 | 
			
		||||
					account.getAccountTrade(url);
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
			table.on('toolDouble(account-table)', function (obj) {
 | 
			
		||||
				if (obj.event === 'copy') {
 | 
			
		||||
					const text = obj.tr[0].querySelector('td[data-field="checkUrl"]>div').innerText;
 | 
			
		||||
					if (navigator.clipboard) {
 | 
			
		||||
                        navigator.clipboard.writeText(text).then(() => {
 | 
			
		||||
                            layer.msg('复制成功');
 | 
			
		||||
                        });
 | 
			
		||||
                    } else {
 | 
			
		||||
                        layer.msg('复制失败,请手动复制');
 | 
			
		||||
                    }
 | 
			
		||||
						navigator.clipboard.writeText(text).then(() => {
 | 
			
		||||
							layer.msg('复制成功');
 | 
			
		||||
						});
 | 
			
		||||
					} else {
 | 
			
		||||
						layer.msg('复制失败,请手动复制');
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
			// 表格头部按钮事件
 | 
			
		||||
@@ -274,6 +283,32 @@
 | 
			
		||||
					content: `/Order/testPay`,
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// 查询平台收银流水
 | 
			
		||||
			account.getAccountTrade = async function (url) {
 | 
			
		||||
				const res = await fetch(url);
 | 
			
		||||
				if (res.status !== 200) {
 | 
			
		||||
					layer.msg('请求失败,请重试!', { tips: 2, time: 1200 });
 | 
			
		||||
					return false;
 | 
			
		||||
				}
 | 
			
		||||
				const rec_info = await res.json();
 | 
			
		||||
				if (rec_info.code === 0) {
 | 
			
		||||
					const data = rec_info.data;
 | 
			
		||||
					let html = '';
 | 
			
		||||
					data.forEach(order => {
 | 
			
		||||
						html += `<tr><td>${order.order_no}</td><td>${order.channel}</td><td>${order.price}</td><td>${order.payway}</td></tr>`;
 | 
			
		||||
					});
 | 
			
		||||
					layer.open({
 | 
			
		||||
						type: 1,
 | 
			
		||||
						title: '收银流水(近3分钟)',
 | 
			
		||||
						area: ['720px', '480px'],
 | 
			
		||||
						content: `<div class="account-trade"><table class="layui-table"><thead><tr><th>订单流水</th><th>终端编号</th><th>收款金额</th><th>支付方式</th></tr></thead><tbody>${html}</tbody></table></div>`
 | 
			
		||||
					});
 | 
			
		||||
				} else {
 | 
			
		||||
					layer.msg(rec_info.msg, { icon: 2, time: 1200 });
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// 请求封装
 | 
			
		||||
			async function httpJSON(url, info) {
 | 
			
		||||
				const res = await fetch(url, { method: 'post', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(info) });
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user