hookehuyr

feat(微信授权): 在微信环境中自动触发授权流程

在微信内置浏览器环境下点击购买时,若检测到未完成微信授权,系统将自动发起一次微信授权流程并中止本次购买。授权完成后再次点击可进入结算。开发环境保留现有调试行为不触发授权。
......@@ -45,6 +45,11 @@ https://oa-dev.onwall.cn/f/mlaj
- 非微信环境(付费课):提示“请在微信内打开进行购买”,不进入结算。
- 位置:`/src/views/courses/CourseDetailPage.vue``handlePurchase` 中,使用 `wxInfo` 进行环境判断。
- 微信授权自动触发(微信环境内)
- 行为:在微信内置浏览器环境下点击“购买”时,若检测到未完成微信授权(`openid_has=false`),系统将自动发起一次微信授权流程并中止本次购买;授权完成后再次点击可进入结算。
- 开发环境:不触发微信授权流程(保留现有调试行为)。
- 位置:`/src/views/courses/CourseDetailPage.vue``handlePurchase` 中,调用 `getAuthInfoAPI()` 探测并使用 `startWxAuth()` 触发授权。
- 401拦截策略优化(公开页面不再跳登录)
- 行为:接口返回 `code=401` 时,不再对公开页面(如课程详情 `/courses/:id`)进行登录重定向;仅当当前路由确实需要登录权限时才跳转至登录页。
- 原理:响应拦截器调用路由守卫 `checkAuth` 判断当前路由是否为受限页面,受限则清理登录信息并附带 `redirect` 重定向至登录页;公开页面保持当前页,由业务自行处理401。
......
......@@ -223,7 +223,7 @@
</svg>
收藏
</button>
<button class="flex flex-col items-center text-gray-500 text-xs" @click="open_consult_dialog">
<!-- <button class="flex flex-col items-center text-gray-500 text-xs" @click="open_consult_dialog">
<svg
xmlns="http://www.w3.org/2000/svg"
class="h-6 w-6"
......@@ -239,7 +239,7 @@
/>
</svg>
咨询
</button>
</button> -->
</div>
<div class="flex items-center">
<div v-if="!course?.is_buy" class="mr-2">
......@@ -378,6 +378,8 @@ import { useCart } from '@/contexts/cart'
import { useAuth } from '@/contexts/auth'
import { useTitle } from '@vueuse/core';
import { wxInfo } from '@/utils/tools';
import { startWxAuth } from '@/router/guards'
import { getAuthInfoAPI } from '@/api/auth'
import { showToast, showDialog, showImagePreview } from 'vant';
import { formatDate } from '@/utils/tools'
import { sharePage } from '@/composables/useShare.js'
......@@ -693,8 +695,16 @@ const RightContent = defineComponent({
const rightContent = h(RightContent)
// 立即购买操作
const handlePurchase = () => {
/**
* @function handlePurchase
* @description 立即购买操作:
* 1. 检查登录状态;未登录跳转到登录页。
* 2. 非微信环境(生产)对非免费课程进行环境拦截提示。
* 3. 微信环境内检查是否已完成授权;未授权则自动发起一次微信授权流程。
* 4. 将课程加入购物车并进入结算页。
* @returns {void}
*/
const handlePurchase = async () => {
// 检查用户是否已登录
if (!currentUser.value) {
showToast('请先登录')
......@@ -713,6 +723,22 @@ const handlePurchase = () => {
return
}
// 微信环境内授权检查:未授权自动触发一次授权流程
if (!import.meta.env.DEV && wxInfo().isWeiXin) {
try {
const { code, data } = await getAuthInfoAPI();
if (code && !data.openid_has) {
showToast('正在进行微信授权,请稍后...')
await startWxAuth()
return
}
} catch (e) {
// 探测失败也尝试触发授权
await startWxAuth()
return
}
}
if (course.value) {
// 调试日志:检查course.value.form_url的值
console.log('CourseDetailPage - course.value.form_url:', course.value.form_url)
......