概要
上一篇文章微信里检索kintone记录信息的方法,我们讨论了在微信里检索kintone记录信息的方法。
这次我们将给大家介绍,如何将kintone里新增加的记录,通知到微信的方法。
工作中,下属提交完工作报告,上司如果出差在外,不下载kintone手机应用的话,往往没法及时查看。
但现在大家手机里都会有微信,如果可以在微信里查看,是不是很棒?
简单地说,就是我们将在kintone里新建一个周报的应用,然后追加一条记录发送给微信里指定的人。
由于正式公众号需要认证,这次我们暂时使用微信公众账号测试号。
完成后的样子
kintone上登录写周报,保存。
微信收到消息,确认。
准备
kintone设置
首先根据上面的设想来创建kintone应用。我创建的是简易版的应用。
字段类型 | 字段名称 | 字段代码 | 备注 |
---|---|---|---|
单行文本框 | 标题 | 标题 | 自动计算: DATE_FORMAT(日期, "YYYY年M月d日", "system")&" "&创建人 隐藏计算公式 |
日期 | 日期 | 日期 | 将登记记录时的日期作为初始值 |
多行文本框 | 内容 | 内容 | |
创建人 | 创建人 | 创建人 |
微信公众号设置
接口的配置可以参考微信里检索kintone记录信息的方法 里的微信公众号设置。
和kintone关联
下面是主要的原理图。
要完成这个过程主要有两个步骤。第一步,利用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);
向微信主动推送消息的时候,我们需要用到模板消息。微信公众号文档里有关于发送模板消息的具体说明。
首先点击 “新增测试模板”,在微信测试号里注册一个模板信息。
填入以下内容后,点击提交。
提交成功后,系统会自动分配一个模板id号,记住这个模板ID。
编写发送模板信息的处理代码。
代码
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,从而实现更多有趣的功能,大家可以试试看。