微信小程序开发之配置菜单跳转到自定义页面

需求:

用户点击公众号菜单跳转到自定义带引流码的链接

公众号相关文档:

网页授权 | 微信开放文档

 

大致流程: 

1.在公众号菜单配置链接:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXXXXXXXXXX&redirect_uri=https%3A%2F%2F测试域名%2Fws_dabai%2Fweixin%2Fcallback%2FredirectInsurePage&response_type=code&scope=snsapi_userinfo&state=XXXXXXXXXXXXhttps://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXXXXXXXXXX&redirect_uri=https%3A%2F%2F测试域名%2Fws_dabai%2Fweixin%2Fcallback%2FredirectInsurePage&response_type=code&scope=snsapi_userinfo&state=

上面浅蓝色部分需替换为当前公众号id,和测试环境对应的域名,测试域名https开头.

2.点击菜单用户会请求到后台服务: 根据返回的code 获取当前用户的openId, 然后根据openId查询引流人员编码 marketingCode, 最后根据 marketingCode查询对应推广员的链接


/**
 * @Title: 公众号回调 Controller
 * @Author: ken
 * @Description:
 * @Date: 2023/7/26  18:14
 **/
@Api(value = "获取微信openId总入口", tags = "获取微信openId总入口")
@Slf4j
@RestController
@RequestMapping("/callback")
public class WechatCallController {

    @Autowired
    private MarketingService marketingService;


    @ApiOperation("微信回调获取openId并跳转投保H5链接")
    @GetMapping(value = "/redirectInsurePage")
    public void  redirectInsurePage(@RequestParam String code, @RequestParam String state, HttpServletResponse response) {
        log.info("WechatPageController--> redirectInsurePage--> code:{}, state:{}", code, state);
        String url = marketingService.getUrl(code, state);
        log.info("WechatPageController--> redirectInsurePage--> url:{}", url);

        //重定向页面到投保连接页面(url 需要解码)
        String urlEncoder = "";
        try {
            urlEncoder = URLEncoder.encode(url, StandardCharsets.UTF_8.toString());
            log.info("WechatPageController--> redirectInsurePage--> urlEncoder:{}", urlEncoder);
        } catch (UnsupportedEncodingException e) {
            log.error("WechatPageController --> redirectInsurePage  URLEncoder.encode error:{}", e.getMessage(), e);
        }

        try {
            response.sendRedirect(url);
        } catch (IOException e) {
            log.error("WechatPageController --> redirectInsurePage  response.sendRedirect error:{}", e.getMessage(), e);
        }
        /*RedirectView redirectView = new RedirectView();
        // 设置重定向的URL
        redirectView.setUrl(urlEncoder);
        return redirectView;*/
    }
}

实现类:


    @Override
    public String getUrl(String code, String appId) {

        //获取用户openId
        CommonWechatByCodeReq commonWechatByCodeReq = new CommonWechatByCodeReq(code, appId);
        CommonWechatInfoByCode commonWechatInfoByCode = cbsWechatRemoteService.getAccessToken(commonWechatByCodeReq);
        log.info("MarketingServiceImpl-->getUrl--> cbsWechatRemoteService.getAccessToken :{}",
                JSONObject.toJSONString(commonWechatInfoByCode));
        String openId = commonWechatInfoByCode.getOpenid();

        //调用2b2a 根据open获取第一次绑定的 marketingCode
        String marketingCode = "";
        try {
            marketingCode = tbTaRemoteService.getMarketingCode(appId, openId);
        } catch (Exception e) {
            log.error("MarketingServiceImpl --> getUrl  tbTaRemoteService.getMarketingCode error:{}", e.getMessage(), e);
        }

        log.info("MarketingServiceImpl --> getUrl  tbTaRemoteService.getMarketingCode--> marketingCode :{}", marketingCode);

        if(Objects.isNull(marketingCode) || StringUtils.isEmpty(marketingCode)){
            return DEFAULT_URL;
        }
        //根据 marketingCode 查询推广员对应的投保链接
        QueryWrapper<MarketingExt> wrapper = new QueryWrapper<>();
        wrapper.eq("marketing_code", marketingCode);
        List<MarketingExt> marketingExtList = marketingExtMapper.selectList(wrapper);

        if (CollectionUtils.isEmpty(marketingExtList)) {
            return DEFAULT_URL;
        }

        return marketingExtList.get(0).getUrl();
    }
}

