330 lines
9.4 KiB
JavaScript
330 lines
9.4 KiB
JavaScript
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
|
||
} |