企业微信-通用开发参数回调设置

news2025/1/11 23:41:41

公司业务需要开发企业微信,注册三方服务商审核通过后,

开始配置开发信息。本篇中记录在调试url验证中遇到错误及解决方式。

目录

准备工作

下载php加解密库

下载文件说明

设置白名单

设置路径

参数说明

设置ip

回调处理

回调类型:

1、Get 类型

2、Post 类型

Get 回调实现

设置路由

控制器

业务层处理

配置开发信息

遇到问题

发现问题

解决方案


准备工作

下载php加解密库

在回调的实现逻辑中需要进行加解密计算,企业微信已经提供了 C++ Python PHP Java Go C# Node.js 等语言版本的加解密库,并且均提供了解密、加密、验证URL三个接口,开发者可以根据开发需要 下载加解密库。

下载文件

下载文件说明

WXBizMsgCrypt.php文件提供了WXBizMsgCrypt类的实现,是用户接入企业微信的接口类。Sample.php提供了示例以供开发者参考。errorCode.php, pkcs7Encoder.php, sha1.php, xmlparse.php文件是实现这个类的辅助类,开发者无须关心其具体实现。

WXBizMsgCrypt类封装了VerifyURL, DecryptMsg, EncryptMsg三个接口,分别用于开发者验证接收消息。的url、接收消息的解密以及开发者回复消息的加密过程。使用方法可以参考Sample.php文件。

设置白名单

设置路径

在开发者中心->工具->开发配置->IP白名单->点击编辑按钮,

添加白名单IP列表

参数说明

参数内容

说明

白名单IP列表

服务商调用企业微信API时的合法IP列表,只有白名单内的IP才能正常调用企业微信API,修改后立即生效。支持“222.209.201.*” 这样用通配符表示IP段;多个IP以英文分号;分隔

设置ip

我设置的是自己本机ip,并把最后一位设置为*,防止ip变动。

回调处理

加解密库加到项目中,最好外网可以访问到,否则估计要实现内网穿透。

回调类型:

第三方应用的回调配置有数据回调和指令回调两种。

数据回调,用于接收托管企业微信应用的用户消息、进入应用事件、通讯录变更事件。

指令回调,用于接收应用授权变更事件(应用添加、删除、修改)以及ticket参数,ticket说明详API接口说明。

对于数据回调和指令回调的两个 URL ,在服务端的实现时,都必须同时支持 HttpGet 以及 HttpPost两种能力。

1、Get 类型

仅用于在应用创建配置应用信息时的验证,企业微信服务端会向回调URL发起一个 Get 请求,当该回调URL按照约定进行了响应后,表明第三方服务具备解析企业微信推送消息的能力。

2、Post 类型

用于实际的业务请求,比如应用菜单的点击事件,用户消息等。当有回调的行为发生时,企业微信服务端会向该回调URL发起一个 Post 请求,同时数据会已加密的形式推送到该回调 URL,第三方服务商接受信息、解密信息,处理业务逻辑,并且按照约定进行响应即可。

Get 回调实现

目前只介绍get回调实现。

设置路由

在laravel中实现设置路由。

Route::any('wxNotify', 'Api\ApiOtherController@companyWxNotify');

控制器

接收参数,并返回响应。

public function wxNotify()
{
    $obj = new CompanyWxPushService();
    $all = request()->all();
    writeRecordLog('companyWechat.log', var_export($all, true));
    if (request()->isMethod('GET')) {
        // 获取参数
        $msg_signature = request()->input('msg_signature');
        $timeStamp = request()->input('timestamp');
        $nonce = request()->input('nonce');
        $echoStr = request()->input('echostr');
        echo $obj->callbackGET($msg_signature, $timeStamp, $nonce, $echoStr);
    }
    die();
}

业务层处理

接收到该请求时:

1.解析出Get请求的参数,包括消息体签名(msg_signature),时间戳(timestamp),随机数字串(nonce)以及公众平台推送过来的随机加密字符串(echostr),这一步注意作URL解码;

2.验证消息体签名的正确性;

3. 解密出echostr原文,将原文当作Get请求的response,返回给公众平台

第2,3步可以用公众平台提供的库函数VerifyURL来实现。

内容如下:

class CompanyWxPushService
{
    //  接收信息时的加解密参数
    protected static $encodingAesKey = "随机生成的encodingAESKey";

