This commit is contained in:
Billy 2025-10-20 08:54:02 +08:00
parent dd8c8b0ab0
commit 48dbc5f4e4
2 changed files with 178 additions and 1 deletions

View File

@ -18,7 +18,7 @@ class Ccblife extends Common
* 不需要登录的方法
* @var array
*/
protected $noNeedLogin = ['autoLogin', 'login', 'callback'];
protected $noNeedLogin = ['autoLogin', 'login', 'callback', 'decryptParam'];
/**
* 不需要权限的方法
@ -220,6 +220,41 @@ class Ccblife extends Common
}
}
/**
* 解密建行参数(调试用)
* 用于前端测试页面解密建行传递的加密参数
*
* POST /addons/shopro/ccblife/decryptParam
*/
public function decryptParam()
{
try {
// 获取加密参数
$ccbParamSJ = $this->request->post('ccbParamSJ', '');
if (empty($ccbParamSJ)) {
$this->error('缺少 ccbParamSJ 参数');
}
// 获取配置
$config = config('ccblife');
// 解密参数
$decryptedParams = CcbUrlDecrypt::decrypt($ccbParamSJ, $config['service_id']);
if (!$decryptedParams) {
$this->error('参数解密失败');
}
// 返回解密后的数据
$this->success('解密成功', $decryptedParams);
} catch (\Exception $e) {
Log::error('建行参数解密失败: ' . $e->getMessage());
$this->error('解密失败: ' . $e->getMessage());
}
}
/**
* 手机号脱敏
*

View File

@ -178,10 +178,18 @@
<span class="label">当前环境:</span>
<span class="value" id="env-status">检测中...</span>
</div>
<div class="info-item">
<span class="label">设备类型:</span>
<span class="value" id="device-type">-</span>
</div>
<div class="info-item">
<span class="label">JSBridge 状态:</span>
<span class="value" id="bridge-status">未就绪</span>
</div>
<div class="info-item">
<span class="label">Bridge 对象:</span>
<span class="value" id="bridge-object">检测中...</span>
</div>
<div class="info-item">
<span class="label">登录状态:</span>
<span class="value" id="login-status">未登录</span>
@ -190,6 +198,10 @@
<span class="label">建行用户ID</span>
<span class="value" id="ccb-user-id">-</span>
</div>
<div class="info-item">
<span class="label">建行参数:</span>
<span class="value" id="ccb-param"></span>
</div>
</div>
<div class="divider"></div>
@ -197,6 +209,8 @@
<!-- 功能测试 -->
<h3 style="margin-bottom: 15px;">功能测试</h3>
<button class="btn" onclick="refreshEnv()">🔄 刷新环境检测</button>
<button class="btn" onclick="decryptCcbParam()">🔓 解密建行参数</button>
<button class="btn" onclick="getUserInfo()">获取建行用户信息</button>
<button class="btn btn-secondary" onclick="doAutoLogin()">执行自动登录</button>
<button class="btn btn-success" onclick="testPayment()">测试支付功能</button>
@ -207,6 +221,8 @@
<h3 style="margin-bottom: 15px;">调试功能</h3>
<button class="btn btn-secondary" onclick="checkUrlParams()">检查 URL 参数</button>
<button class="btn btn-secondary" onclick="showUserAgent()">显示 User-Agent</button>
<button class="btn btn-secondary" onclick="checkBridgeObjects()">检查 Bridge 对象</button>
<button class="btn btn-secondary" onclick="clearCache()">清除缓存</button>
<button class="btn btn-secondary" onclick="toggleDebug()">切换调试模式</button>
@ -259,6 +275,22 @@
envEl.innerHTML = '<span class="status status-warning">普通浏览器</span>';
}
// 设备类型
var deviceType = CcbLifeBridge.isIOS() ? 'iOS' : 'Android';
document.getElementById('device-type').textContent = deviceType;
// 检查 Bridge 对象
checkBridgeObjectsStatus();
// 检查建行参数
var params = CcbLifeBridge.getUrlParams();
if (params.ccbParamSJ) {
document.getElementById('ccb-param').innerHTML =
'<span class="status status-warning">已加密(点击解密按钮)</span>';
} else {
document.getElementById('ccb-param').textContent = '无';
}
// 检查登录状态
var token = localStorage.getItem('ccb_token');
var userInfo = localStorage.getItem('ccb_user_info');
@ -273,6 +305,50 @@
}
}
// 检查 Bridge 对象状态
function checkBridgeObjectsStatus() {
var bridgeObjects = [];
if (window.WebViewJavascriptBridge) {
bridgeObjects.push('WebViewJavascriptBridge');
}
if (window.mbspay) {
bridgeObjects.push('mbspay');
}
var bridgeEl = document.getElementById('bridge-object');
if (bridgeObjects.length > 0) {
bridgeEl.innerHTML = '<span class="status status-success">' +
bridgeObjects.join(', ') + '</span>';
} else {
bridgeEl.innerHTML = '<span class="status status-error">未检测到</span>';
}
}
// 刷新环境检测
function refreshEnv() {
updateEnvStatus();
// 重新检查 Bridge 就绪状态
if (CcbLifeBridge.isReady) {
document.getElementById('bridge-status').innerHTML =
'<span class="status status-success">已就绪</span>';
} else {
document.getElementById('bridge-status').innerHTML =
'<span class="status status-error">未就绪</span>';
// 等待 3 秒后重新检查
setTimeout(function() {
if (CcbLifeBridge.isReady) {
document.getElementById('bridge-status').innerHTML =
'<span class="status status-success">已就绪</span>';
}
}, 3000);
}
showResult('环境信息已刷新');
}
// 更新登录状态
function updateLoginStatus(data) {
document.getElementById('login-status').innerHTML =
@ -366,12 +442,78 @@
});
}
// 解密建行参数
function decryptCcbParam() {
var params = CcbLifeBridge.getUrlParams();
if (!params.ccbParamSJ) {
showResult('错误URL 中没有 ccbParamSJ 参数');
return;
}
showLoading(true);
// 调用后端接口解密
fetch('/addons/shopro/ccblife/decryptParam', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
ccbParamSJ: params.ccbParamSJ
})
})
.then(response => response.json())
.then(data => {
showLoading(false);
if (data.code === 1) {
var decrypted = data.data;
showResult('解密成功:\n' + JSON.stringify(decrypted, null, 2));
// 更新显示
document.getElementById('ccb-param').innerHTML =
'<span class="status status-success">已解密</span>';
// 如果有用户ID显示出来
if (decrypted.userid) {
document.getElementById('ccb-user-id').textContent = decrypted.userid;
}
} else {
showResult('解密失败:' + data.msg);
}
})
.catch(error => {
showLoading(false);
showResult('请求失败:' + error.message);
});
}
// 检查 URL 参数
function checkUrlParams() {
var params = CcbLifeBridge.getUrlParams();
showResult('URL 参数:\n' + JSON.stringify(params, null, 2));
}
// 显示 User-Agent
function showUserAgent() {
var ua = navigator.userAgent;
showResult('User-Agent\n' + ua);
}
// 检查 Bridge 对象
function checkBridgeObjects() {
var info = {
WebViewJavascriptBridge: typeof window.WebViewJavascriptBridge !== 'undefined',
mbspay: typeof window.mbspay !== 'undefined',
bridgeReady: CcbLifeBridge.isReady,
isIOS: CcbLifeBridge.isIOS(),
isInCcbApp: CcbLifeBridge.isInCcbApp()
};
showResult('Bridge 对象检测:\n' + JSON.stringify(info, null, 2));
}
// 清除缓存
function clearCache() {
localStorage.removeItem('ccb_token');