Taro 关于微信订阅消息的调用

requestSubscribeMessage 是微信提供的方法
封装的调用requestSubscribeMessage的方法
示例图如下
在这里插入图片描述

import {
  getWechatTemplates,
  postSubscribeNotice
} from '@/magic-sdk/apis/wechat-service';
import {
  WechatTemplateType,
  SubscribeNoticeObjTypeOptions,
  WechatTemplateEvent
} from '@/magic-sdk/types/wechat-service';
import {
  getSetting,
  requestSubscribeMessage /**, showToast */,
  nextTick,
  SubscriptionsSetting
} from '@tarojs/taro';
import Modal from '@/components/Modal/Modal';
import { isEmpty } from 'lodash-es';
import { captureException } from '../sentry';
import { showSubscribeGuidePopup } from './popup';
import {} from './platform';

export interface OtherParams {
  objValue: string | number | undefined;
}

/**
 * 通过类型从后端获取订阅模板id并尝试订阅
 * @param type
 * @returns
 */
export async function tryWechatSubscribeByType(
  type: WechatTemplateType,
  otherParams: OtherParams = {
    objValue: undefined
  },
  successCb?: () => void
): Promise<boolean> {
  try {
    const { data: templateList } = await getWechatTemplates(type);
    const isWeapp = process.env.TARO_ENV === 'weapp';
    if (!templateList || !templateList.length) {
      // showToast({ title: '抱歉,暂时还未开通该订阅消息服务', icon: 'none' });
      return false;
    }
    const templateIds = templateList.map(({ templateId }) => templateId);
    const subscriptionsSetting =
      (await getSubscriptionsSetting()) as SubscriptionsSetting;
    const noSettings =
      isWeapp &&
      (isEmpty(subscriptionsSetting.itemSettings) ||
        (subscriptionsSetting.itemSettings &&
          templateIds.some((id) =>
            isEmpty(subscriptionsSetting.itemSettings[id])
          )));
    let response: Record<string, string> = {};
    if (process.env.TARO_ENV === 'alipay') {
      response = await my.requestSubscribeMessage({
        entityIds: templateIds
      });
    } else if (process.env.TARO_ENV === 'weapp') {
      if (noSettings) {
        nextTick(showSubscribeGuidePopup);
      }
      response = (await requestSubscribeMessage({
        tmplIds: templateIds,
        complete: () => {
          Modal.destroy();
        }
      })) as Record<string, string>;
    }
    let isAccept = false;
    templateList.forEach((item) => {
      if (response[item.templateId] === 'accept') {
        const objType = SubscribeNoticeObjTypeOptions[item.event];
        const newOtherParams =
          item.event === WechatTemplateEvent.ActivityNotice
            ? { objValue: objType }
            : otherParams;
        postSubscribeNotice({
          event: item.event,
          templateId: item.templateId,
          objType,
          ...newOtherParams
        });
        isAccept = true;
      }
    });
    if (isAccept) {
      if (successCb) {
        if (noSettings) {
          Modal.destroy();
          //关闭指导弹窗再执行回调
          nextTick(successCb);
        } else {
          successCb();
        }
      }
      return true;
    }

    // 如果用户勾选了总是保持以上选择的订阅选项
    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
    // @ts-ignore
    // XXX: Taro的类型不正确, 下同
    // 参考:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/setting/wx.getSetting.html

    if (
      isWeapp &&
      subscriptionsSetting.itemSettings &&
      templateIds.some(
        (id) => subscriptionsSetting.itemSettings[id] === 'reject'
      )
    ) {
      // showToast({
      //   title: '您已拒绝接收通知,请前往微信 - 服务通知 设置接收',
      //   icon: 'none'
      // });
      return false;
    }
  } catch (error) {
    // 模板id不正确的情况
    // if (error.errCode === 20001) {
    //   showToast({ title: '抱歉,暂时还未开通消息服务', icon: 'none' });
    // }
    if (process.env.TARO_ENV === 'weapp') {
      Modal.destroy();
    }
    captureException(error);
  }
  return false;
}
export async function getSubscriptionsSetting() {
  if (process.env.TARO_ENV === 'weapp') {
    const { subscriptionsSetting } = await getSetting({
      // eslint-disable-next-line @typescript-eslint/ban-ts-comment
      // @ts-ignore
      withSubscriptions: true
    });
    return subscriptionsSetting;
  }
  return { itemSettings: {} };
}

tryWechatSubscribeByType 调用公用方法