3.通过重定向跳转到查询到的推广链接页面.

注意:这里返回的链接不能再编码

 👉 💐🌸 公众号请关注 "果酱桑", 一起学习,一起进步! 🌸💐

 

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

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

相关文章

NoSQL-Redis持久化

NoSQL-Redis持久化 一、Redis 高可用&#xff1a;1.概述&#xff1a; 二、Redis持久化&#xff1a;1.持久化的功能&#xff1a;2.Redis 提供两种方式进行持久化&#xff1a; 三、RDB 持久化&#xff1a;1.定义&#xff1a;2.触发条件&#xff1a;3.执行流程&#xff1a;4.启动时…

HDFS的设计目标和重要特性

HDFS的设计目标和重要特性 设计目标HDFS重要特性主从架构分块存储机制副本机制namespace元数据管理数据块存储 设计目标 硬件故障(Hardware Failure)是常态&#xff0c;HDFS可能有成百上千的服务器组成&#xff0c;每一个组件都有可能出现故障。因此古见检测和自动快速恢复的H…

选择合适的图表,高效展现数据魅力

随着大数据时代的来临&#xff0c;数据的重要性愈发凸显&#xff0c;数据分析和可视化成为了决策和传递信息的重要手段。在数据可视化中&#xff0c;选择合适的图表是至关重要的一环&#xff0c;它能让数据更加生动、直观地呈现&#xff0c;为观众提供更有说服力的信息。本文将…

JavaScript 练手小技巧:音乐播放器的歌词显示

暑假了&#xff0c;还是不能让自己闲着&#xff0c;学点自己感兴趣的知识&#xff0c;写点自己喜欢的代码。 今天写了一个播放器的雏形&#xff0c;带歌词显示。 没去自定义播放器&#xff0c;主要是写歌词显示效果。效果图如下&#xff1a; 首先当然是要准备一个 mp3 文件。 …

RocketMQ基本概念与入门

文章目录 MQ基本结构依赖案例:productConsumer 核心概念1.nameserver2.broker3.主题队列4.queue队列5. 生产者6.消费者分组和生产者分组7.消费点位 MQ基本结构 message: 消息数据对象product: 程序代码,生成消息,发送消息到队列consumer: 程序代码,监听(绑定)队列,获取消息,执行…

分布式锁:Redis、Zookeeper

1.基于Redis实现分布式锁&#xfeff; Redis分布式锁原理如上图所示&#xff0c;当有多个Set命令发送到Redis时&#xff0c;Redis会串行处理&#xff0c;最终只有一个Set命令执行成功&#xff0c;从而只有一个线程加锁成功 2.SetNx命令加锁 利用Redis的setNx命令在Redis数据库…

数据结构【绪论】

数据结构入门级 第一章绪论 什么是数据结构&#xff1f;什么是数据类型&#xff1f; 程序数据结构算法 一、基本概念&#xff1a; 数据&#xff1a;指所有能被计算机处理的&#xff0c;无论图、文字、符号等。数据元素&#xff1a;数据的基本单位&#xff0c;通常作为整体考…

Unity TMP (TextMeshPro) 创建字体材质

1 TMP 简介 完整名称&#xff1a;Text Mesh Pro &#xff0c;unity新一代主流字体插件 1.1 组件变化 内置的Text组件以及与内置Text组件绑定的Button、DropDown、InputField均被替换为使用TextMeshPro的版本 内置的Text组件以及与内置Text组件绑定的Button、DropDown、Input…

tinymce插件tinymce-powerpaste-plugin——将word中内容(文字图片等)直接粘贴至tinymce编辑器中

TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有&#xff1a;UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。 TinyMCE的优势&#xff1a; 开源可商用&#xff0c;基于LGPL2.1 插件丰富&#xff0c;自带插件基本涵盖日常…

【项目设计】基于负载均衡的在线oj平台

