Bootstrap

PHP处理钉钉回调数据

1.钉钉应用回调配置页面

  •  进入钉钉开放平台=>我的后台=>应用开放选项下,应用功能 =>事件与回调
  • 推送方式Http推送(steam模式需要接入sdk)
  • 填写加密的key 、token。代码里会用到
  • 请求网址也就是回调的地址,填写你外网可访问的地址加路由(如果自己测试的话也可以用内网穿透工具 ,比如ngrok,我也只用过这个哈哈哈)
  • 事件订阅,订阅你需要回调的,比如审批实例开始结束

2.接下来是代码时间

class CallBackController extends Controller
{
    public function synchronousDing(Request $request)
    {
        $get  = $_GET;
        $post = json_decode(file_get_contents('php://input'));

        $crypt = new DingCallbackCrypto('上面的你生成的token', "生成的key", '应用的AppKey');
        $res   = $crypt->getEncryptedMap("success");

        $text =  $crypt->getDecryptMsg($get['signature'], $get['timestamp'], $get['nonce'], $post->encrypt);
        $res  = json_decode($text[1], true);
        $this->dispatch(new ChangeDingOpera($res));
    }
   
}

当事件发生时,钉钉会主动向配置的HTTP地址发送POST请求。

请求的URL格式如下:

http://你注册的HTTP地址?signature=111108bb8e6dbc2xxxx&timestamp=1783610513&nonce=380320111

包含的JSON数据如下:

{
    "encrypt":"1ojQf0NSvw2WPvW7LijxS8UvISr8pdDP+rXpPbcLGOmIBNbWetRg7IP0vdhVgkVwSoZBJeQwY2zhROsJq/HJ+q6tp1qhl9L1+ccC9ZjKs1wV5bmA9NoAWQiZ+7MpzQVq+j74rJQljdVyBdI/dGOvsnBSCxCVW0ISWX0vn9lYTuuHSoaxwCGylH9xRhYHL9bRDskBc7bO0FseHQQasdfghjkl"
}

其中:

  • signature为消息体签名。

  • timestamp为时间戳。

  • nonce为随机字符串。

  • encrypt为加密的推送事件信息。

你要响应钉钉,告诉他,收到啦收到啦!!

  • 当你收到开放平台的POST验证请求时,你需要做解密处理,并在1500ms内返回包含success的加密字符串(JSON格式)。钉钉开放平台收到返回的JSON信息后会做解密处理,如果可以得到正常的success字符串,则验证回调信息推送正常,否则会判定为失败的回调信息。

具体参考钉钉的文档---事件订阅

 回调消息体加解密  参考钉钉文档给的demo

官方里的库链接

这里不深入了,等我学会了再来,直接调用

解密后我们会获得一个EventType

 /*user_add_org : 通讯录用户增加
    user_modify_org : 通讯录用户更改
    user_leave_org : 通讯录用户离职
    org_admin_add :通讯录用户被设为管理员
    org_admin_remove :通讯录用户被取消设置管理员
    org_dept_create : 通讯录企业部门创建
    org_dept_modify : 通讯录企业部门修改
    org_dept_remove : 通讯录企业部门删除
    org_remove : 企业被解散
    */

具体事件,看文档

最后就是处理事件

if($this->type == "bpms_instance_change"){
  if (isset($this->res['result'])) {
      //处理你的事件  
  }
}

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;