    // 接收信息时的校验Token
    protected static $token = "随机生成的token";

    protected static $corpId = "服务商注册后获取的corpID";


    /**
     * 企业微信GET回调处理(URL地址校验)
     * @param $sVerifyMsgSig
     * @param $sVerifyTimeStamp
     * @param $sVerifyNonce
     * @param $sVerifyEchoStr
     * @return string
     */
    public function callbackGET($sVerifyMsgSig, $sVerifyTimeStamp, $sVerifyNonce, $sVerifyEchoStr)
    {
        $sVerifyEchoStr = str_replace(" ", "+", $sVerifyEchoStr);
        $wxcpt = new \WXBizMsgCrypt(self::$token, self::$encodingAesKey, self::$corpId);
        // 调用验证函数
        $sEchoStr = "";
        $errCode = $wxcpt->VerifyURL($sVerifyMsgSig, $sVerifyTimeStamp, $sVerifyNonce, $sVerifyEchoStr, $sEchoStr);
        if ($errCode == 0) {
            return $sEchoStr;
        } else {
            return "ERR: " . $errCode;
        }
    }
}

配置开发信息

开发者完成注册之后,即可登录进入服务商管理后台。

在后台主页->应用管理->通用开发参数栏->点击编辑按钮,配置基本开发信息。

填入url回调地址,随机生成token/encodingAESKey;

点击保存或者确定,就会发送回调消息进行验证,成功即可保存。

遇到问题

一直返回-40001全局错误码,

对照全局错误码提示是:

40001

不合法的secret参数

发现问题

比对了好几遍token/encodingAESKey/corpId

又重新生成了token和encodingAESKey还是不行。

中间又去网上也没找到类似的问题。

最后把回调的数据在本地,把接收数据改为固定的回调信息,发现就正常解析出来了。

最后一个一个参数经过比对,发现接收数据时会把加密字符串中的+解析成空格。

如下:

解决方案

对加密字符串执行替换处理,把空格换成+。

内容如下:

$sVerifyEchoStr = str_replace(" ", "+", $sVerifyEchoStr);

本地修改后,验证了好几次都能正确解析出加密字符串内容。

之后提交保存后,验证通过了。

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

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

相关文章

【C++】布隆过滤器简单操纵模拟以及常见题目

🌏博客主页: 主页 🔖系列专栏: C ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! 文章目录 前言一、求下标仿函数的建议二、布隆过滤器代码面试题1.近似算法:2.精确算…

Leetcode 409. 最长回文串

文章目录 题目代码&#xff08;9.24 首刷自解&#xff09; 题目 Leetcode 409. 最长回文串 代码&#xff08;9.24 首刷自解&#xff09; class Solution { public:int longestPalindrome(string s) {unordered_map<char, int> mp;for(char c : s) mp[c];int res 0;int…

【算法思想-排序】排序数组-力扣 912 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

nexus 私服 拉不了 jar 包,报 Not authorized

如果你排查了所有情况,并且确定账号密码都没问题,路径也正确,并且setting.xml都配置正确了 可以看下是不是这个原因

5、SpringBoot_热部署

六、热部署 1.热部署概述 概述&#xff1a;程序更改后&#xff0c;不需要重新启动服务器也能够实现动态更新 springboot 项目如何实现热部署&#xff1f; tomcat 已经内置到项目容器中了希望tomcat监听外部程序变化通过新建一个程序来监控你代码的变化 2.依赖导入 依赖 <…

2023蓝帽杯半决赛misc题目复现

后续会逐渐完善&#xff1a; misc--排排坐吃果果 我真是无大语了&#xff0c;对于我的死脑筋&#xff0c;文件一打开是一片白色&#xff0c;但是点开单元格会看到里面有数字&#xff0c;我想到了修改单元格的格式&#xff0c;就是没想到转换字体的颜色&#xff0c;对此我表示…

构建基于neo4j知识图谱、elasticsearch全文检索的数字知识库

前言&#xff1a; 在数字化时代&#xff0c;知识库的建设正逐渐成为企业、学术机构和个人的重要资产。本文将介绍如何使用neo4j和elasticsearch这两种强大的数据库技术来构建知识库&#xff0c;并对其进行比较和探讨。 技术栈&#xff1a; springbootvueneo4jelasticsearch…

map的一些测试-string键的查找

