微信公众号第三方平台-公众号扫码授权接入代运营

news2025/2/24 23:35:22

文章目录

    • 接入目的
    • 效果展示
    • 技术积累
      • 如何成为服务商
      • 如何搭建第三方后端服务
      • 传统模式V云服务模式
      • 如何完成商家授权
      • 授权逻辑介绍
    • 环境准备
      • 注册开发者平台-个人类型
    • 传统模式后端代码
      • 接收公众号个人三方平台的票据
      • 根据票据获取三方平台访问令牌
      • 根据访问令牌获取预授权码
      • 通过预授权码发起授权
      • 获取刷新令牌
      • 获取授权账号调用令牌
      • 根据授权码获取公众号菜单
    • 踩坑记录

接入目的

根据公众号第三方平台开发流程可开发出一套可管理公众号/小程序的服务,服务可以直接部署在微信生态作为服务商。只要公众号/小程序理员用个人微信扫码进行授权,我们则可以拿到相关的业务接口权限,从而帮助商家实现代运营。

效果展示

通过接入公众号授权我们拿到了authorizer_access_token,用这个token调用微信公众号获取菜单的接口 https://api.weixin.qq.com/cgi-bin/component/api_query_auth
在这里插入图片描述

如图所示,已经拿到我本人公众号的菜单。

技术积累

如何成为服务商

https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/getting_started/how_to_be.html
在这里插入图片描述
在这里插入图片描述

1.1 注册开放平台并通过开发者纸质认证
https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/operation/open/create.html

1.2 创建第三方平台与个人测试账号一致

如何搭建第三方后端服务

在完成第三方平台账号创建后,需完成“开发资料”配置。而开发资料配置主要会涉及配置用于接收微信官方推送的消息以及授权链接域名。
除了搭建要与第三方平台对接的后端服务以外,服务商仍需开发业务系统(该系统主要是面向商家的),例如xxxx微商城。
而为了满足服务商业务多样性,也为了降低服务商搭建服务的成本,平台支持“传统模式”和“云服务模式”进行搭建。可点击查看关于云服务模式的详细介绍。
在这里插入图片描述

传统模式V云服务模式

传统模式下,第三方平台-开发资料的“授权事件接收配置”、“消息与事件接收配置”、“授权发起页域名”、“第三方授权页”均需要服务商按照文档进行开发、部署。如果使用云服务模式,可一键部署官方服务并一键完成配置。
一键部署官方云服务后可通过“服务商微管家”管理工具获取授权页链接,实现0代码完成第三方平台后端服务搭建。
此外,服务商的业务系统亦可部署到微信云托管,帮助服务商减少开发和运维成本。
在这里插入图片描述

如何完成商家授权

在完成服务商账号的创建后,接下来则是进行业务系统与第三方平台的开发对接,在联调测试完成之后即可进行第三方平台的全网发布。在完成全网发布之后,该第三方平台已经具备为商家提供服务的基础条件了。大概的步骤如下:
在这里插入图片描述

授权逻辑介绍

服务商为商家提供服务的基础是【服务商】获得【商家】的授权。
换句话说就是,商家需要将其公众号或者小程序授权给第三方平台,服务商才可以代商家进行相关操作。
完成一次完整的授权,需要服务商与商家的配合,相关流程如下,操作截图可查看授权与解除授权。
服务商获得商家授权后再使用authorizer_access_token调用接口即可。(注意,别用错了token。)
在这里插入图片描述

环境准备

注册开发者平台-个人类型

1.1 进入微信开发平台注册页面
https://open.weixin.qq.com/wxaopen/regist/index?token=f4668ecb8d5397d42967cfeb1d3b69033134ec11
在这里插入图片描述

1.2 主体选择个人,如果是企事业单位需要提供营业执照注册号
在这里插入图片描述

1.3 使用账号密码登录微信开放平台,进入管理中心-第三方平台
在这里插入图片描述

1.4 创建一个第三平台,个人测试号只能创建一个。注意绑定管理员微信号,增加事件回调地址以及权限集的配置。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

传统模式后端代码

接收公众号个人三方平台的票据

1、wx-java-open依赖引入

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-open</artifactId>
    <version>4.6.0</version>
</dependency>
<!-- 整合thymeleaf前端页面 授权页面使用 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

2、yaml配置thymeleaf

spring:
  thymeleaf:
    mode: HTML
    encoding: UTF-8
    content-type: text/html
    cache: false
    prefix: classpath:/templates/

4、微信票据回调接口逻辑

