光明网站开发,dede5.7微电影网站模板,宜城营销型网站套餐,建设网站需要租用服务器上一篇介绍了如何配置通用开发参数及通过url回调验证#xff0c; 本篇将通过服务商后台配置关联小程序应用配置和获取第三方凭证及如何配置企业可信IP。 当然上篇配置的回调设置也不会白费#xff0c;在下方的指令和数据回调会用到。 第三方应用开发流程
官方企业微信第三方… 上一篇介绍了如何配置通用开发参数及通过url回调验证 本篇将通过服务商后台配置关联小程序应用配置和获取第三方凭证及如何配置企业可信IP。 当然上篇配置的回调设置也不会白费在下方的指令和数据回调会用到。 第三方应用开发流程
官方企业微信第三方应用开发的基本流程如下 小程序应用设置
获取suite_ticket需要使用SuiteID参数因为项目使用的是三方应用方式开发
这里可以通过设置小程序-关联小程序详情。
前面的配置基础信息与应用权限不在介绍比较简单。 配置内容描述
应用主页必填用户从企业微信工作台进入应用时将直接跳转到对应主页URL
桌面端独立主页用户从企业微信桌面端工作台进入应用时跳转的应用页面URL
可信域名仅支持可信域名内的应用调用OAuth2授权、JSSDK等
安装完成回调域名用户安装成功后可指定跳转至该域名的链接
业务设置URL授权企业的管理员可从企业微信后台的应用详情页免登录直接跳转该链接进行应用配置。
数据回调URL必填用于正确响应企业微信验证URL的请求用于接收托管企业微信应用的用户信息、进入应用事件、通讯录变更事件。
指令回调URL必填用户正确响应企业微信验证URL的请求用于接收应用添加、删除、修改以及ticket参数等API请求。 Secret是可以生成和改变的SuiteID是系统生成的。 配置可信域名
配置可信域名先填写网站域名不要写http或者https前缀直接是网站域名。
如下 具体怎么验证可信域名呢接着点击检验可信域名归属 需要把这个文件下载后上传到网站域名下并且可以访问到
放好之后如果验证不成功可能有缓存等待几分钟在尝试。 设置回调配置
这几项就关于回调的参数 之前配置过url/token/encodingAESKey直接再粘贴过来即可。
指令回调和数据回调地址可以写上篇完成的回调地址只是要注意现在的token和EncodingAESKey换成之前调好的token和EncodingAESKey和字符串就行或者也可以把代码中的这两项换成现在新生成的。 这些可以分步配置最后保存完成后效果如下图 如果暂时不知道设置项是什么作用可以先配置一个之后用上了再改即可。 获取ticket
设置好应用参数后把suiteID、secret粘贴一下在代码中要使用。 控制器接收参数
这里因为一开始不确定参数情况所以对接收的所有参数存储到日志中。
首先判断请求方式为post然后具体进入接收数据环节。
经过多次调试后确定需要接收四个参数内容其中msg_signature/timestamp/nonce三个可直接通过字段名获取到比较麻烦的是密文数据需要使用php://input获取。
内容是一个xml格式的字符串。
内容如下
public function wxNotify()
{$obj new CompanyWxPushService();$all request()-all();writeRecordLog(companyWechat.log, request()-method());writeRecordLog(companyWechat.log, var_export($all, true));if (request()-isMethod(POST)) {$msg_signature request()-input(msg_signature);$timeStamp request()-input(timestamp);$nonce request()-input(nonce);// post请求的密文数据$sReqData file_get_contents(php://input);echo $obj-callbackPOST($msg_signature, $timeStamp, $nonce, $sReqData);} die();
} 业务层解析
下面的处理中思路是收到post请求之后
1.解析出url上的参数包括消息体签名(msg_signature)时间戳(timestamp)以及随机数字串(nonce)
2.验证消息体签名的正确性。
3.将post请求的数据进行xml解析并将Encrypt标签的内容进行解密
解密出来的明文是xml格式的字符串需要转变为xml对象。
4.判断对象的infotype获取suite_ticket并进行存储之后调用access_token需要使用。
内容如下
class CompanyWxPushService
{// 接收信息时的加解密参数protected static $encodingAesKey 随机生成的encodingAESKey;// 接收信息时的校验Tokenprotected static $token 随机生成的token;protected static $corpId 服务商注册后获取的corpID;protected static $SuiteID 小程序应用详情获取的suiteID;protected static $Secret 小程序应用详情获取的secret;/*** 企业微信post回调解析* param $sReqMsgSig* param $sReqTimeStamp* param $sReqNonce* param $sReqData* return string*/public function callbackPOST($sReqMsgSig, $sReqTimeStamp, $sReqNonce, $sReqData){$sMsg ; // 解析之后的明文$wxcpt new \WXBizMsgCrypt(self::$token, self::$encodingAesKey, self::$SuiteID);$errCode $wxcpt-DecryptMsg($sReqMsgSig, $sReqTimeStamp, $sReqNonce, $sReqData, $sMsg);writeRecordLog(companyWechat.log, $errCode);if ($errCode 0) {// 解密成功sMsg即为xml格式的明文writeRecordLog(companyWechat.log, 解密成功\r\n. var_export($sMsg, true));// TODO: 对明文的处理// 解析该xml字符串利用simpleXMLlibxml_disable_entity_loader(true);//禁止xml实体解析防止xml注入$xml simplexml_load_string($sMsg, SimpleXMLElement, LIBXML_NOCDATA);switch ($xml-InfoType) {case suite_ticket: // 存储suite_ticket$log_desc 存储suite_ticket . $xml-SuiteTicket;self::$redisWechat-setCompanyTicket($xml-SuiteTicket);break;default:$log_desc 未知的类型: . $xml-InfoType;break;}writeRecordLog(companyWechat.log, 解析日志 . $log_desc);return success;} else {return ERR: . $errCode . \n\n;}}
} 获取ticket
企业微信服务器会定时每十分钟向指令回调 URL 推送 suite_ticket在指令回调的后台逻辑中解密消息体即可得到对应的 InfoType 和 SuiteTicket 。
不同类型的指令回调会通过不同的 InfoType 进行区分在每次解密得到 suite_ticket 后应在服务端临时缓存起来。
也可通过刷新ticket按钮来多次快速获取验证解析。 日志情况如下 获取 suite_access_token
获取suite_access_token即为获取第三方凭证这个在整个开发中很重要接下来的几个接口都需要三方凭证在成功接受并且缓存 suite_ticket 之后我们可以主动来获取 suite_access_token。获取suite_access_token时需要 suite_idsuite_secret suite_ticket 作为参数。 请求方式
POST 请求地址
https://qyapi.weixin.qq.com/cgi-bin/service/get_suite_token 参数说明 参数 是否必须 说明 suite_id 是 第三方应用id或者代开发应用模板id。第三方应用以ww或wx开头应用id对应于旧的以tj开头的套件id代开发应用以dk开头 suite_secret 是 第三方应用secret 或者代开发应用模板secret suite_ticket 是 企业微信后台推送的ticket即回调中获取的ticket 控制器
暂时先写一个请求看一下返回内容。
/*** 获取企业微信 suite_access_token*/
public function companyAccessToken()
{$obj new CompanyWxPushService();print_r($obj-companyAccessToken());die;
} 业务层处理
需要三方应用SuiteID和Secret参数和之前回调返回中解密后获取的suite_ticket。
Suite_ticket这一步是通过回调获取的suite_ticket内容设置的redis缓存。
/*** 获取企业微信 suite_access_token* return bool|string*/
public function companyAccessToken()
{$url https://qyapi.weixin.qq.com/cgi-bin/service/get_suite_token;$params [suite_id self::$SuiteID,suite_secret self::$Secret,suite_ticket self::$redisWechat-getCompanyTicket()];return $this-linkCurl($url, POST, $params);
}/*** 请求接口返回内容* param $url : 请求的URL地址* param $method : 请求方式POST|GET* param bool $params : 请求的参数* return bool|string*/
protected function linkCurl($url, $method, $params false)
{$ch curl_init();curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_FAILONERROR, false);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);if (strpos($ . $url, https://) 1) {curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);}curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);curl_setopt($ch, CURLOPT_TIMEOUT, 60);if ($method POST) {curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, json($params));} else if ($params) {curl_setopt($ch, CURLOPT_URL, $url . ? . http_build_query($params));}$response curl_exec($ch);if ($response FALSE) return false;curl_close($ch);return $response;
}
响应
{errcode:60020,errmsg:not allow to access from your ip:client ip 123.......}
怀疑是没注册应用和配置企业可信ip。
响应60020是未设置IP白名单可查看下方第三方应用企业可信IP设置。
设置后再次请求返回正常。
{suite_access_token:tpBubbmIlo_N5zoCKXvz_9q6IanamtrZMB2rBI_Mnh48m9Fqwr7dwak3QZZPJA5O7KBQ_736ks3yogBT5djZerXrajnDUk9hsvP2xGVMnJSq1jPKDvlzIbayUoIX3lCr,expires_in:7200} 响应参数描述 参数 是否必须 说明 suite_id 是 第三方应用id或者代开发应用模板id。第三方应用以ww或wx开头应用id对应于旧的以tj开头的套件id代开发应用以dk开头 suite_secret 是 第三方应用secret 或者代开发应用模板secret suite_ticket 是 企业微信后台推送的ticket 企业可信IP设置
第三方应用或待开发应用需要在服务商后台-服务商信息-基本信息
中设置ip白名单1分钟后生效。 设置白名单 注意一般员工账号看不到需要切换管理员账号。 总结
通过第三方应用开发流程可以知道获取第三方凭证suite_access_token的原因在之后的API中是一个很重要的参数在获取的途中因为不熟悉遇到设置白名单的问题权限是普通权限看不到服务商功能之后才发现是权限问题希望其他开发者不会有这个困惑。