この機能はずっと実装したいと思っていましたが、なかなかやる気にならなかったのですが、幸いなことにNetEaseからインターンシップのオファーをいただいたので、機嫌を良くして皆さんに共有するためにこの機能を実装しました。最初に効果を確認できます。WeChat パブリック アカウントsay_magic をフォローするだけです。
次に、URL http://www.saymagic.cn/weixin/wall.php を開き、公式アカウントで返信します: ウォールに投稿 + 言いたいことを入力すると、発言が同期されることがわかります上記URLへ。
プロセス全体は大まかに次のようになります:
公式アカウントのバックエンドはメッセージを受信してデータベースに保存します。フロントエンドはjsのsetTimeout関数を使ってループし、ajaxを使ってバックグラウンドからデータを取得してデータベースの最新データを取得します。原理全体を理解した後、非常に簡単に思えるので、メインのコードを見てみましょう:
wall.php(WeChat ウォールページ)
<?php include_once("sql.php"); ?> <!doctype html> <html> <head> <meta charset="utf-8" /> <title>微信墙</title> <style> #msgBox div { padding: 19px; margin-bottom: 20px; background: #aaaaaa; border: 2px solid #e3e3e3; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.05); -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,0.05); box-shadow: inset 0 1px 1px rgba(0,0,0,0.05); filter:alpha(opacity=60); /* CSS3 standard */ opacity:0.4; font-style:italic; font-size:15px; width:50%; } body{ background: url(bg_main.jpg); } </style> </head> <body> <center> <p id="msgBox"> <?php $wxQuery = "SELECT * FROM wx_note ORDER BY id DESC LIMIT 25";//把wx_msg更改掉 $wxResult =$mysql->query($wxQuery); while ($wxRow=mysql_fetch_row($wxResult)) { $lastID or $lastID = $wxRow[0];//0代表数据库中的id,这个要和你自己数据库相对应 $content = $wxRow[4];//4也是一样的 echo "<p>",$content,"</p>\n"; } $lastID = (int)$lastID; ?> </p> <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.3.min.js"></script> <script> var lastID = <?php echo $lastID; ?>; function getMessages() { $.ajax({ url: "message.php?lastID=" + lastID + "&v=" + (new Date()/1), dataType: "json", error: function(){ alert("Error loading JSON document"); }, success: function(data){//如果调用php成功 $.each(data,function(i,n){ message = "<p>" + n + "</p>"; $(message).prependTo("#msgBox").hide().slideDown("slow"); lastID = i; }); } }); window.setTimeout(getMessages, 5000); } getMessages(); </script> </center> </body> </html>
<?php $hostname = "***********"; $dbuser = "***********"; $dbpass = "***************"; $dbname = "************"; $mysql = new mysql( $hostname,$dbuser,$dbpass,$dbname,"",""); class mysql { private $db_host; //数据库主机 private $db_user; //数据库用户名 private $db_pwd; //数据库用户名密码 private $db_database; //数据库名 private $conn; //数据库连接标识; private $result; //执行query命令的结果资源标识 private $sql; //sql执行语句 private $row; //返回的条目数 private $coding; //数据库编码,GBK,UTF8,gb2312 private $bulletin = true; //是否开启错误记录 private $show_error = false; //测试阶段,显示所有错误,具有安全隐患,默认关闭 private $is_error = false; //发现错误是否立即终止,默认true,建议不启用,因为当有问题时用户什么也看不到是很苦恼的 /*构造函数*/ public function __construct($db_host, $db_user, $db_pwd, $db_database, $conn, $coding) { $this->db_host = $db_host; $this->db_user = $db_user; $this->db_pwd = $db_pwd; $this->db_database = $db_database; $this->conn = $conn; $this->coding = $coding; $this->connect(); } /*数据库连接*/ public function connect() { if ($this->conn == "pconn") { //永久链接 $this->conn = mysql_pconnect($this->db_host, $this->db_user, $this->db_pwd); } else { //即使链接 $this->conn = mysql_connect($this->db_host, $this->db_user, $this->db_pwd); } if (!mysql_select_db($this->db_database, $this->conn)) { if ($this->show_error) { $this->show_error("数据库不可用:", $this->db_database); } } //mysql_query("SET NAMES $this->coding"); } /*数据库执行语句,可执行查询添加修改删除等任何sql语句*/ public function query($sql) { if ($sql == "") { $this->show_error("SQL语句错误:", "SQL查询语句为空"); } $this->sql = $sql; $result = mysql_query($this->sql, $this->conn); if (!$result) { //调试中使用,sql语句出错时会自动打印出来 if ($this->show_error) { $this->show_error("错误SQL语句:", $this->sql); } } else { $this->result = $result; } return $this->result; } } ?>
データベースから最新のデータを継続的に取得するファイル message.php.
<?php header("Content-Type:text/html; charset=UTF-8");//utf-8,使中文不会变成乱码 /************************************************************** * * 使用特定function对数组中所有元素做处理 * @param string &$array 要处理的字符串 * @param string $function 要执行的函数 * @return boolean $apply_to_keys_also 是否也应用到key上 * @access public * *************************************************************/ function arrayRecursive(&$array, $function, $apply_to_keys_also = false) { static $recursive_counter = 0; if (++$recursive_counter > 1000) { die("possible deep recursion attack"); } foreach ($array as $key => $value) { if (is_array($value)) { arrayRecursive($array[$key], $function, $apply_to_keys_also); } else { $array[$key] = $function($value); } if ($apply_to_keys_also && is_string($key)) { $new_key = $function($key); if ($new_key != $key) { $array[$new_key] = $array[$key]; unset($array[$key]); } } } $recursive_counter--; } function JSON($array) { arrayRecursive($array, "urlencode", true); $json = json_encode($array); return urldecode($json); } $lastID = (int) $_GET["lastID"]; include_once("sql.php"); $backValue=array(); $wxQuery = "SELECT * FROM wx_note WHERE id > ".$lastID." ORDER BY id LIMIT 3"; $wxResult = $mysql->query($wxQuery); while ($wxRow=mysql_fetch_row($wxResult)) { $recordID = $wxRow[0]; $content = $wxRow[4]; //$xml=$content; $backValue[$recordID ] = $content; } echo JSON($backValue); ?>
もちろん、ここで話しているのはバックエンド部分だけです。WeChat メッセージを処理する場合、受信したメッセージをデータベースに保存する必要もあります。これは難しいことではありません。コード。ここで、操作したばかりのメソッドのデータ形式に対応していることを忘れないでください。これは最もエラーが発生しやすいものです。ご質問がございましたら、メッセージを残してください。