【Taro】微信小程序关于隐私协议改造

之前微信刚公布要求整改小程序获取用户隐私接口的改造公告那会,Taro还没有支持这方面的更新,于是当时就暂时搁置了一下,后面发现有人回复了我的提问,并且给出了解决方案。按照大佬给出的解决方案试了下,果然可行,所以在此记录分享一下!

首先,当时的帖子在这:微信隐私协议taro的解决方案
 

我这边整理了一下完整的解决方案。

我这边用的是:taro3+ts+taro-ui

小程序的基础调试库切到3.0.0,防止开发者工具报相关API找不到。

其次,执行

npm i @tarojs/plugin-inject -D

安装插件,这个插件在这里的作用是绕过taro的编译,将自定义的属性和方法能够传递到编译后的微信组件上。

//taro组件
<Button abc="123">自定义属性</Button>

//编译后的微信小程序
<button abc="123">自定义属性</button>

然后在app.config.ts文件中,添加

const appConfig = {
  window: {},
  lazyCodeLoading: '',
  requiredPrivateInfos: [],
  permission: {},
  __usePrivacyCheck__:true,//开启隐私校验
}

接着在config/index.js文件夹下,修改小程序的配置,将@tarojs/plugin-inject插件添加到插件配置中去,给taro的Button组件添加自定义方法名“bindagreeprivacyauthorization”,目前taro的最新版本听说已经支持了,但是应该没人敢擅自升级公司的框架版本吧.....我升了下,运行不起来,放弃了。