import React, { Component, CSSProperties } from 'react';
import { View, Text } from '@tarojs/components';
import { WechatTemplateType } from '@/magic-sdk/types/wechat-service';
import {
  getColorByTheme,
  getTextStyleByTheme
} from '@/application/utils/theme';
import { hexToRgba } from '@/application/utils/format';
import {
  OtherParams,
  tryWechatSubscribeByType
} from '@/application/utils/subscribe';
import './index.scss';

interface Props {
  text: string;
  btnText: string;
  type: WechatTemplateType;
  otherParams?: OtherParams;
  successCb?: () => void;
}

const prefix = 'cm-subscrible';
export default class CmSubscribe extends Component<Props> {
  /**
   * @name subscribeMessage
   * @description 消息订阅
   */
  private subMsg = async () => {
    const { type, otherParams, successCb } = this.props;
    await tryWechatSubscribeByType(type, otherParams, successCb);
  };

  /**
   * @name renderSubscribe
   * @description 商场活动订阅消息区域结构渲染
   */
  private renderSub = () => {
    const { text, btnText } = this.props;
    const subStyle: CSSProperties = {
      color: getColorByTheme('primary'),
      backgroundColor: hexToRgba(getColorByTheme('primary'), 0.1)
    };
    const btnStyle: CSSProperties = {
      borderColor: getColorByTheme('primary')
    };
    const txtStyle = getTextStyleByTheme('primary');
    return (
      <View className={innerClassNames.subscribe} style={subStyle}>
        <Text className={innerClassNames.subscribeText} style={txtStyle}>
          {text}
        </Text>
        <View
          className={innerClassNames.subscribeBtn}
          onClick={this.subMsg}
          style={btnStyle}
        >
          <Text className={innerClassNames.subscribeBtnText} style={txtStyle}>
            {btnText}
          </Text>
        </View>
      </View>
    );
  };

  render(): React.ReactNode {
    return <View className={prefix}>{this.renderSub()}</View>;
  }
}

