WeChat 공개 계정과 같은 WeChat 애플리케이션을 개발할 때 우리 모두는 기능이 많을수록 좋기를 바랍니다. 따라서 오늘은 PHP에서 WeChat 날씨 쿼리를 구현하는 방법에 대해 이야기하겠습니다. Baidu를 호출하기만 하면 됩니다. 날씨 인터페이스입니다. 이제 더 이상 헛소리는 하지 마세요. 살펴보겠습니다!
우리가 달성하려는 효과는 아래 그림과 같습니다. WeChat에서 "Shenzhen Weather"와 같은 특정 장소의 날씨를 입력하면 다음 페이지가 나타납니다.
ps: I would 여기서는 제가 사용하는 백엔드 서버가 Sina sae 서버라고 말씀드리고 싶습니다. 여기서는 자세히 소개하지 않겠습니다. 코드의 첫 번째 페이지는 주로 백엔드 서버를 통한 WeChat 사용자 요청에 응답하는 데 사용됩니다. 이 페이지의 코드는 비교적 간단하므로 소개하지 않겠습니다. <?php
header("content-Type:text;charset=utf8;")
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
$wechatObj->responseMsg();
}else{
$wechatObj->valid();
}
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
private function checkSignature()
{
$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 true;
}else{
return false;
}
}
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$this->logger("R ".$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":
$result = $this->receiveText($postObj);
break;
}
$this->logger("T ".$result);
echo $result;
}else {
echo "";
exit;
}
}
private function receiveEvent($object)
{
$content = "";
switch ($object->Event)
{
case "subscribe":
$content = "欢迎关注,查询天气,发送天气加城市名,如“深圳天气”";
break;
case "unsubscribe":
$content = "取消关注";
break;
}
$result = $this->transmitText($object, $content);
return $result;
}
//str_replace(str1,str2,str3)用str3包含str1,用str2取代str1.
private function receiveText($object)
{
$keyword = trim($object->Content);
if (strstr($keyword, "天气")){
$city = str_replace('天气', '', $keyword);//这里用空格取代$keyword中的天气二字。
include("weather2.php");
$content = getWeatherInfo($city);
//判断笑话
}
$result = $this->transmitNews($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>
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
return $result;
}
private function transmitNews($object, $arr_item)
{
if(!is_array($arr_item))
return;
$itemTpl = " <item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
";
$item_str = "";
foreach ($arr_item as $item)
$item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
$newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";
$result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item));
return $result;
}
private function transmitMusic($object, $musicArray)
{
$itemTpl = "<Music>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<MusicUrl><![CDATA[%s]]></MusicUrl>
<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>";
$item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
$item_str
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
return $result;
}
//这里主要用于在服务器端生成日志
private function logger($log_content)
{
if(isset($_SERVER['HTTP_BAE_ENV_APPID'])){ //BAE
require_once "BaeLog.class.php";
$logger = BaeLog::getInstance();
$logger ->logDebug($log_content);
}else if(isset($_SERVER['HTTP_APPNAME'])){ //SAE
sae_set_display_errors(false);
sae_debug($log_content);
sae_set_display_errors(true);
}else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL
$max_size = 10000;
$log_filename = "log.xml";
if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}
file_put_contents($log_filename, date('H:i:s')." ".$log_content."\r\n", FILE_APPEND);
}
}
}
?>
1. Baidu의 날씨 인터페이스를 호출하려면 Baidu Map Open Platform에 등록한 다음 애플리케이션을 생성하여 애플리케이션의 ak 및 sk를 얻어야 합니다.
ak(액세스 키)를 획득한 후 설정을 클릭하면 다음과 같은 페이지가 나옵니다.
인증 방법을 요청한 sn 인증 방법을 선택하면 아래의 sk 코드(보안 키)가 자동으로 나타납니다. .
sk의 구체적인 역할과 sn 계산 알고리즘에 대해서는 다음 글을 참고해주세요
http://lbsyun.baidu.com/index.php?title=lbscloud/api/appendix
<?php // var_dump(getWeatherInfo("桃江")); getWeatherInfo("深圳"); function getWeatherInfo($cityName) { if ($cityName == "" || (strstr($cityName, "+"))){ return "发送天气加城市,例如'天气深圳'"; } $ak = 'Plev804CmHUMwPXVcehCcB14Ths0zuat';//从百度地图开发平台获取的ak $sk = 'Iv3vSPCd2jnIlMlCrCgywGSkP9PaXiDC';//从百度地图开发平台获取的sk //向百度地图开发平台请其数据的url如http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=yourak**&sn=7de5a22212ffaa9e326444c75a58f9a0。包含4个参数,address(查询地址),output(请求数据的恢复格式)、ak(验证密钥)、sn是经过加密后的数据。 $url = 'http://api.map.baidu.com/telematics/v3/weather?ak=%s&location=%s&output=%s&sn=%s'; $uri = '/telematics/v3/weather'; $location = $cityName; $output = 'json'; $querystring_arrays = array( 'ak' => $ak, 'location' => $location, 'output' => $output ); $querystring = http_build_query($querystring_arrays);//使用关联数组生成一个urlencode请求字符串。格式如下:ak=Plev804CmHUMwPXVcehCcB14Ths0zuat&location=深圳&output=json; // var_dump($querystring); //urlencode() url中的一些特殊字符和中文字符可能不被服务器所识别,需要经过urlencode()编码才能被识别。 $sn = md5(urlencode($uri.'?'.$querystring.$sk));//md5()对url中的数据进行加密。 $targetUrl = sprintf($url, $ak, urlencode($location), $output, $sn); // var_dump($targetUrl); //curl用于与接口服务器建立会话获取 接口传递过来的数据。 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $targetUrl);//与接口简历会话 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//获取的数据存储在一个变量上,而不是直接输出。如果为o或false则直接输出。 $result = curl_exec($ch);//执行会话,获取数据。 echo $result;//字符串格式加数个json格式的数据类型 curl_close($ch); $result = json_decode($result, true);//参数带true返回一个数组 echo "</br>"; echo "</br>"; echo "</br>"; echo "</br>"; echo "</br>"; echo "</br>"; echo "</br>"; echo "</br>"; var_dump($result); if ($result["error"] != 0){ return $result["status"]; } $curHour = (int)date('H',time()); echo "</br>"; echo "</br>"; echo "</br>"; echo "</br>"; echo $curHour; $weather = $result["results"][0]; $weatherArray[] = array("Title" =>$weather['currentCity']."天气预报", "Description" =>"", "PicUrl" =>"", "Url" =>""); for ($i = 0; $i < count($weather["weather_data"]); $i++) { $weatherArray[] = array("Title"=> $weather["weather_data"][$i]["date"]."\n". $weather["weather_data"][$i]["weather"]." ". $weather["weather_data"][$i]["wind"]." ". $weather["weather_data"][$i]["temperature"], "Description"=>"", "PicUrl"=>(($curHour >= 6) && ($curHour < 18))?$weather["weather_data"][$i]["dayPictureUrl"]:$weather["weather_data"][$i]["nightPictureUrl"], "Url"=>""); } return $weatherArray; } ?>
위 내용은 이 글의 요약입니다. 모든 내용을 잘 살펴보시기 바랍니다. 이 글은 이제 막 WeChat을 시작한 학생들에게는 다소 어려울 수 있습니다!관련 추천:
도시 날씨를 파악하기 위한 PHP WeChat 개발
위 내용은 PHP는 WeChat 실시간 날씨 쿼리를 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!