const config = {
  projectName: "小程序",
  babel: {
    plugins: [
      ['@tarojs/plugin-inject',{
        components:{
          Button:{
            bindagreeprivacyauthorization: ""
          }
        }
      }]
    ]
  },

然后因为我用了ts,所以还需要在项目根目录的global.d.ts文件下对这个Button的ts做添加。如果没用的可以跳过这一步。

declare module '@tarojs/components' {
  export * from '@tarojs/components/types/index';
  import { ComponentType } from 'react';
  import { ButtonProps as OldButtonProps } from '@tarojs/components/types/Button';

  // 修改的Props
  interface ButtonProps extends OldButtonProps {
    bindagreeprivacyauthorization?: any;
  }

  export const Button: ComponentType<ButtonProps>;
}

准备工作就到此结束,下面开始封装隐私协议弹窗。

import { Text, Button } from "@tarojs/components";
import { showToast } from "@tarojs/taro";
import React, { FC, useEffect, useState } from "react";
import { AtModal, AtModalAction, AtModalContent, AtModalHeader } from "taro-ui";
import classes from "./index.module.scss"

interface ModalType {
    onConfirm: any;
    isOpened: boolean;
}
const WxAgreementModal: FC<ModalType> = ({ onConfirm, isOpened }) => {
    //控制隐私协议弹窗
    const [open, setOpen] = useState(false)

    //如果用户取消授权,需要再次唤醒
    useEffect(() => {
        if (isOpened) {
            setOpen(true)
        }
    }, [isOpened])

    //初始化的时候监听是否需要授权
    useEffect(() => {
        wx.getPrivacySetting({
            success: res => {
                console.log("是否需要授权:", res.needAuthorization, "隐私协议的名称为:", res.privacyContractName)
                if (res.needAuthorization) {
                    setOpen(true)
                } else {
                    onConfirm('agree')
                }
            },
            fail: () => { },
            complete: () => { },
        })

    }, [])

    //点击隐私协议
    const goWxAgreement = () => {
        wx.openPrivacyContract({
            success: (res) => {
                console.log('打开隐私协议成功', res)
            }, // 打开成功
            fail: (res) => {
                console.error('隐私协议打开失败', res)
            }, // 打开失败
            complete: () => { }
        })
    }

    //用户取消
    const cancelAgreementModal = () => {
        showToast({
            title: '您取消了授权',
            icon: 'none',
            duration: 2000
        })
        setOpen(false)
        onConfirm('disagree')
    }

    //这里微信会同步收到用户同意隐私协议,在这个方法或以后调用涉及用户隐私相关api就可以正常获取了
    const handleAgreePrivacyAuthorization = () => {
        console.log('同意')
    }

    //上面的回调方法打印不了,也就是目前只上报,不作回调,没办法关闭弹窗咱们只能自己设置点击事件关闭弹窗了
    const handleClickConfirm = () => {
        onConfirm('agree')
        setOpen(false)
    }

    return <AtModal
        isOpened={open}
        onClose={cancelAgreementModal}
        closeOnClickOverlay={false}
        className={classes.agreementModal}
    >
        <AtModalContent>
            在你使用【xxxx】小程序服务之前,请仔细阅读<Text style={{ color: '#3b7eff' }} onClick={goWxAgreement}>xxxx隐私保护指引</Text>。如你同意<Text style={{ color: '#3b7eff' }} onClick={goWxAgreement}>xxxx隐私保护指引</Text>,请点击“同意”开始使用【xxxx】。
        </AtModalContent>
        <AtModalAction>
            <Button onClick={cancelAgreementModal}>拒绝</Button>
            <Button id="agree-btn" openType={"agreePrivacyAuthorization" as any} bindagreeprivacyauthorization={handleAgreePrivacyAuthorization} onClick={handleClickConfirm}>同意</Button>
        </AtModalAction>
    </AtModal>
}

export default WxAgreementModal

举例在登录页中使用是这样的

const Home = () =>{
    const [phoneNumberModalVisible, setPoneNumberModalVisible] = useState<boolean>(false)
    const [isAccredit, setIsAccredit] = useState(false);
    const [openAgreement,setOpenAgreement] = useState(false);

    //微信将获取用户手机号的api改成了收费接口,如果是新用户再弹出获取手机号的弹窗
     const getLogin = async () => {
        try {
            if (isAccredit) {
                const res = await request.get('xxxx', { data: { code: getStorageSync('AUTH_CODE') } });
                if (res.success) {
                    const data = res.data || {};
                    if (data.success) {
                        showToast({
                            title: '登录成功',
                            icon: 'success',
                            duration: 2000
                        })
                        setTimeout(() => {
                            navigateBack(-1)
                        }, 2000)
                        return;
                    }

                    // 判断有没有绑定手机号
                    if (!data?.phone) {
                        setPoneNumberModalVisible(true)
                    }
                }
            } else {
                //重新唤醒隐私弹窗
                setOpenAgreement(true)
            }
        } catch (e) {
            console.error(e)
        }
    }

    //查看微信授权
    const handleWxModal = (status) => {
        if (status === 'disagree') {
            setIsAccredit(false)
        } else {
            setIsAccredit(true)
        }
        setOpenAgreement(false)
    }

    //手机号授权回调
    const handleGetPhoneNumber = async e => {
            try {
                const { encryptedData, iv } = e.detail
                if (!encryptedData || !iv) return Promise.reject()
                if (e.detail) {
                    await setStorageSync('Phone', e.detail)
                }
            } catch (err) {
                console.log(err)
            }
    }
  


    return <View>
        <Button onClick={getLogin} >
            手机号快捷登录
        </Button>

        {/* 提示手机绑定 */}
        <AtModal isOpened={phoneNumberModalVisible}>
            <AtModalContent>
                <View>授权绑定您的手机号</View>
            </AtModalContent>
            <AtModalAction>
                <Button onClick={handleReject}>拒绝</Button>
                <Button openType="getPhoneNumber" onGetPhoneNumber={handleGetPhoneNumber}>
                    允许
                </Button>
            </AtModalAction>
        </AtModal>
           

        {/* 隐私弹窗 */}
        <WxAgreementModal isOpened={openAgreement} onConfirm={handleWxModal} />
    </View>
}

如果登录作为业务必要的入口的话,在登录这里做一下这样的操作,后面不管是再监听用户位置啥的都不需要再授权了 。

另外说一下,微信官方给解决方案

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 要实现taro微信小程序登录,你需要做以下几步: 1.在微信公众平台注册小程序并获取小程序AppID。 2.在小程序中使用微信登录授权组件,用户点击授权按钮后,获取到用户的授权信息,包括用户的openid和session_key。 3.将用户的openid和session_key发送给后端服务器进行验证。后端服务器可以使用微信提供的接口校验用户信息是否正确,同时可以自己进行逻辑处理,例如将用户信息存储到数据库中,生成token等。 4.后端服务器返回校验结果给小程序小程序根据结果进行相应的处理,例如跳转到主页或者提示用户登录失败等。 需要注意的是,用户的openid和session_key是敏感信息,需要加密传输和存储,以保证用户信息的安全性。 ### 回答2: taro是一种开发工具,用于创建小程序,而微信小程序是一种在微信平台上运行的应用程序。要在taro中实现微信小程序的登录功能,可以按照以下步骤进行操作。 首先,在小程序的app.js文件中引入taro框架和相关组件,然后在页面页面代码中引入taro的按钮组件,用于触发登录事件。 然后,在小程序的配置文件app.json中配置登录所需的权限,例如获取用户信息的权限等。 接下来,在小程序的登录页面中,可以使用taro提供的登录API,调用微信的登录接口,获取到用户的临时登录凭证code。 然后,将code发送给后端服务器,并使用code调用微信提供的接口,获取到用户的唯一标识openid和用户的会话秘钥sessionKey。 在获取到用户的openid后,可以根据业务需求将用户的信息存储到数据库中,或者进行进一步的用户信息获取和个性化设置。 最后,在小程序中进行用户登录状态的管理,可以使用taro的状态管理工具,在登录成功后将用户的登录状态设置为已登录,并在需要验证登录状态的页面中进行判断。 总之,通过在taro框架下对微信小程序登录流程进行处理,可以实现用户登录和身份验证功能,为用户提供更便捷、安全的使用体验。 ### 回答3: taro是一种多端开发框架,可以用于开发微信小程序。使用taro开发微信小程序登录功能的具体步骤如下: 1. 首先,在taro项目中创建一个登录页面,可以使用taro提供的组件进行布局和样式设置。 2. 在登录页面的按钮事件中,调用微信小程序提供的wx.login()方法,获取用户的登录凭证code。 3. 将获取到的code发送至后台服务器,后台服务器可以通过code向微信服务器发送请求,获取用户唯一标识的openid和会话密钥session_key。 4. 后台服务器可以保存用户openid和session_key,在后续请求中使用。 5. 用户登录成功后,可以将openid通过wx.setStorage()方法保存在微信小程序本地缓存中,用于后续判断用户是否已登录。 6. 在其他页面中,可以通过wx.getStorage()方法获取保存在本地缓存中的openid,判断用户是否已登录。 7. 登录成功后,可以根据业务需求进行相应的页面跳转或数据展示。 需要注意的是,在开发过程中需要将taro编译成微信小程序的语法,可以使用taro的命令行工具进行编译。另外,用户的敏感信息(如openid、session_key等)需要进行合理的保护和加密,以确保用户信息的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值