Compare commits

...

3 Commits

Author SHA1 Message Date
技术老胡
1ac1c2fd13 修改用户中心移动端排版问题 2025-03-18 13:53:07 +08:00
技术老胡
d570aa88b3 更新接口文档 2025-03-18 12:47:04 +08:00
技术老胡
a05a5710af 1. 优化数据库结构,增强兼容性
2. 添加手机浏览器跳转支付宝收银
3. 添加手机浏览器跳转微信支付提示信息
2025-03-18 11:49:00 +08:00
6 changed files with 766 additions and 1172 deletions

View File

@ -28,6 +28,12 @@ class ConsoleController extends BaseController
{
// 加载菜单配置
$message = \Plugin::getNotifyMessage();
if (empty($message)) {
$message = [
["id" => 1, "title" => "应用更新", "children" => []],
["id" => 2, "title" => "官方消息", "children" => []],
];
}
return json($message);
}
// 首页仪表盘

View File

@ -221,75 +221,68 @@ EOT;
private function getTableCreationSqls(): array
{
return [
'mpay_order' => "
CREATE TABLE `mpay_order` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pid` int(11) NOT NULL DEFAULT 0 COMMENT '商户 ID',
`order_id` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '订单号',
`type` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '支付类型',
`out_trade_no` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '商户订单号',
`notify_url` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '异步通知地址',
`return_url` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '跳转通知地址',
`name` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '商品名称',
`really_price` decimal(10, 2) NOT NULL DEFAULT 0 COMMENT '实际支付金额',
`money` decimal(10, 2) NOT NULL DEFAULT 0 COMMENT '订单价格',
`clientip` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '用户 IP 地址',
`device` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '设备类型',
`param` varchar(720) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '扩展参数',
`state` tinyint(4) NOT NULL DEFAULT 0 COMMENT '订单状态',
`patt` tinyint(4) NOT NULL DEFAULT 0 COMMENT '开启回调监听',
`create_time` datetime COMMENT '订单创建时间',
`close_time` datetime NULL DEFAULT NULL COMMENT '订单关闭时间',
`pay_time` datetime NULL DEFAULT NULL COMMENT '支付时间',
`platform_order` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '收款平台订单号',
`aid` int(11) NOT NULL DEFAULT 0 COMMENT '收款账号 ID',
`cid` int(11) NOT NULL DEFAULT 0 COMMENT '收款码 ID',
`delete_time` datetime NULL DEFAULT NULL COMMENT '软删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
",
'mpay_pay_account' => "
CREATE TABLE `mpay_pay_account` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '收款平台 ID',
`pid` int(11) NOT NULL DEFAULT 0 COMMENT '用户 ID',
`platform` varchar(255) NOT NULL DEFAULT '' COMMENT '收款平台',
`account` varchar(255) NOT NULL DEFAULT '' COMMENT '账号',
`password` varchar(255) NOT NULL DEFAULT '' COMMENT '密码',
`state` tinyint(4) NOT NULL DEFAULT 1 COMMENT '启用',
`pattern` tinyint(4) NOT NULL DEFAULT 1 COMMENT '账号监听模式',
`params` text NOT NULL COMMENT '自定义查询',
`delete_time` datetime NULL DEFAULT NULL COMMENT '软删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
",
'mpay_pay_channel' => "
CREATE TABLE `mpay_pay_channel` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '渠道 ID',
`account_id` int(11) NOT NULL DEFAULT 0 COMMENT '收款平台 ID',
`channel` varchar(255) NOT NULL DEFAULT '' COMMENT '收款通道',
`type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '保存类型',
`qrcode` varchar(255) NOT NULL DEFAULT '' COMMENT '二维码',
`last_time` datetime COMMENT '最近使用',
`state` tinyint(4) NOT NULL DEFAULT 1 COMMENT '启用',
`delete_time` datetime NULL DEFAULT NULL COMMENT '软删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
",
'mpay_user' => "
CREATE TABLE `mpay_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pid` int(11) NOT NULL DEFAULT 0 COMMENT '商户 ID',
`secret_key` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '商户秘钥',
`nickname` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '用户昵称',
`username` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '账号',
`password` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '密码',
`state` tinyint(4) NOT NULL DEFAULT 1 COMMENT '启用状态 0:禁用 1:启用',
`role` tinyint(4) NOT NULL DEFAULT 0 COMMENT '用户角色 0:普通用户 1:管理员',
`create_time` datetime COMMENT '创建时间',
`delete_time` datetime NULL DEFAULT NULL COMMENT '软删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
"
'mpay_order' => "CREATE TABLE `mpay_order` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pid` int(11) NOT NULL DEFAULT 0,
`order_id` varchar(255) NOT NULL DEFAULT '',
`type` varchar(255) NOT NULL DEFAULT '',
`out_trade_no` varchar(255) NOT NULL DEFAULT '',
`notify_url` varchar(255) NOT NULL DEFAULT '',
`return_url` varchar(255) NOT NULL DEFAULT '',
`name` varchar(255) NOT NULL DEFAULT '',
`really_price` decimal(10, 2) NOT NULL DEFAULT 0.00,
`money` decimal(10, 2) NOT NULL DEFAULT 0.00,
`clientip` varchar(255) NOT NULL DEFAULT '',
`device` varchar(255) NOT NULL DEFAULT '',
`param` varchar(720) NOT NULL DEFAULT '',
`state` tinyint(4) NOT NULL DEFAULT 0,
`patt` tinyint(4) NOT NULL DEFAULT 0,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`close_time` datetime DEFAULT NULL,
`pay_time` datetime DEFAULT NULL,
`platform_order` varchar(255) NOT NULL DEFAULT '',
`aid` int(11) NOT NULL DEFAULT 0,
`cid` int(11) NOT NULL DEFAULT 0,
`delete_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;",
'mpay_pay_account' => "CREATE TABLE `mpay_pay_account` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pid` int(11) NOT NULL DEFAULT 0,
`platform` varchar(255) NOT NULL DEFAULT '',
`account` varchar(255) NOT NULL DEFAULT '',
`password` varchar(255) NOT NULL DEFAULT '',
`state` tinyint(4) NOT NULL DEFAULT 1,
`pattern` tinyint(4) NOT NULL DEFAULT 1,
`params` text NOT NULL,
`delete_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;",
'mpay_pay_channel' => "CREATE TABLE `mpay_pay_channel` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`account_id` int(11) NOT NULL DEFAULT 0,
`channel` varchar(255) NOT NULL DEFAULT '',
`type` tinyint(4) NOT NULL DEFAULT 0,
`qrcode` varchar(255) NOT NULL DEFAULT '',
`last_time` datetime DEFAULT CURRENT_TIMESTAMP,
`state` tinyint(4) NOT NULL DEFAULT 1,
`delete_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;",
'mpay_user' => "CREATE TABLE `mpay_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pid` int(11) NOT NULL DEFAULT 0,
`secret_key` varchar(255) NOT NULL DEFAULT '',
`nickname` varchar(255) NOT NULL DEFAULT '',
`username` varchar(255) NOT NULL DEFAULT '',
`password` varchar(255) NOT NULL DEFAULT '',
`state` tinyint(4) NOT NULL DEFAULT 1,
`role` tinyint(4) NOT NULL DEFAULT 0,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`delete_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;"
];
}

View File

@ -66,6 +66,7 @@ class Plugin
if ($message) return $message;
$message = self::getHttpResponse(self::$siteUrl . '/MpayApi', ['action' => 'message']);
$info = json_decode($message, true);
if($info === null) return [];
if ($info['code'] === 0) cache('message', $info['data'], 36000);
return $info['data'];
}

File diff suppressed because it is too large Load Diff

View File

@ -134,6 +134,12 @@
</span><span></span></div>
<div class="qrcode"><img id="qrcode" src="/static/img/loading.gif">
</div>
<!-- 添加跳转按钮 -->
<div style="margin: 16px auto;display: none;">
<button id="openApp" class="layui-btn layui-btn-normal">
打开支付应用
</button>
</div>
<div class="msg">
<p>请付款 <span class="note">
<?php echo htmlentities($really_price); ?>
@ -284,6 +290,29 @@
} else if (payType === 'alipay' && environment === 'wxphone') {
layer.alert('请使用支付宝打开此页面');
}
// 添加按钮控制逻辑
const openAppBtn = document.getElementById('openApp');
if (environment === 'phone') {
openAppBtn.parentNode.style.display = 'block';
if (payType === 'wxpay') {
openAppBtn.innerText = '截图并打开微信';
openAppBtn.className = 'layui-btn layui-btn-green';
openAppBtn.onclick = function () {
window.location.href = 'weixin://';
};
} else if (payType === 'alipay') {
openAppBtn.innerText = '打开支付宝付款';
openAppBtn.className = 'layui-btn layui-btn-normal';
openAppBtn.onclick = function () {
if (codeType == 0) {
window.location.href = 'alipays://platformapi/startapp?appId=20000067&&url=' + payCode;
} else {
const currentUrl = window.location.href;
window.location.href = 'alipays://platformapi/startapp?appId=20000067&&url=' + currentUrl;
}
};
}
}
// 生成二维码
async function getQrcode(text, QR) {
const qrcodeUrl = await new Promise((resolve) => {

View File

@ -19,6 +19,23 @@
align-items: center;
justify-content: center;
}
.infomsg {
display: flex;
align-items: center;
justify-content: space-between;
margin-left: 10px;
width: calc(100% - 20px);
}
.infomsg div:first-child {
width: 100%;
word-break: break-all;
}
.infomsg div:last-child {
text-align: center;
}
</style>
</head>
@ -55,22 +72,26 @@
<div class="layui-form-item" pane>
<label class="layui-form-label">API 接口</label>
<div class="layui-input-block">
<div class="layui-form-mid" style="margin-left: 10px;color: #5f5f5f;float: none;">
<?php echo $url ?>
<a href="javascript:;" lay-on="copyinfo" data-info="<?php echo $url ?>"
style="float: right;" title="复制"><span
class="icon pear-icon pear-icon-survey"></span></a>
<div class="layui-form-mid infomsg">
<div>
<?php echo $url ?>
</div>
<div><a href="javascript:;" lay-on="copyinfo" data-info="<?php echo $url ?>"
title="复制"><span class="icon pear-icon pear-icon-survey"></span></a>
</div>
</div>
</div>
</div>
<div class="layui-form-item" pane>
<label class="layui-form-label">商户 PID</label>
<div class="layui-input-block">
<div class="layui-form-mid" style="margin-left: 10px;color: #5f5f5f;float: none;">
<?php echo $pid ?>
<a href="javascript:;" lay-on="copyinfo" data-info="<?php echo $pid ?>"
style="float: right;" title="复制"><span
class="icon pear-icon pear-icon-survey"></span></a>
<div class="layui-form-mid infomsg">
<div>
<?php echo $pid ?>
</div>
<div><a href="javascript:;" lay-on="copyinfo" data-info="<?php echo $pid ?>"
title="复制"><span class="icon pear-icon pear-icon-survey"></span></a>
</div>
</div>
</div>
</div>
@ -78,12 +99,15 @@
<label class="layui-form-label">商户密钥 <a href="javascript:;" lay-on="resetKey"
title="重置密钥"><span class="icon pear-icon pear-icon-refresh"></span></a></label>
<div class="layui-input-block">
<div class="layui-form-mid layui-elip"
style="margin-left: 10px;color: #5f5f5f;float: none;">
<?php echo $secret_key ?>
<a href="javascript:;" lay-on="copyinfo" data-info="<?php echo $secret_key ?>"
style="float: right;" title="复制"><span
class="icon pear-icon pear-icon-survey"></span></a>
<div class="layui-form-mid infomsg">
<div>
<?php echo $secret_key ?>
</div>
<div>
<a href="javascript:;" lay-on="copyinfo"
data-info="<?php echo $secret_key ?>" title="复制"><span
class="icon pear-icon pear-icon-survey"></span></a>
</div>
</div>
</div>
</div>
@ -98,12 +122,14 @@
<div class="layui-form-item" pane>
<label class="layui-form-label">订单监控</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-elip"
style="margin-left: 10px;color: #5f5f5f;float: none;">
<?php echo $orderurl ?>
<a href="javascript:;" lay-on="copyinfo" data-info="<?php echo $orderurl ?>"
style="float: right;" title="复制"><span
class="icon pear-icon pear-icon-survey"></span></a>
<div class="layui-form-mid infomsg">
<div>
<?php echo $orderurl ?>
</div>
<div><a href="javascript:;" lay-on="copyinfo"
data-info="<?php echo $orderurl ?>" title="复制"><span
class="icon pear-icon pear-icon-survey"></span></a>
</div>
</div>
</div>
</div>
@ -123,94 +149,103 @@
<div class="layui-form-item" pane>
<label class="layui-form-label">Webhook</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-elip"
style="margin-left: 10px;color: #5f5f5f;float: none;">
<?php echo $url . 'mpayNotify' ?>
<a href="javascript:;" lay-on="copyinfo"
data-info="<?php echo $url . 'mpayNotify' ?>" style="float: right;"
title="复制"><span class="icon pear-icon pear-icon-survey"></span></a>
<div class="layui-form-mid infomsg">
<div>
<?php echo $url . 'mpayNotify' ?>
</div>
<div><a href="javascript:;" lay-on="copyinfo"
data-info="<?php echo $url . 'mpayNotify' ?>" title="复制"><span
class="icon pear-icon pear-icon-survey"></span></a>
</div>
</div>
</div>
</div>
<div class="layui-form-item" pane>
<label class="layui-form-label">消息模版</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-elip"
style="margin-left: 10px;color: #5f5f5f;float: none;">
{"action": "mpay","data": "[msg]","time":"[timestamp]","sign": "[sign]"}
<a href="javascript:;" lay-on="copyinfo"
data-info='{"action": "mpay","data": "[msg]","time":"[timestamp]","sign": "[sign]"}'
style="float: right;" title="复制"><span
class="icon pear-icon pear-icon-survey"></span></a>
<div class="layui-form-mid infomsg">
<div>{"action": "mpay","data": "[msg]","time":"[timestamp]","sign":
"[sign]"}
</div>
<div><a href="javascript:;" lay-on="copyinfo"
data-info='{"action": "mpay","data": "[msg]","time":"[timestamp]","sign": "[sign]"}'
title="复制"><span
class="icon pear-icon pear-icon-survey"></span></a>
</div>
</div>
</div>
</div>
<div class="layui-form-item" pane>
<label class="layui-form-label">Secret</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-elip"
style="margin-left: 10px;color: #5f5f5f;float: none;">
<?php echo $secret_key ?>
<a href="javascript:;" lay-on="copyinfo"
data-info="<?php echo $secret_key ?>" style="float: right;"
title="复制"><span class="icon pear-icon pear-icon-survey"></span></a>
<div class="layui-form-mid infomsg">
<div>
<?php echo $secret_key ?>
</div>
<div><a href="javascript:;" lay-on="copyinfo"
data-info="<?php echo $secret_key ?>" title="复制"><span
class="icon pear-icon pear-icon-survey"></span></a>
</div>
</div>
</div>
</div>
<div class="layui-form-item" pane>
<label class="layui-form-label">成功关键字</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-elip"
style="margin-left: 10px;color: #5f5f5f;float: none;">
200
<a href="javascript:;" lay-on="copyinfo" data-info="200"
style="float: right;" title="复制"><span
class="icon pear-icon pear-icon-survey"></span></a>
<div class="layui-form-mid infomsg">
<div>200</div>
<div><a href="javascript:;" lay-on="copyinfo" data-info="200"
title="复制"><span
class="icon pear-icon pear-icon-survey"></span></a>
</div>
</div>
</div>
</div>
</div>
</div>
</fieldset>
<fieldset class="layui-elem-field">
<legend style="font-size: 14px;">应用转发规则·多重匹配</legend>
<div class="layui-field-box">
<div class="layui-form layui-form-pane">
<div class="layui-form-item" pane>
<label class="layui-form-label">微信支付</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-elip"
style="margin-left: 10px;color: #5f5f5f;float: none;">
<?php echo '并且 是 APP包名 相等 com.tencent.mm<br />并且 是 通知标题 相等 微信支付<br />[空格]或者 是 通知标题 相等 微信收款助手<br />[空格]或者 是 通知标题 相等 微信收款商业版' ?>
<a href="javascript:;" lay-on="copyinfo"
data-info='<?php echo "并且 是 APP包名 相等 com.tencent.mm\n并且 是 通知标题 相等 微信支付\n[空格]或者 是 通知标题 相等 微信收款助手\n[空格]或者 是 通知标题 相等 微信收款商业版" ?>'
style="float: right;" title="复制"><span
class="icon pear-icon pear-icon-survey"></span></a>
</div>
</div>
</div>
<div class="layui-form-item" pane>
<label class="layui-form-label">支付宝</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-elip"
style="margin-left: 10px;color: #5f5f5f;float: none;">
<?php echo '并且 是 APP包名 相等 com.eg.android.AlipayGphone<br />并且 是 通知标题 包含 元<br />[空格]或者 是 通知内容 包含 元' ?>
<a href="javascript:;" lay-on="copyinfo"
data-info='<?php echo "并且 是 APP包名 相等 com.eg.android.AlipayGphone\n并且 是 通知标题 包含 元\n[空格]或者 是 通知内容 包含 元" ?>'
style="float: right;" title="复制"><span
class="icon pear-icon pear-icon-survey"></span></a>
</div>
</div>
</div>
</div>
</div>
</fieldset>
</div>
</fieldset>
<fieldset class="layui-elem-field">
<legend style="font-size: 14px;">应用转发规则·多重匹配</legend>
<div class="layui-field-box">
<div class="layui-form layui-form-pane">
<div class="layui-form-item" pane>
<label class="layui-form-label">微信支付</label>
<div class="layui-input-block">
<div class="layui-form-mid infomsg">
<div>
<?php echo '并且 是 APP包名 相等 com.tencent.mm<br />并且 是 通知标题 相等 微信支付<br />[空格]或者 是 通知标题 相等 微信收款助手<br />[空格]或者 是 通知标题 相等 微信收款商业版' ?>
</div>
<div><a href="javascript:;" lay-on="copyinfo"
data-info='<?php echo "并且 是 APP包名 相等 com.tencent.mm\n并且 是 通知标题 相等 微信支付\n[空格]或者 是 通知标题 相等 微信收款助手\n[空格]或者 是 通知标题 相等 微信收款商业版" ?>'
title="复制"><span class="icon pear-icon pear-icon-survey"></span></a>
</div>
</div>
</div>
</div>
<div class="layui-form-item" pane>
<label class="layui-form-label">支付宝</label>
<div class="layui-input-block">
<div class="layui-form-mid infomsg">
<div>
<?php echo '并且 是 APP包名 相等 com.eg.android.AlipayGphone<br />并且 是 通知标题 包含 元<br />[空格]或者 是 通知内容 包含 元' ?>
</div>
<div><a href="javascript:;" lay-on="copyinfo"
data-info='<?php echo "并且 是 APP包名 相等 com.eg.android.AlipayGphone\n并且 是 通知标题 包含 元\n[空格]或者 是 通知内容 包含 元" ?>'
title="复制"><span class="icon pear-icon pear-icon-survey"></span></a>
</div>
</div>
</div>
</div>
</div>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
<script src="/component/layui/layui.js"></script>
<script src="/component/pear/pear.js"></script>
<script>