diff --git a/public/ccblife-demo.html b/public/ccblife-demo.html index 3715b30..098bbaf 100644 --- a/public/ccblife-demo.html +++ b/public/ccblife-demo.html @@ -211,6 +211,7 @@ + @@ -397,7 +398,19 @@ // 测试支付功能 function testPayment() { - // 这里需要先调用后端接口生成支付串 + // 检查是否已登录 + var token = localStorage.getItem('ccb_token'); + if (!token) { + showResult('错误:未登录\n\n请先执行"测试登录入库"获取 Token'); + return; + } + + // 检查是否在建行 App 内 + if (!CcbLifeBridge.isInCcbApp()) { + showResult('警告:不在建行生活 App 内\n\n支付功能需要在建行 App 中才能调起'); + } + + // 输入订单ID var orderId = prompt('请输入订单ID(测试用):', '1'); if (!orderId) { @@ -405,13 +418,14 @@ } showLoading(true); + showResult('正在生成支付串...\n1. 验证订单\n2. 生成支付串\n3. 调起建行支付'); - // 模拟调用后端生成支付串 + // 调用后端生成支付串 fetch('/addons/shopro/ccbpayment/createPayment', { method: 'POST', headers: { 'Content-Type': 'application/json', - 'token': localStorage.getItem('ccb_token') || '' + 'token': token }, body: JSON.stringify({ order_id: orderId @@ -422,23 +436,131 @@ showLoading(false); if (data.code === 1) { - // 调起支付 - CcbLifeBridge.payment({ - payment_string: data.data.payment_string - }, function(result) { - if (result.success) { - showResult('支付调起成功,请在建行 App 内完成支付'); - } else { - showResult('支付调起失败:' + result.error); - } - }); + var paymentData = data.data; + + showResult('✅ 支付串生成成功!\n\n' + + '订单编号:' + paymentData.order_sn + '\n' + + '支付流水号:' + paymentData.pay_flow_id + '\n' + + '支付金额:¥' + paymentData.amount + '\n' + + 'MAC 签名:' + paymentData.mac.substr(0, 20) + '...\n\n' + + '支付串:\n' + paymentData.payment_string.substr(0, 100) + '...\n\n' + + '正在调起支付...' + ); + + // 调起建行支付 + if (CcbLifeBridge.isInCcbApp()) { + CcbLifeBridge.payment({ + payment_string: paymentData.payment_string + }, function(result) { + if (result.success) { + showResult('✅ 支付调起成功!\n\n请在建行 App 内完成支付\n\n' + + '支付完成后,页面会自动跳转'); + + // 轮询查询订单状态 + pollPaymentStatus(orderId); + } else { + showResult('❌ 支付调起失败:' + result.error); + } + }); + } else { + showResult('⚠️ 不在建行 App 内,无法调起支付\n\n' + + '但支付串已生成,可以手动测试:\n\n' + + '支付 URL:\n' + paymentData.payment_url + ); + } } else { - showResult('生成支付串失败:' + data.msg); + showResult('❌ 生成支付串失败:' + data.msg); } }) .catch(error => { showLoading(false); - showResult('请求失败:' + error.message); + showResult('❌ 请求失败:' + error.message); + }); + } + + // 轮询查询支付状态 + function pollPaymentStatus(orderId) { + var token = localStorage.getItem('ccb_token'); + var pollCount = 0; + var maxPoll = 60; // 最多轮询60次(5分钟) + + var pollInterval = setInterval(function() { + pollCount++; + + fetch('/addons/shopro/order/detail?id=' + orderId, { + method: 'GET', + headers: { + 'token': token + } + }) + .then(response => response.json()) + .then(data => { + if (data.code === 1) { + var order = data.data; + + if (order.status === 'paid' || order.status === 'completed') { + clearInterval(pollInterval); + showResult('✅ 支付成功!\n\n' + + '订单编号:' + order.order_sn + '\n' + + '订单状态:' + order.status + '\n' + + '支付时间:' + new Date(order.paid_time).toLocaleString() + ); + } else if (pollCount >= maxPoll) { + clearInterval(pollInterval); + showResult('⏱ 查询超时\n\n请手动刷新订单状态'); + } + } + }) + .catch(error => { + console.error('轮询订单状态失败:', error); + }); + + }, 5000); // 每5秒查询一次 + } + + // 测试登录入库 + function testLogin() { + var params = CcbLifeBridge.getUrlParams(); + + if (!params.ccbParamSJ) { + showResult('错误:URL 中没有 ccbParamSJ 参数\n\n请从建行生活 App 跳转到此页面,或在 URL 中添加 ccbParamSJ 参数'); + return; + } + + showLoading(true); + showResult('正在登录...\n1. 解密建行参数\n2. 验证用户信息\n3. 创建/更新用户\n4. 生成登录 Token'); + + // 调用后端登录接口 + fetch('/addons/shopro/ccblife/login?ccbParamSJ=' + encodeURIComponent(params.ccbParamSJ), { + method: 'GET' + }) + .then(response => response.json()) + .then(data => { + showLoading(false); + + if (data.code === 1) { + var loginData = data.data; + + // 保存 token 和用户信息 + localStorage.setItem('ccb_token', loginData.token); + localStorage.setItem('ccb_user_info', JSON.stringify(loginData.user_info)); + + // 更新页面显示 + updateLoginStatus({ userInfo: loginData.user_info }); + + showResult('✅ 登录成功!\n\n' + + '用户信息:\n' + JSON.stringify(loginData.user_info, null, 2) + '\n\n' + + 'Token:' + loginData.token.substr(0, 20) + '...\n\n' + + '是否新用户:' + (loginData.user_info.is_new ? '是' : '否') + '\n\n' + + '跳转URL:' + loginData.redirect_url + ); + } else { + showResult('❌ 登录失败:' + data.msg); + } + }) + .catch(error => { + showLoading(false); + showResult('❌ 请求失败:' + error.message); }); }