基本信息
源码名称:php通过微信公众号给用户推送自定义模板消息
源码大小:4.38KB
文件格式:.zip
开发语言:PHP
更新时间:2019-04-29
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

/===========================API申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
define("token", "");//接口配置信息-Token
define("appid", "");//测试号消息-appID
define("appsecret", "");//测试号消息-appsecret
define("template_id", "");//模板消息接口-模版ID
define("openid", "");//管理员openid
//===========================
//===========================API申请地址:http://www.tuling123.com/member/robot/index.jhtml
define("tulingkey", "");//图灵key
//===========================
//===========================API申请地址:https://console.bce.baidu.com/ai/#/ai/ocr/app/list
define("API_Key", "");//百度OCR API_Key
define("Secret_Key", "");//百度OCR Secret_Key
//===========================



$wechat = new wechatcallback();
if (isset($_GET['echostr'])){//微信token验证
	echo $wechat->checkSignature();
}else if(isset($_GET['type'])){//推送消息
	if($_GET['type']=="send"){
		$wechat->send();
	}elseif($_GET['type']=="send2html"){
		$http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
		$url = $http_type.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."2html";
		echo '<!DOCTYPE html><html><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8"><title>胖虎胖虎胖胖胖胖胖</title><meta name="viewport"content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/><style type="text/css">body{font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:14px;line-height:1.6;color:#333;background-color:#fff;padding:20px;max-width:960px;margin:0 auto}body>*:first-child{margin-top:0!important}body>*:last-child{margin-bottom:0!important}p,blockquote,ul,ol,dl,table,pre{margin:15px 0}h1,h2,h3,h4,h5,h6{margin:20px 0 10px;padding:0;font-weight:bold;-webkit-font-smoothing:antialiased}h1 tt,h1 code,h2 tt,h2 code,h3 tt,h3 code,h4 tt,h4 code,h5 tt,h5 code,h6 tt,h6 code{font-size:inherit}h1{font-size:28px;color:#000}h2{font-size:24px;border-bottom:1px solid#ccc;color:#000}h3{font-size:18px}h4{font-size:16px}h5{font-size:14px}h6{color:#777;font-size:14px}body>h2:first-child,body>h1:first-child,body>h1:first-child h2,body>h3:first-child,body>h4:first-child,body>h5:first-child,body>h6:first-child{margin-top:0;padding-top:0}a:first-child h1,a:first-child h2,a:first-child h3,a:first-child h4,a:first-child h5,a:first-child h6{margin-top:0;padding-top:0}h1 p,h2 p,h3 p,h4 p,h5 p,h6 p{margin-top:10px}a{color:#4183C4;text-decoration:none}a:hover{text-decoration:underline}ul,ol{padding-left:30px}ul li>:first-child,ol li>:first-child,ul li ul:first-of-type,ol li ol:first-of-type,ul li ol:first-of-type,ol li ul:first-of-type{margin-top:0px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}dl{padding:0}dl dt{font-size:14px;font-weight:bold;font-style:italic;padding:0;margin:15px 0 5px}dl dt:first-child{padding:0}dl dt>:first-child{margin-top:0px}dl dt>:last-child{margin-bottom:0px}dl dd{margin:0 0 15px;padding:0 15px}dl dd>:first-child{margin-top:0px}dl dd>:last-child{margin-bottom:0px}pre,code,tt{font-size:12px;font-family:Consolas,"Liberation Mono",Courier,monospace}code,tt{margin:0 0px;padding:0px 0px;white-space:nowrap;border:1px solid#eaeaea;background-color:#f8f8f8;border-radius:3px}pre>code{margin:0;padding:0;white-space:pre;border:none;background:transparent}pre{background-color:#f8f8f8;border:1px solid#ccc;font-size:13px;line-height:19px;overflow:auto;padding:6px 10px;border-radius:3px}pre code,pre tt{background-color:transparent;border:none}kbd{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;background-color:#DDDDDD;background-image:linear-gradient(#F1F1F1,#DDDDDD);background-repeat:repeat-x;border-color:#DDDDDD#CCCCCC#CCCCCC#DDDDDD;border-image:none;border-radius:2px 2px 2px 2px;border-style:solid;border-width:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:10px;padding:1px 4px}blockquote{border-left:4px solid#DDD;padding:0 15px;color:#777}blockquote>:first-child{margin-top:0px}blockquote>:last-child{margin-bottom:0px}hr{clear:both;margin:15px 0;height:0px;overflow:hidden;border:none;background:transparent;border-bottom:4px solid#ddd;padding:0}table th{font-weight:bold}table th,table td{border:1px solid#ccc;padding:6px 13px}table tr{border-top:1px solid#ccc;background-color:#fff}table tr:nth-child(2n){background-color:#f8f8f8}img{max-width:100%}</style></head><body><h1>鸡你太美(•̀ᴗ•́)و ̑̑ </h1><hr><h3>这条内容的链接为:</h3><pre><code>'.$url.'</code></pre><h3>这里的链接可以自由设置你的内容,<br>比如下面这样:</h3><p><img src="https://0d077ef9e74d8.cdn.sohucs.com/rp0UNzs"></p><blockquote>https://www.52pojie.cn</blockquote><blockquote>made by 0xE9</blockquote></body></html>';
	}else{
		exit("are you cxk?");
	}
}else{//收到消息
	echo $wechat->responseMsg();
}

