<?php
namespace HomeController;
use ThinkController;
define("TOKEN","weixin");
/*
*WeChat entry file
* /
class WechatController extends Controller {
protected $User; //微信用戶對象
protected $app_id;
protected $secret;
/*通用入口 構(gòu)造方法
*aunthor:caodi
*date:2015-09-25
*/
public function _initialize() {
$this->app_id = C("APPID");
$this->secret = C("APPSECRET");
}
/*微信入口
*author:caodi
*date:2015-09-22
*/
public function wechat() {
DLOG("微信入口記錄的時間","run","caodi");
if ($_GET['echostr'] != NULL ) {
echo $_GET['echostr'];
exit;
}
//微信只會在第一次在URL中帶echostr參數(shù),以后就不會帶這個參數(shù)了
if ($this->checkSignature()) { //success!
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//extract post data
if (!empty($postStr)) {
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr,"SimpleXMLElement",LIBXML_NOCDATA);
$this->$User = $postObj;
//根據(jù)消息類型將信息分發(fā)
$this->route($postObj);
//exit;
//以下為測試用的
$toUsername = $postObj->ToUserName;
$fromUsername = $postObj->FromUserName;
$keyword = trim($postObj->Content);
$msyType = trim($postObj->MsgType); //消息類型
$event = trim($postObj->Event); //事件類型
$time = time();
$result = json_encode($postObj);
DLOG("消息的參數(shù)".$result,"run","caodi");
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
if ($event == "subscribe") {
$msgType = "text";
$contentStr = date("Y-m-d H:i:s",time());
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}
}
} else {
echo "error";
}
}
/*wechat身份驗證
*author:caodi
*date:2015-09-22
*/
public function checkSignature() {
//you must define TOKEN by yourself
if (!defined("TOKEN")) {
throw new Exception("TOKEN is not defined!");
}
$nonce = $_GET["nonce"];
$token = TOKEN;
$timestamp = $_GET["timestamp"];
$signature = $_GET["signature"];
echo $signature."<br/>";
echo $timestamp."<br/>";
echo $nonce."<br/>";
$tmpArr = array($token,$timestamp,$nonce);
sort($tmpArr,SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if ($tmpStr == $signature) {
return true;
echo "true";
} else {
return false;
echo "false";
}
}
/*根據(jù)微信的消息類型來進行的分發(fā)
*author:caodi
*date:2015-09-23
*/
public function route($postObj) {
$msgType = trim($postObj->MsgType);
DLOG("mygtype=".$msgType,"run","caodi");
switch ($msgType) {
//(1)接受的為消息推送
case "text":
$this->reponse_text($postObj);
break;
case "image":
$this->reponse_image($postObj);
break;
case "voice":
$this->reponse_voice($postObj);
break;
//(2)接受的為事件推送
case "event":
$event = $postObj->Event;
DLOG("event=".$event,"run","caodi");
switch ($event) {
case "subscribe":
$this->subscribe($postObj);
break;
case "unsubscribe":
$this->unsubscribe($postObj);
break;
//自定義菜單的事件功能
}
}
}
/*微信用戶關(guān)注微信號事件(獲取用戶的基本信息存入到用戶表中去)
*author:caodi
*date:2015-09-23
*/
public function subscribe($postObj) {
$open_id = $postObj->FromUserName;
$create_time = $postObj->CreateTime;
$UserDao = M("user");
//(1)根據(jù)用戶的open_id去 https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
$access_token = "RQ4fmRD-a2JflW7_9-mmefNkHnK35aoZHHXn9PoB_vqDfxVWdT8XNbtfv5F1v1yK_b81Xar3So4gRLdlX6QxJfa5fGApcOAeLI_Fx3h9hxGjkNhUgADXidNBKIi5EjanHOZjADAVCN";
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token."&openid=".$open_id."&lang=zh_CN";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //要求保存的結(jié)果到字符串還是輸出在屏幕上,非0表示保存到字符串中
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //對認證來源的檢查,0表示阻止對證書的合法性檢查
$result = curl_exec($ch);
DLOG("result".$result,"run","caodi");
curl_close($ch);
$user_info = json_decode($result,true);
//(2)將得到的用戶信息保存到數(shù)據(jù)庫中去
$data = array();
$data['user_nick'] = $user_info['nickname'];
$user_info['sex'] = $user_info['sex'] == 0 ? 1 : $user_info['sex']; //將性別為0的轉(zhuǎn)化為默認的男性
$data['user_sex'] = $user_info['sex'];
$data['user_avatar'] = $user_info['headimgurl'];
$data['user_type'] = 1;//用戶類型 1-普通用戶 2-助理
$open_id = json_decode($open_id,true);
$data['wx_open_id'] = $user_info['openid'];
$data['user_app_version'] = "wechat9.0";
$data['user_platform'] = "wechat"; //當前使用的設(shè)備平臺
$data['user_create_time'] = date("Y-m-d H:i:s",time());
$result = $UserDao->add($data);
DLOG("sql= ".$UserDao->getlastsql(),"run","caodi");
if($result === false) {
DLOG("數(shù)據(jù)庫插入失敗","run","caodi");
exit;
}
}
/*自定義菜單的生成
*author:caodi
*date:2015-09-24
*/
public function create_menu(){
include_once(APP_PATH."Common/Conf/menu_config.php");
$data = $menu_config;
$access_token = "RQ4fmRD-a2JflW7_9-mmefNkHnK35aoZHHXn9PoB_vqDfxVWdT8XNbtfv5F1v1yK_b81Xar3So4gRLdlX6QxJfa5fGApcOAeLI_Fx3h9hxGjkNhUgADXidNBKIi5EjanHOZjADAVCN";
$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
var_dump($result);
exit;
}
/*通過OAuth2.0的網(wǎng)頁授權(quán)(自定義菜單中,獲取用戶的openID同時進入我的任務(wù)頁)
*author:caodi
*date:2015-09-24
*/
public function my_task () {
$code = $_GET['code'];
$oprn_id = $this->code_to_openID($code);
var_dump($code);
echo "caodi"."<br>";
echo "<center><h1>{$open_id}</h1></center>";
}
/*由OAuth2.0獲取到的code轉(zhuǎn)化成用戶的openID
*author:caodi
*date:2015-09-24
*/
public function code_to_openID($code) {
if (empty($code) == true) {
DLOG("獲取的code為空","run","caodi");
exit;
}
$appid = $this->app_id;
$secret = $this->secret;
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$secret."&code=".$code."&grant_type=authorization_code";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
DLOG("由OAuth2.0獲取到的code轉(zhuǎn)化成用戶的openID的結(jié)果=".$result,"run","caodi");
curl_close($ch);
$user_info = json_decode($result,true);
$open_id = $user_info['openid'];
return $open_id;
}
}
?>
if ($_GET['echostr'] != NULL ) {
echo $_GET['echostr'];
exit;
}
對接的時候打印一下post和get。。不會沒有的