ホームページ >php教程 >php手册 >php+ajax で WeChat ウォール投稿を実装

php+ajax で WeChat ウォール投稿を実装

WBOY
WBOYオリジナル
2016-06-21 08:48:321074ブラウズ

この機能はずっと実装したいと思っていましたが、なかなかやる気にならなかったのですが、幸いなことに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>

mysql操作ファイルsql.php:
<?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);


?>



最後に、必要に応じて背景画像があります: /program/UploadPic/2014-3/2014317135337634.jpg。


もちろん、ここで話しているのはバックエンド部分だけです。WeChat メッセージを処理する場合、受信したメッセージをデータベースに保存する必要もあります。これは難しいことではありません。コード。ここで、操作したばかりのメソッドのデータ形式に対応していることを忘れないでください。これは最もエラーが発生しやすいものです。ご質問がございましたら、メッセージを残してください。


転載する場合は明記してください: 私のオリジナルのブログリンク http://blog.saymagic.cn/blog.php?id=58




声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。