diff --git a/addons/shopro/controller/Ccblife.php b/addons/shopro/controller/Ccblife.php index 8136569..112f9fc 100644 --- a/addons/shopro/controller/Ccblife.php +++ b/addons/shopro/controller/Ccblife.php @@ -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()); + } + } + /** * 手机号脱敏 * diff --git a/public/ccblife-demo.html b/public/ccblife-demo.html index 7d5639e..3715b30 100644 --- a/public/ccblife-demo.html +++ b/public/ccblife-demo.html @@ -178,10 +178,18 @@ 当前环境: 检测中... +
+ 设备类型: + - +
JSBridge 状态: 未就绪
+
+ Bridge 对象: + 检测中... +
登录状态: 未登录 @@ -190,6 +198,10 @@ 建行用户ID: -
+
+ 建行参数: + +
@@ -197,6 +209,8 @@

功能测试

+ + @@ -207,6 +221,8 @@

调试功能

+ + @@ -259,6 +275,22 @@ envEl.innerHTML = '普通浏览器'; } + // 设备类型 + 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 = + '已加密(点击解密按钮)'; + } 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 = '' + + bridgeObjects.join(', ') + ''; + } else { + bridgeEl.innerHTML = '未检测到'; + } + } + + // 刷新环境检测 + function refreshEnv() { + updateEnvStatus(); + + // 重新检查 Bridge 就绪状态 + if (CcbLifeBridge.isReady) { + document.getElementById('bridge-status').innerHTML = + '已就绪'; + } else { + document.getElementById('bridge-status').innerHTML = + '未就绪'; + + // 等待 3 秒后重新检查 + setTimeout(function() { + if (CcbLifeBridge.isReady) { + document.getElementById('bridge-status').innerHTML = + '已就绪'; + } + }, 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 = + '已解密'; + + // 如果有用户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');