@RequestMapping("/receive_ticket")
public Object receiveTicket(@RequestBody(required = false) String requestBody, @RequestParam("timestamp") String timestamp,
                            @RequestParam("nonce") String nonce, @RequestParam("signature") String signature,
                            @RequestParam(name = "encrypt_type", required = false) String encType,
                            @RequestParam(name = "msg_signature", required = false) String msgSignature) {
    log.info(
            "\n接收微信请求:[signature=[{}], encType=[{}], msgSignature=[{}],"
                    + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
            signature, encType, msgSignature, timestamp, nonce, requestBody);

    if (!StringUtils.equalsIgnoreCase("aes", encType)
            || !wxOpenService.getWxOpenComponentService().checkSignature(timestamp, nonce, signature)) {
        throw new IllegalArgumentException("非法请求,可能属于伪造的请求!");
    }
    // aes加密的消息
    WxOpenXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedXml(requestBody,
            wxOpenService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature);
    log.debug("\n消息解密后内容为:\n{} ", inMessage.toString());
    try {
        String out = wxOpenService.getWxOpenComponentService().route(inMessage);
        log.debug("\n组装回复信息:{}", out);
    } catch (WxErrorException e) {
        log.error("receive_ticket", e);
    }
    return "success";
}

当我们在个人的第三平台配置了票据接收地址后,这里每10分钟就会收到票据:
在这里插入图片描述

根据票据获取三方平台访问令牌

POST https://api.weixin.qq.com/cgi-bin/component/api_component_token
令牌的获取是有限制的,每个令牌的有效期为 2 小时,请自行做好令牌的管理,在令牌快过期时(比如1小时50分),重新调用接口获取。
生成component_access_token需要依赖component_verify_ticket。

调用示例
示例说明: HTTPS请求
请求数据示例

{
“component_appid”: “appid_value” , #第三方平台appid
“component_appsecret”: “appsecret_value”, #第三方平台appsecret
“component_verify_ticket”: “ticket_value” #第三方平台推送的票据
}

返回数据示例

{
“component_access_token”: “61W3mEpU66027wgNZ_MhGHNQDHnFATkDa9-2llqrMBjUwxRSNPbVsMmyD-yq8wZETSoE5NQgecigDrSHkPtIYA”, #第三方平台访问令牌
“expires_in”: 7200
}

在这里插入图片描述

根据访问令牌获取预授权码

POST https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?access_token=ACCESS_TOKEN
ACCESS_TOKEN #第三方平台访问令牌

该接口用于获取预授权码(pre_auth_code)是第三方平台方实现授权托管的必备信息,每个预授权码有效期为 1800秒。

调用示例
示例说明: HTTPS请求
请求数据示例

{
“component_appid”: “appid_value” #第三方平台appid
}

返回数据示例

{
“pre_auth_code”: “Cx_Dk6qiBE0Dmx4EmlT3oRfArPvwSQ-oa3NL_fwHM7VI08r52wazoZX2Rhpz1dEw”,
“expires_in”: 600
}
在这里插入图片描述

通过预授权码发起授权

1、后端增加接口

@GetMapping("/authCodePage")
public ModelAndView index(ModelAndView model){
    model.addObject("message", "Hello, Thymeleaf!");
    model.setViewName("authCodePage");
    return model;
}

2、提供thymeleaf html文件

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>公众号授权~</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      text-align: center;
      margin: 20px;
    }
    h1 {
      color: #007bff;
    }
    p {
      font-size: 18px;
      color: #6c757d;
    }
  </style>
</head>
<body>
<h1>欢迎使用Thymeleaf模板</h1>
<p th:text="${message?:'is null'}">默认文本信息演示~~</p>
<button onclick="auth()">公众号授权</button>
</body>
<script>
  function auth() {
    console.log("auth");
    const url = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=**&pre_auth_code=**&redirect_uri=**&auth_type=1";
    location.href= url
  }
</script>
</html>

3、启动项目访问页面用测试公众号管理员个人微信扫码
在这里插入图片描述

4、授权
在这里插入图片描述
在这里插入图片描述

5、授权成功后回调,回调路径中包含auth_code
http://zqeu9v.natappfree.cc/notify/authCode/callback?auth_code=queryauthcode@@@aCuSQBx6O0aV4SiMcEncY9orjevT6wZs7bFy0sg6LGXqX9wJ8sO1XuNvFGMmJe9MZecwdOuN5_1CmAoTJWsAZg&expires_in=3600

获取刷新令牌

POST https://api.weixin.qq.com/cgi-bin/component/api_query_auth?access_token=ACCESS_TOKEN
ACCESS_TOKEN #第三方平台访问令牌

当用户在第三方平台授权页中完成授权流程后,第三方平台开发者可以在回调 URI 中通过 URL 参数获取授权码(authorization_code)。然后使用该接口可以换取公众号/小程序的刷新令牌(authorizer_refresh_token)。
建议保存授权信息中的刷新令牌(authorizer_refresh_token)
调用示例
示例说明: HTTPS请求
请求数据示例