const innerClassNames = {
  subscribe: `${prefix}__subscribe`,
  subscribeText: `${prefix}__subscribe-text`,
  subscribeBtn: `${prefix}__subscribe-btn`,
  subscribeBtnText: `${prefix}__subscribe-btn-text`
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/506908.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详细分析Mysql中的STR_TO_DATE基本知识(全)

目录 前言1. 基本知识2. Demo3. 实战Demo4. Sql彩蛋4.1 LPAD函数4.2 SUBSTRING_INDEX函数 5. Java彩蛋 前言 对于该知识点&#xff0c;主要因为数据库类型为String&#xff08;类似2024-03-26&#xff09;&#xff0c;放置于后端操作后&#xff0c;需要自定义比较&#xff0c;…

做了盲/埋孔,PCB还有必要做盘中孔吗?

在PCB设计中&#xff0c;过孔类型可分为盲孔、埋孔和盘中孔&#xff0c;它们各自有不同应用场景和优势&#xff0c;盲孔和埋孔主要用于实现多层板之间的电气连接&#xff0c;而盘中孔是元器件的固定及焊接。如果PCB板上做了盲孔和埋孔&#xff0c;那么有必要做盘中孔吗&#xf…

java的Class文件分析

文章目录 1. 简介2. Class文件分析 1. 简介 Java有一个著名的口号一次编译&#xff0c;处处运行&#xff0c;这就凸显出来Java程序的一个特点平台无关性。Java的平台无关性是基于各种不同平台的Java虚拟机&#xff0c;以及所有平台都统一支持的程序存储格式—字节码实现的。在…

B端管理系统:UI设计师为什么没有话语权?

一、六大因素&#xff0c;导致了UI设计师话语权缺失。 专业性差异&#xff1a; UI设计师主要负责界面设计和用户体验&#xff0c;而在B端管理系统中&#xff0c;功能性和操作流程往往更为重要&#xff0c;需要产品经理和开发人员更多的参与&#xff0c;他们对于系统的功能和技…

Springboot Thymeleaf 实现数据添加、修改、查询、删除

1、引言 在Spring Boot中使用Thymeleaf模板引擎实现数据的添加、修改、查询和删除功能&#xff0c;通常步骤如下&#xff1a; 在Controller类中&#xff0c;定义处理HTTP请求的方法。创建Thymeleaf模板来处理表单的显示和数据的绑定。 2、用户数据添加 1、 在Controller类中…

尚医通day1

1 创建项目 doc 窗口 pnpm create vite 填写项目名 vue-syt选择框架 vuetypeScript 2整理项目 删除 /src/assets/vue.svg 文件&#xff0c;删除 /src/components 下的 helloWorld.vue删除app.vue内容&#xff0c;快捷键v3ts 生成模板内容去掉 /src/style.css 样式文件&…

格雷希尔G10系列L150A和L200A气动快速连接器,在新能源汽车线束线缆剥线后的气密性测试密封方案

线束线缆在很多用电环境都有使用&#xff0c;比如说新能源汽车&#xff0c;从电池包放电开始&#xff0c;高低压、通讯都开始进行工作&#xff0c;线束在连接的地方需要具有较高的气密性和稳定性&#xff0c;才能保证车辆在不同环境下能够正常的运行。 线束在组装铜鼻子前需要剥…

【Linux】开始掌握进程控制吧!

送给大家一句话&#xff1a; 我并不期待人生可以一直过得很顺利&#xff0c;但我希望碰到人生难关的时候&#xff0c;自己可以是它的对手。—— 加缪 开始学习进程控制 1 前言2 进程创建2.1 fork函数初识2.2 fork函数返回值2.3 写时拷贝2.4 fork常规用法2.5 fork调用失败的原因…

高阶DS---AVL树详解(每步配图)

目录 前言&#xff1a; AVL树的概念: AVL树节点的定义&#xff1a; AVL树的插入&#xff08;重点&#xff09; AVL树的旋转&#xff1a; &#xff08;1&#xff09;新节点插入较高左子树的左侧---右单旋 &#xff08;2&#xff09;新节点插入较高右子树的右侧---左单旋 …

(九)Docker的认识

1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0c;环境不一定一致…

【更新】单细胞联合MR这样筛选靶点|衰老+NK细胞+免疫浸润

今天给大家分享一篇JCR一区&#xff0c;单细胞MR的文章&#xff1a;Unraveling the mechanisms of NK cell dysfunction in aging and Alzheimer’s disease: insights from GWAS and single-cell transcriptomics 标题&#xff1a;揭示NK细胞在衰老和阿尔茨海默病中功能失调的…

Pangolin_FOUND to FALSE so package “Pangolin“ is considered to be NOT FOUND.

修改CMakeLists.txt如下&#xff1a; 在find_package(Eigen3 REQUIRED)后加NO_MUDULE, find_package(Eigen3 REQUIRED NO_MODULE)编译成功&#xff1a;

挖一挖:PostgreSQL Java里的double类型存储到varchar精度丢失问题

前言 大概故事是这样的&#xff0c;PostgreSQL数据库&#xff0c;表结构&#xff1a; create table t1(a varchar);然后使用标准的Java jdbc去插入数据&#xff0c;其基本代码如下&#xff1a; import java.sql.*; public class PgDoubleTest {public static void main(Stri…

Bridge Champ与Ignis公链:探索Web3游戏的新未来

在数字化和去中心化的浪潮中&#xff0c;Web3游戏与公链的融合为游戏行业带来了新的变革。特别是&#xff0c;Bridge Champ和Ignis公链的结合&#xff0c;展示了一种全新的游戏生态模式&#xff0c;不仅为玩家提供了更加公平、透明的游戏体验&#xff0c;同时也为游戏开发和运营…

狐臭的等比数列

题目 #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; const int N 1e6;co…

乡村智慧化:数字乡村助力农村可持续发展

目录 一、数字乡村的内涵与特征 二、数字乡村助力农村可持续发展的路径 &#xff08;一&#xff09;提升农业生产效率 &#xff08;二&#xff09;推动农村产业融合发展 &#xff08;三&#xff09;优化乡村治理模式 &#xff08;四&#xff09;促进乡村生态文明建设 三…

基于ssm校园活动管理平台论文

摘 要 使用旧方法对校园活动信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在校园活动信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的校园活动管理平…

Python学习笔记-Flask接口创建与测试

服务端: 1.引包 导入 from flask import Flask, request, render_template, redirect Flask: Flask 是一个类&#xff0c;用于创建 Flask web 应用的实例。每个 Flask 应用都从创建这个类的实例开始。示例&#xff1a;app Flask(__name__) request: request 是一个全局对象…

【BlossomConfig】什么是配置中心?以及如何实现一个配置中心?

文章目录 什么是配置中心&#xff1f;如何自己设计一个配置中心&#xff1f; 网关项目源码 RPC项目源码 配置中心项目源码 什么是配置中心&#xff1f; 在单体架构的时候我们可以将配置写在配置文件中&#xff0c;但有⼀个缺点就是每次修改配置都需要重启服务才能生效。 当应用…

MySQL使用技巧,高级Java开发必看

insert into tab(col1,col2…) select … 5、活用正则表达式 regexp ^ $ . * | 6、关联查询比子查询效率快&#xff0c;优先使用join关联查询 7、if(exp,v1,v2) if()函数的使用 exp:表达式 v1:exp为真时返回的值 v2:exp为假时返回的值 8、case when… then… else… en…