class wechatcallback{
	const ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=";
	const SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=";
	const TULING_URL = "http://www.tuling123.com/openapi/api";
	const BAIDU_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/webimage";
	const BAIDU_TOKEN_URL = "https://aip.baidubce.com/oauth/2.0/token";
	
	public function checkSignature(){
		$echoStr = $_GET["echostr"];
		$signature = $_GET["signature"];
		$timestamp = $_GET["timestamp"];
		$nonce = $_GET["nonce"];
		$token = token;
		$tmpArr = array($token, $timestamp, $nonce);
		sort($tmpArr);
		$tmpStr = implode( $tmpArr );
		$tmpStr = sha1( $tmpStr );
		if( $tmpStr == $signature ){
			return $echoStr;
		}else{
			return;
		}
	}
	
	public function get_access_token(){
		$output = $this->https_request(self::ACCESS_TOKEN_URL .appid."&secret=".appsecret);
		$jsoninfo = json_decode($output, true);
		$access_token = $jsoninfo["access_token"];
		return $access_token;
	}
	
	public function responseMsg(){
		$postStr = @$GLOBALS["HTTP_RAW_POST_DATA"];
		if (!empty($postStr)){
			$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
			$RX_TYPE = trim($postObj->MsgType);
			if($postObj->FromUserName == openid){
				if($RX_TYPE == "text"){//文本消息
					$contentStr = $this->gettuling($postObj->Content);
					$result = $this->transmitText($postObj, "图灵返回:".$contentStr);
				}else if($RX_TYPE == "image"){//图片消息	
					$contentStr = $this->getocr($postObj->PicUrl);
					$result = $this->transmitText($postObj, "百度识图:".$contentStr);
				}else if($RX_TYPE == "event"){//菜单消息
					$eventkey = $postObj->EventKey;
					if($eventkey==""){$eventkey = $postObj->Event;}
					switch ($eventkey){
						case "subscribe"://普通关注
							$fromuser = $postObj->FromUserName;
							$result = $this->transmitText($postObj, "管理员关注我啦!");
							break;
						case "unsubscribe"://取消关注
							$fromuser = $postObj->FromUserName;
							$content = $this->DeleteUuid($fromuser);
							break;
						default:
							
					}
				}else{
					$result = $this->transmitText($postObj, "未设定的消息:".$RX_TYPE);
				}
			}else{
				$result = $this->transmitText($postObj, "未设置管理员账户");
			}
			return $result;
		}else {
			return;
		}
	}
	
	public function send(){
		$access_token = $this->get_access_token();
		$url = self::SEND_URL . $access_token;
		$http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
		$data = [
			'touser' => openid,
			'template_id' => template_id,
			'url' => $http_type.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."2html",//设置推送消息点击后的链接
			'data'=>array(
				'func'=>array('value' => '这是测试来源','color' => '#173177'),
				'time'=>array('value' => date("Y-m-d H:i:s",time()),'color' => '#173177'),
				'msg'=>array('value' => '这是测试内容','color' => '#173177'),
			)
		];
		$json = json_encode($data);
		$req = $this->https_request($url, $json);
		echo $req;
		return $req;
	}
	
	
	private function gettuling($txt){
		$a1=tulingkey;
		if(empty($a1)){
			return "接收的内容为".$txt.",图灵key未配置,无法自动回复";
		}
		$url = self::TULING_URL."?key=".tulingkey."&info=".$txt;
		$res = $this -> https_request($url);
		$res = json_decode($res);
		switch($res ->code){
			case '100000'://文本类消息
				$contentStr = $res->text;
				break;
			case '200000'://链接类
				$contentStr = $res->text;
				$contentStr.= $res->url;
				break;
			default:
				$contentStr = "沙雕网友";
		}
		return $contentStr;
	}
	
	private function getocr($pic){
		$a1=Secret_Key;
		$a2=API_Key;
		if(empty($a1)||empty($a2)){
			return "接收的图片为".$pic.",百度key未配置,无法识别";
		}
		$url = self::BAIDU_URL;
		$data['grant_type'] = 'client_credentials';
		$data['client_id'] = API_Key;
		$data['client_secret'] = Secret_Key;
		$access_token_url = self::BAIDU_TOKEN_URL;
		$result = $this -> https_request($access_token_url, $data);
        $result = json_decode($result,true);
		$access_token = $result['access_token'];
		$request_data = array("url"=>$pic,"detect_direction"=>"true");
        $request_url = $url . "?access_token={$access_token}&aipSdk=php&aipSdkVersion=2_2_2";
		$data_result = $this -> https_request($request_url, $request_data);	
		
		$api = json_decode($data_result,true);
		$str="";
		for($i=0;$i<count($api["words_result"]);$i  ){
			$str.= $api["words_result"][$i]["words"].PHP_EOL;
		}
		return $str;
	}
	
	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></xml>";
		$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
		return $result;
	}
	
	private function https_request($url,$data = null){
		$curl = curl_init();
		curl_setopt($curl, CURLOPT_URL, $url);
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
		if (!empty($data)){
			curl_setopt($curl, CURLOPT_POST, 1);
			curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
		}
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		$output = curl_exec($curl);
		curl_close($curl);
		return $output;
	}
}
?>