{
“component_appid”:“appid_value” , #第三方平台appid
“authorization_code”: “auth_code_value” #扫码回调返回的授权码
}

返回数据示例

{
“authorization_info”: {
“authorizer_appid”: “wxf8b4f85f3a794e77”, #被授权公众号appid
“authorizer_access_token”: “QXjUqNqfYVH0yBE1iI_7vuN_9gQbpjfK7hYwJ3P7xOa88a89-Aga5x1NMYJyB8G2yKt1KCl0nPC3W9GJzw0Zzq_dBxc8pxIGUNi_bFes0qM”, #被授权公众号授权码
“expires_in”: 7200,
“authorizer_refresh_token”: “dTo-YCXPL4llX-u1W1pPpnp8Hgm4wpJtlR6iV0doKdY”,#刷新token
“func_info”: [ #授权个功能
{
“funcscope_category”: {
“id”: 1
}
},
{
“funcscope_category”: {
“id”: 2
}
},
{
“funcscope_category”: {
“id”: 3
}
}
]
}
}

在这里插入图片描述

获取授权账号调用令牌

POST https://api.weixin.qq.com/cgi-bin/component/api_authorizer_token?component_access_token=ACCESS_TOKEN
ACCESS_TOKEN #第三方平台访问令牌

该接口用于获取授权账号的authorizer_access_token。authorizer_access_token 有效期为 2 小时,authorizer_access_token 失效时,可以使用 authorizer_refresh_token 获取新的 authorizer_access_token

调用示例
示例说明: HTTPS请求
请求数据示例

{
“component_appid”: “appid_value”, #第三方平台aopid
“authorizer_appid”: “auth_appid_value”, #被授权公众号appid
“authorizer_refresh_token”: “refresh_token_value” #刷新token
}

返回数据示例

{
“authorizer_access_token”: “some-access-token”,
“expires_in”: 7200,
“authorizer_refresh_token”: “refresh_token_value”
}

在这里插入图片描述

根据授权码获取公众号菜单

https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=ACCESS_TOKEN
ACCESS_TOKEN #授权账号调用令牌( 授权码)
在这里插入图片描述

至此,我们已经根据授权码拿到了需要运营的公众号的菜单。此时此刻,只要是权限内的接口你都可任意调用。

踩坑记录

1、授权发起页面与事件接收域名一致
2、域名的根目录下必须下载放置官方校验文件

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何本地搭建开源导航页配置服务Dashy并发布到公网分享好友使用

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。[点击跳转到网站] 简介 Dashy 是…

嵌入式网线连接——笔记本电脑设置

一、需求 我们调试很多设备经常需要用到网线去调试&#xff0c;当然主流是USB&#xff0c;和网线。 二、笔记本电脑端设备 有网口的&#xff0c;非常方便&#xff0c;如果没有网口&#xff0c;则需要用到USB转网口 连接指示灯&#xff1a; 绿色&#xff1a;灯亮表示连接正常…

蓝桥杯(填空题)

十四届 B组 日期统计&#xff08;暴力枚举&#xff09; 数据 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 3 8 5 1 6 3 4 6 7 0 7 8 2 7 6 8 9 5 6 5 6 1 4 0 1 0 0 9 4 8 0 9 1 2 8 5 0 2 5 3…

一篇文章了解php7和php8新特性

PHP7新特性 ?? 运算符 php7以前用三目判断变量是否存在或是否为空 $a isset($_GET[a]) ? $_GET[a] : 1;php7新增null 合并运算符??快捷判断 $a $_GET[a] ?? 1;函数返回值类型声明 用:返回值类型的形式定义函数的返回值类型 <?phpdeclare(strict_types1); fun…

git配置多SSH

目的&#xff1a; 一台电脑可以让github、gitee等账号同时存在&#xff0c;让不同账号配置不同的密钥 第一步&#xff1a;创建不同平台的SSH公钥 执行命令&#xff1a; ssh-keygen -t rsa -C "对应仓库邮箱地址" -f ~/.ssh/id_rsa.github 如果执行上面的命令&…

Windows部署ChatGLM3步骤

一、环境要求 硬件 内存&#xff1a;> 16GB 显存: > 13GB&#xff08;4080 16GB&#xff09; 软件 python 版本推荐3.10 - 3.11 transformers 库版本推荐为 4.36.2 torch 推荐使用 2.0 及以上的版本&#xff0c;以获得最佳的推理性能 二、部署步骤 1、新建pytho…

Web服务器架构设计(学习笔记)

软件架构风格 质量属性与架构评估 Web架构综合考察 什么叫做架构风格&#xff1f;又有哪些架构风格&#xff1f;不同的架构风格的优劣如何? 有哪些层次的负载均衡实现&#xff1f;优劣如何&#xff1f; 有哪些层面的集群切片实现&#xff1f; 什么叫做小前端&#xff0c…

