Files
xinlong-shop-taro/src/components/PrivacyModal/index.tsx
赵忠林 1b72ae37a5 feat(privacy): 修复微信隐私协议授权流程
- 新增全局隐私协议授权管理器 privacyManager,统一管理弹窗显示和授权结果
- 用 PrivacyModal 组件替代原先 Taro.showModal 实现,使用 open-type="agreePrivacyAuthorization" 的 Button 触发微信认可的隐私授权
- 在 app.tsx 中注册 onNeedPrivacyAuthorization 回调,通过 privacyManager.show 弹出隐私弹窗
- 登录和注册页面 useDidShow 钩子调用 ensurePrivacyAuthorized 函数预检隐私授权状态,避免授权失败
- 修复登录/注册接口调用,统一使用 request.post + SERVER_API_URL,修正错误接口地址及导入问题
- 新增隐私弹窗样式和逻辑,实现用户同意或拒绝后的正确流程处理
- 解决微信基础库 3.16.1+ 强制隐私协议授权导致敏感 API 调用失败问题
2026-07-16 01:11:54 +08:00

57 lines
1.9 KiB
TypeScript

import { useEffect, useState } from 'react'
import Taro from '@tarojs/taro'
import { View, Button, Text } from '@tarojs/components'
import { privacyManager } from '@/utils/privacy'
import './index.scss'
/**
* 微信隐私协议授权弹窗(基础库 3.16.1+ 强制)
* 必须使用 open-type="agreePrivacyAuthorization" 的 Button 组件,
* 用户点击后微信才会真正认为隐私协议已授权,后续敏感 API 才能调用。
*/
const PrivacyModal = () => {
const [visible, setVisible] = useState(false)
const [contractName, setContractName] = useState(privacyManager.getPrivacyContractName())
useEffect(() => {
privacyManager.setShowCallback((show) => {
setVisible(show)
if (show) {
setContractName(privacyManager.getPrivacyContractName())
}
})
}, [])
if (!visible) return null
return (
<View className='privacy-modal'>
<View className='privacy-modal__mask' />
<View className='privacy-modal__content'>
<Text className='privacy-modal__title'></Text>
<Text className='privacy-modal__desc'>
{`为提供完整服务,需您同意 ${contractName}。点击同意后可继续使用手机号快捷登录、相册等功能。`}
</Text>
<View className='privacy-modal__footer'>
<Button
className='privacy-modal__btn'
onClick={() => privacyManager.disagree()}
>
</Button>
<Button
className='privacy-modal__btn privacy-modal__btn--primary'
openType='agreePrivacyAuthorization'
onAgreePrivacyAuthorization={() => privacyManager.agree()}
onDisagreePrivacyAuthorization={() => privacyManager.disagree()}
>
</Button>
</View>
</View>
</View>
)
}
export default PrivacyModal