支付宝兼容
This commit is contained in:
+150
-18
@@ -1,37 +1,48 @@
|
||||
import {
|
||||
login,
|
||||
quickLogin,
|
||||
getMyIndexInfo,
|
||||
getWxUserPhoneNumber
|
||||
getWxUserPhoneNumber,
|
||||
getAliUserPhoneNumber
|
||||
} from "../config/api/user"
|
||||
import {
|
||||
URL,
|
||||
appid
|
||||
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 = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
// 1. 获取微信登录凭证
|
||||
// 1. 获取微信登录凭证(code -> 后端换 openId)
|
||||
uni.login({
|
||||
provider: 'weixin',
|
||||
success: async (loginRes) => {
|
||||
|
||||
try {
|
||||
if (loginRes.code) {
|
||||
// 2. 发送 code 到后端换取 token
|
||||
const result = await login({
|
||||
code: loginRes.code,
|
||||
appid: "wx2165f0be356ae7a9"
|
||||
})
|
||||
if (!loginRes.code) {
|
||||
throw new Error('获取微信登录凭证失败')
|
||||
}
|
||||
|
||||
if (result.code === 200) {
|
||||
// 3. 保存token和用户信息
|
||||
// 2. 调用统一快捷登录接口,后端根据 code 获取 openId,并按文档用 openId+userSource 处理
|
||||
const result = await quickLogin({
|
||||
loginType: 'WECHAT',
|
||||
appid: appid,
|
||||
code: loginRes.code
|
||||
})
|
||||
|
||||
uni.setStorageSync('token', result.data.LoginWxVo.access_token)
|
||||
uni.setStorageSync('client_id', result.data.LoginWxVo.client_id)
|
||||
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 => {
|
||||
@@ -40,13 +51,12 @@ export const wxLogin = () => {
|
||||
|
||||
resolve(result.data)
|
||||
} else {
|
||||
throw new Error(result.message || '登录失败')
|
||||
throw new Error(result.msg || '登录失败,未返回令牌')
|
||||
}
|
||||
} else {
|
||||
throw new Error('获取微信登录凭证失败')
|
||||
throw new Error(result.msg || result.message || '登录失败')
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
uni.showToast({
|
||||
title: error.message || '登录失败',
|
||||
icon: 'none'
|
||||
@@ -65,6 +75,79 @@ export const wxLogin = () => {
|
||||
})
|
||||
}
|
||||
|
||||
// 统一快捷登录 - 支付宝小程序登录
|
||||
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,
|
||||
code: 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',
|
||||
phonenumber,
|
||||
smsCode
|
||||
})
|
||||
}
|
||||
|
||||
// 检查登录状态
|
||||
// export const checkLogin = () => {
|
||||
// const token = uni.getStorageSync('token')
|
||||
@@ -106,6 +189,55 @@ export const getUserPhoneNumber = (code) => {
|
||||
})
|
||||
}
|
||||
|
||||
// 支付宝:在已授权 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) => {
|
||||
|
||||
Reference in New Issue
Block a user