仰望星辰工作室

better-staridc-MNBT

Z zfhsh first commit 2 天前
1<?php
2if (!defined('IN_CRONLITE')) {
3 exit;
4}
5mnbt_admin_include('head');
6?>
7<link rel="stylesheet" href="<?=mnbt_theme_asset('set-page.css', 'admin')?>">
8<link rel="stylesheet" href="<?=mnbt_theme_asset('pay-settings.css', 'admin')?>">
9
10<div class="mn-set-page">
11<?php
12$cfg = [
13 'app_id' => (string)mnbt_plugin_option_get('alipay_official', 'app_id', ''),
14 'private_key' => (string)mnbt_plugin_option_get('alipay_official', 'private_key', ''),
15 'public_key' => (string)mnbt_plugin_option_get('alipay_official', 'public_key', ''),
16 'gateway' => (string)mnbt_plugin_option_get('alipay_official', 'gateway', ''),
17];
18$configured = $cfg['app_id'] !== '' && $cfg['private_key'] !== '' && $cfg['public_key'] !== '';
19$gatewayDefault = $cfg['gateway'] === '' ? 'https://openapi.alipay.com/gateway.do' : $cfg['gateway'];
20
21// 计算回调 URL
22$scriptName = str_replace('\\', '/', $_SERVER['SCRIPT_NAME'] ?? '');
23$siteRoot = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https://' : 'http://')
24 . ($_SERVER['HTTP_HOST'] ?? 'localhost')
25 . substr($scriptName, 0, strrpos($scriptName, '/'));
26if (substr($siteRoot, -6) === '/admin') {
27 $siteRoot = substr($siteRoot, 0, -6);
28}
29// 回调地址统一用 index.php?_r= 兼容路由:不依赖服务器伪静态重写
30$notifyUrl = $siteRoot . '/index.php?_r=/pay/alipay_official/notify';
31$returnUrl = $siteRoot . '/index.php?_r=/pay/alipay_official/return';
32?>
33
34<div class="mn-set-card">
35 <div class="mn-set-card-hd">
36 <div class="mn-set-icon"><i class="mdi mdi-alpha-a-circle"></i></div>
37 <div>
38 <h4>支付宝官方设置</h4>
39 <p>配置支付宝开放平台应用的 RSA2 凭证</p>
40 </div>
41 </div>
42 <div class="mn-set-card-bd">
43 <div class="mn-pay-note">
44 <b>说明:</b>本页仅配置支付宝官方 API 凭证。是否在客户端显示该插件的付款方式,请前往 <a href="pay_settings.php" class="alert-link">支付设置</a> 启用。
45 </div>
46 </div>
47</div>
48
49<div class="mn-set-card">
50 <div class="mn-set-card-bd">
51 <div class="mn-set-field">
52 <label for="alipay_app_id">应用 APPID</label>
53 <input type="text" id="alipay_app_id" class="form-control" value="<?=htmlspecialchars($cfg['app_id'], ENT_QUOTES)?>" placeholder="开放平台应用 APPID" required>
54 <small>开放平台 → 应用列表 → 对应应用的 APPID</small>
55 </div>
56 <div class="mn-set-field">
57 <label for="alipay_private_key">应用私钥</label>
58 <textarea id="alipay_private_key" class="form-control" rows="5" placeholder="RSA2 应用私钥(不含 -----BEGIN/END----- 标记)" required><?=htmlspecialchars($cfg['private_key'], ENT_QUOTES)?></textarea>
59 <small>开放平台 → 密钥管理 → 应用私钥(PKCS1 或 PKCS8 格式均可,仅 base64 字符串部分)</small>
60 </div>
61 <div class="mn-set-field">
62 <label for="alipay_public_key">支付宝公钥</label>
63 <textarea id="alipay_public_key" class="form-control" rows="5" placeholder="支付宝公钥(不含 -----BEGIN/END----- 标记)" required><?=htmlspecialchars($cfg['public_key'], ENT_QUOTES)?></textarea>
64 <small>开放平台 → 密钥管理 → 支付宝公钥(用于验签异步通知)</small>
65 </div>
66 <div class="mn-set-field">
67 <label for="alipay_gateway">网关地址</label>
68 <input type="text" id="alipay_gateway" class="form-control" value="<?=htmlspecialchars($gatewayDefault, ENT_QUOTES)?>" placeholder="https://openapi.alipay.com/gateway.do">
69 <small>默认正式环境;沙箱测试可改为 <code>https://openapi-sandbox.dl.alipaydev.com/gateway.do</code></small>
70 </div>
71 <div class="mn-set-actions">
72 <button type="button" class="btn btn-primary btn-block" onclick="alipayOfficialSave()"><i class="mdi mdi-content-save-outline"></i> 保存配置</button>
73 </div>
74 <?php if (!$configured): ?>
75 <div class="mn-set-note" style="background:#fef2f2;border-color:#fecaca;color:#991b1b">
76 <b>未配置:</b>请填写完整的三项凭证,否则支付宝官方相关付款方式将不可用。
77 </div>
78 <?php else: ?>
79 <div class="mn-set-note" style="background:#f0fdf4;border-color:#bbf7d0;color:#166534">
80 <b>已配置:</b>凭证已就绪。可在 <a href="pay_settings.php" class="alert-link" style="color:#166534">支付设置</a> 启用电脑网站支付或扫码支付。
81 </div>
82 <?php endif; ?>
83 </div>
84</div>
85
86<div class="mn-set-card">
87 <div class="mn-set-card-hd">
88 <div class="mn-set-icon"><i class="mdi mdi-link-variant"></i></div>
89 <div>
90 <h4>回调地址</h4>
91 <p>在支付宝开放平台应用配置中需填入以下地址</p>
92 </div>
93 </div>
94 <div class="mn-set-card-bd">
95 <div class="table-responsive">
96 <table class="table mn-set-table">
97 <thead>
98 <tr><th style="width:140px">类型</th><th>URL</th></tr>
99 </thead>
100 <tbody>
101 <tr>
102 <td>异步通知(notify_url)</td>
103 <td><code><?=htmlspecialchars($notifyUrl, ENT_QUOTES)?></code></td>
104 </tr>
105 <tr>
106 <td>同步返回(return_url)</td>
107 <td><code><?=htmlspecialchars($returnUrl, ENT_QUOTES)?></code></td>
108 </tr>
109 </tbody>
110 </table>
111 </div>
112 <div class="mn-set-note">
113 回调路径由系统通过通用路由自动注册。请在支付宝开放平台对应应用的"接口加签方式"中选择 <code>公钥模式</code>,并确保服务器时间准确(RSA2 验签对时间戳敏感)。
114 </div>
115 </div>
116</div>
117
118<div class="mn-set-card">
119 <div class="mn-set-card-hd">
120 <div class="mn-set-icon"><i class="mdi mdi-alert-circle-outline"></i></div>
121 <div>
122 <h4>环境要求</h4>
123 <p>使用本插件需服务器满足以下条件</p>
124 </div>
125 </div>
126 <div class="mn-set-card-bd">
127 <ul class="mb-0" style="font-size:13px;line-height:1.9;color:#475569">
128 <li>PHP 已启用 <code>openssl</code> 扩展(RSA2 签名必需)</li>
129 <li>PHP 已启用 <code>curl</code> 扩展(调用 alipay.trade.precreate 必需)</li>
130 <li>已配置 nginx/apache rewrite,将未命中文件的请求转发到 <code>index.php</code>(异步通知需要)</li>
131 <li>开放平台应用已开通"<b>电脑网站支付</b>"和"<b>当面付</b>"能力</li>
132 </ul>
133 </div>
134</div>
135</div>
136
137<script type="text/javascript">
138function alipayOfficialSave() {
139 var appId = $.trim($('#alipay_app_id').val());
140 var privateKey = $.trim($('#alipay_private_key').val());
141 var publicKey = $.trim($('#alipay_public_key').val());
142 var gateway = $.trim($('#alipay_gateway').val());
143 if (appId === '' || privateKey === '' || publicKey === '') {
144 msalert(3, '请填写完整的 APPID、应用私钥和支付宝公钥', 2500);
145 return;
146 }
147 msloading('正在保存...', 'text-info', 'text-info');
148 $.post('ajax.php', {
149 gn: 'alipay_official_save',
150 app_id: appId,
151 private_key: privateKey,
152 public_key: publicKey,
153 gateway: gateway
154 }, function (resp) {
155 var j = JSON.parse(resp);
156 var qk = j.code;
157 if (qk === '保存成功') {
158 msalert(1, '保存成功!', 1800);
159 msloadingde();
160 } else {
161 msalert(4, qk || '保存失败', 2500);
162 msloadingde();
163 }
164 }).fail(function () {
165 msalert(4, '网络错误', 2500);
166 msloadingde();
167 });
168}
169</script>