Files
uni-fans-score/util/index.js
T
2026-03-16 11:52:27 +08:00

330 lines
9.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 isEnglish = locale && (locale.toLowerCase().startsWith('en') || locale.toLowerCase().includes('en'))
// 根据语言设置品牌名称
const brandName = isEnglish ? 'fdzpower' : '风电者'
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
}