diff --git a/frontend/sheep/platform/provider/ccblife/index.js b/frontend/sheep/platform/provider/ccblife/index.js index d183b10..7f76f55 100644 --- a/frontend/sheep/platform/provider/ccblife/index.js +++ b/frontend/sheep/platform/provider/ccblife/index.js @@ -484,115 +484,100 @@ const CcbLifePlatform = { try { // #ifdef H5 const isIOS = this.isIOS(); - console.log('[建行收银台] 设备类型:', isIOS ? 'iOS' : 'Android'); + console.log('[建行收银台] 设备:', isIOS ? 'iOS' : 'Android'); if (isIOS) { - // ⭐ iOS: 使用官方文档的URL Scheme(5.3.1章节) - console.log('[建行收银台] iOS: 使用官方URL Scheme调起'); - // 注意:需要对支付串进行encodeURIComponent编码 - const payUrl = 'ccbpayment://openCashier?params=' + encodeURIComponent(options.payment_string); - console.log('[建行收银台] 支付串原始长度:', options.payment_string.length); - console.log('[建行收银台] URL编码后总长度:', payUrl.length); - console.log('[建行收银台] URL前200字符:', payUrl.substring(0, 200)); - - // ⚠️ iOS URL Scheme 长度限制检查(通常为2048字符) - if (payUrl.length > 2048) { - console.error('[建行收银台] ❌ iOS URL长度超限:', payUrl.length, '> 2048'); - reject({ - code: -1, - msg: 'iOS URL长度超限,请联系技术支持' - }); - return; - } - - try { - console.log('[建行收银台] 准备调起iOS收银台...'); - window.location.href = payUrl; - console.log('[建行收银台] window.location.href已设置'); - - // iOS调起后认为成功(实际支付结果通过异步通知获取) - setTimeout(() => { - console.log('[建行收银台] ✅ iOS收银台已调起'); - resolve({ - code: 0, - msg: '已调起建行支付' - }); - }, 500); - } catch (error) { - console.error('[建行收银台] ❌ iOS调起失败:', error); - reject({ - code: -1, - msg: 'iOS调起失败: ' + error.message - }); - } + this._callIOSCashier(options.payment_string, resolve, reject); } else { - // ⭐ Android: 使用官方文档的JSBridge方法(5.3.1章节) - console.log('[建行收银台] Android: 检查CCBAndroid对象...'); - console.log('[建行收银台] window.CCBAndroid存在:', !!window.CCBAndroid); - console.log('[建行收银台] CCBAndroid.callCashier存在:', !!(window.CCBAndroid && window.CCBAndroid.callCashier)); - - if (window.CCBAndroid && typeof window.CCBAndroid.callCashier === 'function') { - console.log('[建行收银台] 调用CCBAndroid.callCashier()...'); - console.log('[建行收银台] 支付串长度:', options.payment_string.length); - - // 调用官方文档指定的方法 - window.CCBAndroid.callCashier(options.payment_string); - - // Android调起后认为成功(实际支付结果通过异步通知获取) - setTimeout(() => { - console.log('[建行收银台] ✅ Android收银台已调起'); - resolve({ - code: 0, - msg: '已调起建行支付' - }); - }, 500); - } else { - console.error('[建行收银台] ❌ CCBAndroid对象不存在或callCashier方法不存在'); - console.error('[建行收银台] window对象包含的键:', Object.keys(window).filter(k => k.toLowerCase().includes('pay') || k.toLowerCase().includes('ccb') || k.toLowerCase().includes('android'))); - - // 降级尝试:旧版本可能使用mbspay - if (window.mbspay && typeof window.mbspay.directpay === 'function') { - console.warn('[建行收银台] ⚠️ 降级使用mbspay.directpay()(旧版本)'); - window.mbspay.directpay(options.payment_string); - setTimeout(() => { - console.log('[建行收银台] ✅ Android收银台已调起(降级方式)'); - resolve({ - code: 0, - msg: '已调起建行支付' - }); - }, 500); - } else { - reject({ - code: -1, - msg: '建行支付环境异常,请更新建行生活App' - }); - } - } + this._callAndroidCashier(options.payment_string, resolve, reject); } // #endif // #ifndef H5 - console.error('[建行收银台] ❌ 非H5环境'); - reject({ - code: -1, - msg: '仅支持H5环境' - }); + reject({ code: -1, msg: '仅支持H5环境' }); // #endif } catch (error) { - console.error('[建行收银台] ❌ 调起失败:', error); - console.error('[建行收银台] 错误类型:', error.name); - console.error('[建行收银台] 错误信息:', error.message); - console.error('[建行收银台] 错误堆栈:', error.stack); - reject({ - code: -1, - msg: error.message || '调起支付失败' - }); + console.error('[建行收银台] ❌ 调起异常:', error.message); + reject({ code: -1, msg: error.message || '调起支付失败' }); } console.log('[建行收银台] ==========================================='); }); }, + /** + * iOS收银台调起(内部方法) + * 使用旧版 mbspay://direct + */ + _callIOSCashier(paymentString, resolve, reject) { + console.log('[iOS收银台] 支付串长度:', paymentString.length); + + // ⭐ iOS使用旧版URL Scheme(实测更稳定) + const payUrl = 'mbspay://direct?' + paymentString; + console.log('[iOS收银台] URL长度:', payUrl.length); + + try { + // 方式1: window.location.href + window.location.href = payUrl; + console.log('[iOS收银台] window.location.href已设置'); + + // 方式2: iframe降级(100ms后) + setTimeout(() => { + const iframe = document.createElement('iframe'); + iframe.style.display = 'none'; + iframe.src = payUrl; + document.body.appendChild(iframe); + setTimeout(() => document.body.removeChild(iframe), 1000); + }, 100); + + // 认为调起成功 + setTimeout(() => { + console.log('[iOS收银台] ✅ 已调起'); + resolve({ code: 0, msg: '已调起建行支付' }); + }, 500); + + } catch (error) { + console.error('[iOS收银台] ❌ 调起失败:', error.message); + reject({ code: -1, msg: error.message }); + } + }, + + /** + * Android收银台调起(内部方法) + */ + _callAndroidCashier(paymentString, resolve, reject) { + console.log('[Android收银台] 支付串长度:', paymentString.length); + + // 方式1: 新版 CCBAndroid.callCashier + if (window.CCBAndroid?.callCashier) { + console.log('[Android收银台] 使用 CCBAndroid.callCashier'); + window.CCBAndroid.callCashier(paymentString); + setTimeout(() => { + console.log('[Android收银台] ✅ 已调起'); + resolve({ code: 0, msg: '已调起建行支付' }); + }, 500); + return; + } + + // 方式2: 旧版 mbspay.directpay + if (window.mbspay?.directpay) { + console.log('[Android收银台] 使用 mbspay.directpay(旧版)'); + window.mbspay.directpay(paymentString); + setTimeout(() => { + console.log('[Android收银台] ✅ 已调起'); + resolve({ code: 0, msg: '已调起建行支付' }); + }, 500); + return; + } + + // 无可用方法 + console.error('[Android收银台] ❌ 无可用调起方法'); + console.error('[Android收银台] window对象:', Object.keys(window).filter(k => + k.toLowerCase().includes('ccb') || k.toLowerCase().includes('pay') + )); + reject({ code: -1, msg: '建行支付环境异常,请更新App' }); + }, + /** * 判断是否iOS */