目录 一、项目介绍 二、开发环境以及技术 三、概要设计 四、关键算法 五、项目演示 六、代码实现 一、项目介绍 该项目是基于负载均衡的在线oj&#xff0c;模拟平时刷题网站&#xff08;leetcode和牛客&#xff09;写的一个在线判题系统 项目主要分为五个模块&#xff…

OpenAI重磅官宣ChatGPT安卓版本周发布,现已开启下载预约,附详细预约教程

7月22号&#xff0c;OpenAI 突然宣布&#xff0c;安卓版 ChatGPT 将在下周发布&#xff01;换句话说&#xff0c;本周安卓版 ChatGPT正式上线&#xff01; 最早&#xff0c;ChatGPT仅有网页版。 今年5月&#xff0c;iOS版ChatGPT正式发布&#xff0c;当时OpenAI表示Android版将…

Docker—— consul的容器服务更新与发现

Docker—— consul的容器服务更新与发现 一、Consul概述1.什么是服务注册与发现2.什么是consul 二、consul 部署1.consul服务器①. 建立 Consul 服务②. 查看集群信息③. 通过 http api 获取集群信息 2.registrator服务器①. 安装 Gliderlabs/Registrator②. 测试服务发现功能是…

智能小说文本字幕生成器

分享一个免费的&#xff0c;智能小说文本字幕生成器 智能分句。短词。 链接&#xff1a;https://pan.baidu.com/s/15xGlQg01LmbHHuGFZbgaiw?pwd0gjv 提取码&#xff1a;0gjv

分类评估指标

文章目录 1. 混淆矩阵2. Precision(精准率)3. Recall(召回率)4. F1-score5. ROC曲线和AUC指标5.1 ROC 曲线5.2 绘制 ROC 曲线5.3 AUC 值6. API介绍6.1 **分类评估报告api**6.2 **AUC计算API**练习-电信客户流失预测1. 数据集介绍2. 处理流程3. 案例实现4. 小结1. 混淆矩阵 …

Windows上安装Docker Desktop

运行环境 Windows 10Docker Desktop 4.21.1 安装步骤 步骤1&#xff1a; 勾掉"Use WSL 2 instead of Hyper-V(recommended)"&#xff08;原因见小插曲2章节&#xff09; 步骤2&#xff1a; 安装完成 步骤3&#xff1a; 运行Docker Desktop 步骤4&#xff1a; …

【MATLAB】ILOSpsi制导率的代码解析

ILOSpsi制导率的代码解析 这里记录一下关于fossen的MMS工具箱中&#xff0c;关于ILOSpsi制导率的代码解析内容&#xff0c;结合fossen的marine carft hydrodynamics and motion control这本书来参考看 文章目录 ILOSpsi制导率的代码解析前言一、代码全文二、内容解析1.persist…

opencv-27 阈值处理 cv2.threshold()

怎么理解阈值处理? 阈值处理&#xff08;Thresholding&#xff09;是一种常用的图像处理技术&#xff0c;在机器学习和计算机视觉中经常被用于二值化图像或二分类任务。它基于设定一个阈值来将像素值进行分类&#xff0c;将像素值大于或小于阈值的部分分为两个不同的类别&…

Redis持久化机制 RDB、AOF、混合持久化详解!如何选择?| JavaGuide

本文已经收录进 JavaGuide(「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。) Redis 持久化机制属于后端面试超高频的面试知识点,老生常谈了,需要重点花时间掌握。即使不是准备面试,日常开发也是需要经常用到的。 最近抽空对之前写的 Redis 持久化…

【ES】---ES的聚合(aggregations)

目录 一、前言1、聚合分类2、聚合的实现方式二、RestAPI--bucket聚合案例11、按照类型分bucket2、按照(String)时间分bucket三、RestAPI-- metric聚合案例11、metric指标统计四、RestAPI-- pipeline聚合案例1一、前言 聚合是对文档数据的统计、分析、计算。 注意:参与聚合的字…

Java中I/O流是什么?输入/输出流又是什么?

在 Java中所有数据都是使用流读写的。流是一组有序的数据序列&#xff0c;将数据从一个地方带到另一个地方。根据数据流向的不同&#xff0c;可以分为输入&#xff08;Input&#xff09;流和输出&#xff08;Output&#xff09;流两种。 在学习输入和输出流之前&#xff0c;我们…