kintone里有新增记录时如何发送通知到微信

cybozu发表于:2017年05月26日 11:20:21更新于:2019年09月06日 13:52:53

概要

上一篇文章微信里检索kintone记录信息的方法,我们讨论了在微信里检索kintone记录信息的方法。

这次我们将给大家介绍,如何将kintone里新增加的记录,通知到微信的方法。

工作中,下属提交完工作报告,上司如果出差在外,不下载kintone手机应用的话,往往没法及时查看。
但现在大家手机里都会有微信,如果可以在微信里查看,是不是很棒?

简单地说,就是我们将在kintone里新建一个周报的应用,然后追加一条记录发送给微信里指定的人。

由于正式公众号需要认证,这次我们暂时使用微信公众账号测试号。

完成后的样子

kintone上登录写周报,保存。

0015927d9e8f363d3fb13992ba40538

微信收到消息,确认。

0015927d9fe7ae97538de1bfce005bd

准备

kintone设置

首先根据上面的设想来创建kintone应用。我创建的是简易版的应用。

字段类型字段名称字段代码备注
单行文本框标题标题

自动计算:

DATE_FORMAT(日期, "YYYY年M月d日", "system")&" "&创建人

隐藏计算公式

日期日期日期将登记记录时的日期作为初始值
多行文本框内容内容
创建人创建人创建人


微信公众号设置

接口的配置可以参考微信里检索kintone记录信息的方法 里的微信公众号设置


和kintone关联

下面是主要的原理图。

001592801cf753981a2e2f3a1e77854

要完成这个过程主要有两个步骤。第一步,利用kintone这边的JavaScript自定义,向服务器发送请求,将数据传送给服务器;第二步,服务器将数据转发给微信。

kintone自定义

当新建和编辑记录提交的时候,将标题和内容使用外部API函数proxy,发送给服务器。

代码

服务器端处理

jQuery.noConflict();
(function($) {
    kintone.events.on(["app.record.create.submit", "app.record.edit.submit"], function(e) {
        var record = e.record;
        var data = {
            'title': record["标题"]["value"],
            'content': record["内容"]["value"]
        }
        var headers = {'Content-Type': 'application/json'};
        kintone.proxy('服务器URL/test.php', 'POST', headers, data, function(body, status, headers) {
            console.log(status, JSON.parse(body), headers);
        }, function(error) {
            console.log(error);  //显示proxy API的response body(字符串)
        });
    });
})(jQuery);

向微信主动推送消息的时候,我们需要用到模板消息。微信公众号文档里有关于发送模板消息的具体说明。

首先点击 “新增测试模板”,在微信测试号里注册一个模板信息。

0015931173247cbe705a0fa26bbc5e5

填入以下内容后,点击提交。

0015931173b2e8e45c1afa29b7b76e1

提交成功后,系统会自动分配一个模板id号,记住这个模板ID。0015931173dc70dcb7af4a0235dad5f

编写发送模板信息的处理代码。

代码


test.php
<?php
define("APPID", "wxcbfaxxxxxx1814d4");  //appID
define("APPSECRET", "604113xxxxxxxxxxxxxxx0bda2240c47"); //appsecret 
define("TOKEN", "cnDevNet"); //Token
$in = json_decode(file_get_contents('php://input'));
$title = $in->title;
$content = $in->content;
require "./wechat.inc.php";
$wechat = new WeChat(APPID, APPSECRET, TOKEN);
$data = array(
    "touser" => "onxxxxxxxxxxxxxxxxxxxxxxxxxx", //接受人openId
    "template_id" => "hkrr6vqAmHGQiXw5DR8Uu30fVAnjN7j47_rM29li5E0", //模板ID
    "url" => "https://xxxx.cybozu.com/k/m/74/",
    "data" => array(
        "title" => array(
            "value" => $title,
            "color" => "#173177"
        ),
        "content" => array(
            "value" => $content,
            "color" => "#173177"
        )
    )
);
$wechat->send_template_message(urldecode(json_encode($data)));
$status = array('title' => $title, 'content' => $content);
exit(json_encode($status));
?>


wechat.inc.php
<?php
require_once("./curl.php");
class WeChat
{
    private $_appid;
    private $_appsecret;
    private $_token;
    public function __construct($appid, $appsecret, $token)
    {
        $this->_appid = $appid;
        $this->_appsecret = $appsecret;
        $this->_token = $token;
    }
    private function _request($curl, $https = true, $post = "get", $data = null, $header = null, $type = null)
    {
        $Curl = new Curl();
        return $Curl->_request($curl, $https, $post, $data, $header, $type);
    }
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        //valid signature , option
        if($this->checkSignature())
        {
            echo $echoStr;
            exit;
        }
    }
    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token = $this->_token;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        
        if( $tmpStr == $signature )
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    private function _getAccessToken()
    {
        $file = "./accessToken";
        
        if (file_exists($file))
        {
            $content = file_get_contents($file);
            $content = json_decode($content);
            if (time() - filemtime($file) < $content->expires_in)
            {
                return $content->access_token;
            }
        }
        $content = $this->_request("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->_appid."&secret=".$this->_appsecret);
        
        file_put_contents($file, $content);
        
        $content = json_decode($content);
        return $content->access_token;
    }
    
    public function send_template_message($data)
    {
        return $this->_request("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$this->_getAccessToken(), true, "post", $data);
    }
}
?>


curl.php
<?php
class Curl
{
    public function _request($curl, $https = true, $post = "get", $data = null, $header = null, $type = null)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $curl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        if ($header)
        {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        }
        if ($https)
        {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        }
        
        if ($post == "post")
        {
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        $str = curl_exec($ch);
        if ($type == "image")
        {
            header('Content-type: image/JPEG');
        }
        curl_close($ch);
        return $str; 
    }
}
?>

总结

我们主要使用了kintone的外部API函数,将kintone的请求发送到外部的服务器上进行处理,从而和微信进行联动。

使用kintone的外部API函数,还可以调用很多其他的API,从而实现更多有趣的功能,大家可以试试看。