前提
配置服务器
代码
php文件
//此处处接管了 关注事件吧关注用户添加到数据库
public function actionAc(){
define("TOKEN", "****");//定义识别码
define("APPID", "wx3ea1b*****148bc");//公众号appid
define("SECRET", "7492106fccf11******e60");
$wechatObj = new wechatCallbackapiTest();//实例化wechatCallbackapiTest类
if(!isset($_GET["echostr"])){
$wechatObj->responseMsg();
}else{
$wechatObj->valid();//进行认证
}
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
public function responseMsg()//执行接收器方法
{
$postStr = file_get_contents('php://input', 'r');
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
switch($RX_TYPE){
case "event":
$result = $this->receiveEvent($postObj);
break;
case "text";
$content = $this->selecttext($postObj);
$result = $this->transmitText($postObj,$content);
break;
}
if (isset($result)){
echo $result;
}else{
echo "";
exit;
}
}else{
echo "";
exit;
}
}
private function receiveEvent($object){
$content = "";
switch ($object->Event){
case "subscribe":
$content = "终于等到你!点击下方【约课】按钮去体验迈步课程吧,新人更有优惠大礼包可以领取哦!";//这里是向关注者发送的提示信息
$this->getuserinfo($object);
break;
case "unsubscribe":
$content = "";
break;
}
$result = $this->transmitText($object,$content);
return $result;
}
private function transmitText($object,$content){
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
return $result;
}
private function transmitImage($object,$content){
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType>< ![CDATA[image] ]></MsgType>
<Image>
<MediaId>< ![CDATA[[%s] ]></MediaId>
</Image>
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
return $result;
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
//存储用户信息 平台数据为小程序和公众号数据互通
private function getuserinfo($object){
$getaccurl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".SECRET;
$access_token = json_decode(self::curl($getaccurl),true);
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token['access_token']."&openid=".$object->FromUserName."&lang=zh_CN";
$info = $access_token = json_decode(self::curl($url),true);
$open_id = $info['openid'];
$unid = isset($info['unionid'])?$info['unionid']:'';
$nickname = $info['nickname'];
$headimgurl = $info['headimgurl'];
$sex = $info['sex'];
$model = new MemberWeixin();
$model = MemberWeixin::findOne(['unionid'=>$unid]);
if (!$model){
$model = new MemberWeixin();
$model->unionid = $unid;
$model->nickname = $nickname;
$model->pic = $headimgurl;
$model->sex = $sex;
$model->wechat_open_id = $open_id;
}else{
$model->wechat_open_id = $open_id;
$model->sex = $sex;
}
$model->save();
}
public static function curl($url){
$ch = curl_init();
// 2. 设置选项,包括URL
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 3. 执行并获取HTML文档内容
$output = curl_exec($ch);
if($output === FALSE ){
echo "CURL Error:".curl_error($ch);
}
// 4. 释放curl句柄
curl_close($ch);
return $output;
}
//此处为监听用户输入事件进行回复
public function selecttext($postObj){
$Content =$postObj->Content;
$open_id =$postObj->FromUserName;
if ($_SERVER['SERVER_PORT'] == 80){ 该判断在不同的服务器下有可能有误 去掉即可
$http = "http://";
}else{
$http = "https://";
}
if ($Content =="教练绑定"||$Content == '绑定教练'){
$host = $http.$_SERVER['HTTP_HOST'].'/v1/web/index?open_id='.$open_id;
$info = json_decode(self::curl('http://api.ft12.com/api.php?format=json&url='.$host));
if ($info->url !== ''){
$content = $info->url;
}
$content = "系统回复:如果您是迈步运动教练,请点击【<a href='".$content."'>这里</a>】,在打开的页面验证您的手机号进行绑定。";
}else{
$content = '你好欢迎来到迈步健身服务!';
}
return $content;
}
}
}