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


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

    开始配置开发信息。本篇中记录在调试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');

    控制器

    接收参数,并返回响应。

    1. public function wxNotify()
    2. {
    3. $obj = new CompanyWxPushService();
    4. $all = request()->all();
    5. writeRecordLog('companyWechat.log', var_export($all, true));
    6. if (request()->isMethod('GET')) {
    7. // 获取参数
    8. $msg_signature = request()->input('msg_signature');
    9. $timeStamp = request()->input('timestamp');
    10. $nonce = request()->input('nonce');
    11. $echoStr = request()->input('echostr');
    12. echo $obj->callbackGET($msg_signature, $timeStamp, $nonce, $echoStr);
    13. }
    14. die();
    15. }

    业务层处理

    接收到该请求时:

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

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

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

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

    内容如下:

    1. class CompanyWxPushService
    2. {
    3. // 接收信息时的加解密参数
    4. protected static $encodingAesKey = "随机生成的encodingAESKey";
    5. // 接收信息时的校验Token
    6. protected static $token = "随机生成的token";
    7. protected static $corpId = "服务商注册后获取的corpID";
    8. /**
    9. * 企业微信GET回调处理(URL地址校验)
    10. * @param $sVerifyMsgSig
    11. * @param $sVerifyTimeStamp
    12. * @param $sVerifyNonce
    13. * @param $sVerifyEchoStr
    14. * @return string
    15. */
    16. public function callbackGET($sVerifyMsgSig, $sVerifyTimeStamp, $sVerifyNonce, $sVerifyEchoStr)
    17. {
    18. $sVerifyEchoStr = str_replace(" ", "+", $sVerifyEchoStr);
    19. $wxcpt = new \WXBizMsgCrypt(self::$token, self::$encodingAesKey, self::$corpId);
    20. // 调用验证函数
    21. $sEchoStr = "";
    22. $errCode = $wxcpt->VerifyURL($sVerifyMsgSig, $sVerifyTimeStamp, $sVerifyNonce, $sVerifyEchoStr, $sEchoStr);
    23. if ($errCode == 0) {
    24. return $sEchoStr;
    25. } else {
    26. return "ERR: " . $errCode;
    27. }
    28. }
    29. }

    配置开发信息

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

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

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

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

    遇到问题

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

    对照全局错误码提示是:

    40001

    不合法的secret参数

    发现问题

    比对了好几遍token/encodingAESKey/corpId

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

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

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

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

    如下:

    解决方案

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

    内容如下:

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

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

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

  • 相关阅读:
    【毕业设计】基于javaEE+原生Servlet+MySql的村镇旅游网站设计与实现(毕业论文+程序源码)——村镇旅游网站
    深入解析Kotlin类与对象:构造、伴生、单例全面剖析
    jmeter录制登录脚本
    MYBatis——业务功能,动态sql
    LeetCode 185 部门工资前三高的所有员工
    锐捷Ruijie路由器版本升级
    领域事件和集成事件没那么高大上
    1分钟-从例题加深对C语言中指针的了解
    《DevOps实践指南》- 读书笔记(三)
    OpenCV 透视变换
  • 原文地址:https://blog.csdn.net/json_ligege/article/details/133142839