【收藏】工业物联网常用协议及使用场景

物联网通信协议 物联网通信协议在工业中至关重要。它们实现设备之间的实时数据传输与相互交互&#xff0c;提高了生产效率、降低成本、增强安全性。这些协议帮助监控设备运行状况、优化生产流程、预测维护需求&#xff0c;同时改善生产环境智能化。通过整合智能传感器与设备&am…

哪些工作不会被AI替代:人类能力地形图

这一轮AI&#xff0c;到底对人有多强的替代性&#xff1f;这一轮AI的可靠性&#xff0c;是之前任何一代所谓的人工智能都不能比的。 在国内&#xff0c;AI开始被用来筛选简历&#xff0c;而在国外&#xff0c;亚马逊正在用算法跟踪仓库工人的生产率&#xff0c;顺道还会给生产率…

【Vector-Map-路径规划(0)】卷首语

因为城市NOA 的开发过程中&#xff0c;十字路口这类场景非常不好处理&#xff0c;个人对路径规划没有什么基础&#xff0c;只知道深度优先&#xff0c;广度优先&#xff0c;A*&#xff0c;Dijkstra等算法&#xff0c;不知道在矢量地图中如何使用&#xff1f;因此花几天时间读几…

【Python】控制台进度条

在Python开发中&#xff0c;有时需要向用户展示一个任务的进度&#xff0c;以提供更好的交互体验。下面我将展示如何使用Python来创建一个简单的控制台进度条。 效果&#xff1a; 代码&#xff1a; import time import sys def print_progress_bar(completed, total, length…

如何使用Jellyfin+cpolar低成本部署私人影音平台并实现无公网IP远程访问

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

Redis从入门到精通(十二)Redis实战(九)GEO查询附近商户、BitMap用户签到和统计、HLL的UV统计

↑↑↑请在文章开头处下载测试项目源代码↑↑↑ 文章目录 前言4.10 附近商户4.10.1 GEO介绍4.10.2 附近商户需求分析4.10.3 实现新增商户功能4.10.4 实现查询附近商户功能 4.11 用户签到4.11.1 用户签到需求分析4.11.2 BitMap介绍4.11.3 实现用户签到4.11.4 实现用户签到统计4.…

Vuforia AR篇(二)— 扫描指定图片播放视频

目录 一、 使用Vuforia SDK创建Vuforia账号下载Vuforia SDK包导入SDK到unity中 二、使用Vuforia扫描指定图片播放视频创建ARCamera创建 License创建ImageTarget生成识别数据库播放视频 三、 效果 一、 使用Vuforia SDK 创建Vuforia账号 Vuforia官网 登录官网创建一个账号&am…

【fiddler】弱网测试

目录 一、测试目的 二、步骤 2.1打开弱网模式 ​ 2.2设置网络参数 &#xff08;1&#xff09;打开Rules→Customize Rules&#xff1b; &#xff08;2&#xff09;找到下面框出的代码&#xff0c;在这里设置弱网参数值&#xff1b; &#xff08;3&#xff09;设置完成后&a…

【每日刷题】Day10

【每日刷题】Day10 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f345; 目录 1. 环形链表的约瑟夫问题_牛客题霸_牛客网 (nowcoder.com) 2. 21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 3. 152…

【MATLAB源码-第9期】基于matlab的DQPSK的误码率BER和误符号率SER仿真。

1、算法描述 DQPSK信号的解调与2DPSK信号的解调类似&#xff0c;也有两种方法&#xff0c;分别是极性比较法和相位比较法 极性比较法。其原理方框图如下图所示。由于DQPSK信号可以看做是两路2DPSK信号的合成&#xff0c;解 调时也可以分别按两路2DPSK信号解调&#xff0c;因此…

Docker部署SpringBoo+Vue前后端分离项目

文章目录 1. 安装Docker1. 1 卸载旧版Docker1.2 配置yum仓库1.3 安装Docker1.4 添加自启动配置1.5 配置阿里云镜像加速1.6 测试 2. 安装Nginx2.1 拉取镜像2.2 安装Nginx2.3 测试 3. 安装MySQL3.1 拉取镜像3.2 安装MySQL3.3 连接MySQL 4. 部署SpringBoot项目4.1 Maven打包4.2 编…

java数组.day16(冒泡排序,稀疏数组)

冒泡排序 冒泡排序无疑是最为出名的排序算法之一&#xff0c;总共有八大排序! 冒泡的代码还是相当简单的&#xff0c;两层循环&#xff0c;外层冒泡轮数&#xff0c;里层依次比较&#xff0c;江湖中人人尽皆知。 我们看到嵌套循环&#xff0c;应该立马就可以得出这个算法的时…

VBA信息获取与处理第四节:获取唯一非重复随机值的返回数组

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…