主要区别在于声明map的时候多了一个less<> #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <map> #include <chrono> using namespace std; class spender { public:spender(string strfun) :strfun(strfun…

LeetCode算法二叉树—相同的树

目录 100. 相同的树 - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; 运行结果&#xff1a; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是…

FPGA的DQPSK调制解调Verilog

名称&#xff1a;DQPSK调制解调 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; 使用Verilog语言进行DQPSK调制和解调&#xff0c;并进行仿真 代码下载&#xff1a;DQPSK调制解调verilog&#xff0c;quartus_Verilog/VHDL资源下载 代码网&#xff1a;h…

哈希表9.24

13.罗马数字转整数 13. 罗马数字转整数 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/roman-to-integer/?envTypelist&envIdsxrVTWKy目的是将一串罗马数字字符串转为整数 使用哈希存储罗马字母对应的数字可以很方便我们遍历字符串时快速找到对应…

代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II

本文思路和详细解答来源于: 代码随想录 视频讲解见: 双指针法经典题目 | LeetCode&#xff1a;977.有序数组的平方_哔哩哔哩_bilibili Leetcode T977 有序数组的平方 题目链接: 977. 有序数组的平方 - 力扣&#xff08;LeetCode&#xff09; 思路1: 暴力求解 这里先解释一下非…

如何满足计算机化系统验证(CSV):制药企业的指南

随着科技的不断发展&#xff0c;制药企业在其日常运营中越来越多地依赖计算机化系统。这些系统涵盖了从研发到生产再到分销的各个领域&#xff0c;它们对于确保药品质量、跟踪生产流程以及维护患者安全至关重要。为了满足监管机构的法规要求&#xff0c;如美国FDA、欧盟Annex 1…

别再费劲配音了!小说推文视频一键生成,并带全自动配音

下面教你轻松一键制作出精彩的小说推文视频。 1. 输入文案生成小说推文视频 小说推文视频可以根据你输入的文案自动生成精美的视频内容&#xff0c;无需手动操作。只需提供文案&#xff0c;小说推文视频就能为你制作出令人惊艳的视频作品。 2. 自动小说推文配音 不用再费心去…

力扣:108. 将有序数组转换为二叉搜索树(Python3)

题目&#xff1a; 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 来源&#xff1a;力扣&#xff08;LeetCode&…

C#的属性讲解

文章目录 属性自动实现属性访问器内写逻辑属性不存储值其他文章 属性 在C#中&#xff0c;属性是一种特殊的成员&#xff0c;用于封装类的字段。它们提供了一种简洁和安全的方式来访问和设置类的状态和行为。 属性由两个访问器组成&#xff1a;get&#xff08;获取器&#xff…

测试工程师需要具备哪些“技能”?

1、良好的沟通 相信大家都在网上看到过各种吐槽程序员不解风情的段子&#xff0c;开怀大笑之余深思&#xff0c;作为一个测试工程师又何尝不是如此&#xff1f;通常沟通技能成为横亘在测试工程师与其他合作部门之间的万丈鸿沟&#xff0c;也成为测试工程师成长的最大瓶颈。下面…

【软件设计师-从小白到大牛】上午题基础篇:第三章 数据库系统

文章目录 前言章节提要一、三级模式两级映射真题链接 二、数据库的设计过程真题链接 三、E-R模型真题链接 四、关系代数SQL基础&#xff08;补充&#xff09; 五、规范化理论1、函数依赖2、价值与用途3、键4、范式5、模式分解 六、并发控制真题链接分布式数据库特点&#xff08…

二值贝叶斯滤波计算4d毫米波聚类目标动静属性

机器人学中有些问题是二值问题&#xff0c;对于这种二值问题的概率评估问题可以用二值贝叶斯滤波器binary Bayes filter来解决的。比如机器人前方有一个门&#xff0c;机器人想判断这个门是开是关。这个二值状态是固定的&#xff0c;并不会随着测量数据变量的改变而改变。就像门…

关于计算机找不到d3dx9_43.dll,无法继续执行代码修复方法

d3dx9_43.dll是一个动态链接库文件&#xff0c;它是DirectX的一个组件&#xff0c;主要用于处理游戏中的图形、声音等多媒体元素。当这个文件丢失时&#xff0c;可能会导致以下问题&#xff1a; 1. 游戏无法正常运行&#xff1a;由于d3dx9_43.dll负责处理游戏中的多媒体元素&a…