import { login, quickLogin, getMyIndexInfo, getWxUserPhoneNumber, getAliUserPhoneNumber } from "../config/api/user" import { URL, appid, ZFBappid } from "@/config/url.js" import { getCommonByBrand } from "@/config/api/system" import { HELP_CONTENT } from "@/constants/help" // import { GET_PHONE_NUMBER_URL } from "../config/url" // 统一快捷登录 - 微信小程序登录(使用 /app/user/quickLogin) export const wxLogin = (phoneCode) => { return new Promise((resolve, reject) => { // 1. 获取微信登录凭证(code -> 后端换 openId) uni.login({ provider: 'weixin', success: async (loginRes) => { try { if (!loginRes.code) { throw new Error('获取微信登录凭证失败') } // 2. 调用统一快捷登录接口,后端根据 code 获取 openId,并按文档用 openId+userSource 处理 const result = await quickLogin({ loginType: 'WECHAT', appid: appid, loginCode: loginRes.code, code:phoneCode }) if (result.code === 200 && result.data) { // 3. 兼容多种返回 token 结构 const token = result.data.access_token || result.data.token || result.token const clientId = result.data.client_id || result.data.clientId || result.client_id if (token) { uni.setStorageSync('token', token) if (clientId) { uni.setStorageSync('client_id', clientId) } // 4. 登录成功后获取并缓存客服电话 fetchAndCacheCustomerPhone().catch(err => { console.error('获取客服电话失败,但不影响登录', err) }) resolve(result.data) } else { throw new Error(result.msg || '登录失败,未返回令牌') } } else { throw new Error(result.msg || result.message || '登录失败') } } catch (error) { uni.showToast({ title: error.message || '登录失败', icon: 'none' }) reject(error) } }, fail: (error) => { uni.showToast({ title: '微信登录失败', icon: 'none' }) reject(error) } }) }) } // 统一快捷登录 - 支付宝小程序登录 export const alipayLogin = () => { return new Promise((resolve, reject) => { // 仅在支付宝小程序环境可用 // #ifdef MP-ALIPAY my.getAuthCode({ scopes: ['auth_user'], success: async (res) => { try { if (!res.authCode) { throw new Error('获取支付宝授权码失败') } const result = await quickLogin({ loginType: 'ALIPAY', appid: ZFBappid, loginCode: res.authCode }) if (result.code === 200 && result.data) { const token = result.data.access_token || result.data.token || result.token const clientId = result.data.client_id || result.data.clientId || result.client_id if (token) { uni.setStorageSync('token', token) if (clientId) { uni.setStorageSync('client_id', clientId) } fetchAndCacheCustomerPhone().catch(err => { console.error('获取客服电话失败,但不影响登录', err) }) resolve(result.data) } else { throw new Error(result.msg || '登录失败,未返回令牌') } } else { throw new Error(result.msg || result.message || '登录失败') } } catch (error) { uni.showToast({ title: error.message || '登录失败', icon: 'none' }) reject(error) } }, fail: (error) => { uni.showToast({ title: '支付宝登录失败', icon: 'none' }) reject(error) } }) // #endif // #ifndef MP-ALIPAY reject(new Error('当前环境不支持支付宝登录')) // #endif }) } // 统一快捷登录 - 短信验证码登录(主要用于 H5/海外) export const smsQuickLogin = (phonenumber, smsCode) => { return quickLogin({ loginType: 'SMS', appid: appid, phonenumber, smsCode }) } // 检查登录状态 // export const checkLogin = () => { // const token = uni.getStorageSync('token') // return !!token // } // 获取用户信息 export const getUserInfo = () => { return new Promise(async (res, rej) => { const result = await getMyIndexInfo({ isHide: false, }) res(result) }) } // 获取用户手机号 export const getUserPhoneNumber = (code) => { return new Promise(async (resolve, reject) => { try { console.log('开始请求获取手机号,code=', code) // 发送请求到后端获取手机号 const res = await getWxUserPhoneNumber({ code: code, // 微信获取手机号授权后的临时code appid: appid }) if (res) { console.log('请求获取手机号接口成功:', JSON.stringify(res)) resolve(res) } else { reject(new Error('服务器返回空数据')) } } catch (error) { console.error('获取手机号过程中出现异常:', error) reject(new Error('获取手机号异常: ' + (error.message || JSON.stringify(error)))) } }) } // 支付宝:在已授权 phoneNumber 的前提下调用 my.getPhoneNumber,再提交后端解密/绑定,返回手机号 // 官方 API: https://opendocs.alipay.com/mini/01f46f19_my.getPhoneNumber?pathHash=a67c2790 export const getAlipayUserPhoneNumber = () => { return new Promise((resolve, reject) => { // #ifdef MP-ALIPAY if (typeof my === 'undefined' || typeof my.getPhoneNumber !== 'function') { reject(new Error('当前环境不支持支付宝获取手机号')) return } my.getPhoneNumber({ success: async (res) => { try { // res.response 实际是一个 JSON 字符串,形如: // {"response":"...","sign":"...","sign_type":"RSA2","encrypt_type":"AES","charset":"UTF-8"} // 这里先做 JSON 解析,再把字段按 JSON 结构传给后端 let parsed = {} if (res && res.response) { try { parsed = typeof res.response === 'string' ? JSON.parse(res.response) : res.response } catch (parseErr) { console.error('解析支付宝手机号报文失败:', parseErr, res.response) throw parseErr } } const payload = { appid: ZFBappid, ...parsed } const result = await getAliUserPhoneNumber(payload) resolve(result) } catch (e) { reject(e) } }, fail: (err) => { reject(new Error(err?.errorMessage || err?.message || '支付宝获取手机号失败')) } }) // #endif // #ifndef MP-ALIPAY reject(new Error('当前环境不支持支付宝获取手机号')) // #endif }) } // 调用微信支付分接口 export const initiateWeChatScorePayment = (paymentData) => { return new Promise((resolve, reject) => { // 确保paymentData包含所需数据 if (!paymentData || !paymentData.data || !paymentData.data.package) { reject(new Error('支付参数不完整')); return; } // 使用wx.openBusinessView打开微信支付分小程序 wx.openBusinessView({ businessType: 'wxpayScoreUse', extraData: { mch_id: paymentData.data.mch_id, package: paymentData.data.package }, success: (businessRes) => { // 根据返回结果判断是否完成支付 if (businessRes.errMsg === 'openBusinessView:ok') { resolve(businessRes); } else { reject(new Error('支付流程未完成')); } }, fail: (error) => { console.error('微信支付分小程序调用失败', error); uni.showToast({ title: error.errMsg || '支付分接口调用失败', icon: 'none' }); reject(error); } }); }); } export const getQueryString = function(url, name) { var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i') var r = url.substr(1).match(reg) if (r != null) { return r[2] } return null; } // 获取并缓存客服电话 export const fetchAndCacheCustomerPhone = async () => { try { // 获取当前语言 const locale = uni.getLocale ? uni.getLocale() : uni.getSystemInfoSync().language const brandName = 'Isidaya' console.log('获取客服电话,当前语言:', locale, '品牌名称:', brandName) // 调用接口获取客服电话 const res = await getCommonByBrand(brandName) if (res.code === 200 && res.data && res.data.servicePhone) { const phone = res.data.servicePhone // 缓存客服电话 uni.setStorageSync('customerPhone', phone) console.log('客服电话已缓存:', phone) return phone } else { console.warn('获取客服电话失败,使用内置默认电话') // 使用内置默认电话并缓存 const defaultPhone = HELP_CONTENT.CONTACT.PHONE.VALUE uni.setStorageSync('customerPhone', defaultPhone) return defaultPhone } } catch (error) { console.error('获取客服电话出错,使用内置默认电话:', error) // 使用内置默认电话并缓存 const defaultPhone = HELP_CONTENT.CONTACT.PHONE.VALUE uni.setStorageSync('customerPhone', defaultPhone) return defaultPhone } } // 从缓存获取客服电话 export const getCustomerPhone = () => { const phone = uni.getStorageSync('customerPhone') // 如果没有缓存,返回内置默认值 return phone || HELP_CONTENT.CONTACT.PHONE.VALUE }