微信開發中的訊息驗證與訊息回覆
微信開發中的訊息驗證與訊息回覆
處理邏輯
- 判斷微信伺服器傳來的資料是否含有名為echostr的GET引數
- 有則進行伺服器訊息驗證(valid)
- 沒有則微信推送過來的是一條訊息,需要我們處理。
訊息型別分為
1)事件型別:使用者關注/取消關注事件、掃描二維碼事件……
2)被動回覆型別:使用者傳送過來一條文字、圖片、語音……
然後根據需求回覆相應的文字、圖片、圖文….
程式碼示例
<?php
define("TOKEN","###your token###");
require_once 'response.class.php';
$res=new response();
if(!isset($_GET['echostr'])){
responseMsg();
}else{
valid();
}
function valid(){
/* @微信伺服器訊息驗證
*
* 1)將token、timestamp、nonce三個引數進行字典序排序
* 2)將三個引數字串拼接成一個字串進行sha1加密
* 3)開發者獲得加密後的字串可與signature對比,標識該請求來源於微信
*
* */
$echoStr=$_GET['echostr'];
$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){
echo $echoStr;
exit();
}
}
function responseMsg(){
/* @獲取微信推送過來的post資料(xml)
*
* 以下舊的提取方式,php高版本已經廢棄了
* $postStr=$GLOBALS['HTTP_RAW_POST_DATA'];
*
* */
$postStr=file_get_contents("php://input");
/* @將xml資料轉化為obj
*
* */
$postObj=simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);
/* @根據接收到的不同訊息,進行相應回覆
* 1.使用者關注事件
* 2.使用者傳送訊息被動回覆
*
* */
if(strtolower($postObj->MsgType)=='event'){
if(strtolower($postObj->Event)=='subscribe'){//使用者關注事件
$content="歡迎關注XXXX";
responseText($postObj, $content);
}
}else if(strtolower($postObj->MsgType)=='text'){
switch(trim($postObj->Content)){
/*被動回覆文字資訊*/
case 'test':
$content="this is test!";
responseText($postObj, $content);
break;
case 'time':
$content="現在是北京時間:".date("Y-m-d H:i:s",time());
responseText($postObj, $content);
break;
case 'website':
$content="<a href='http://www.hewie.cn'>乘風破浪</a>";
responseText($postObj, $content);
break;
/*被動回覆圖文資訊*/
case 'news':
$arr=array(
array(
'title'=>'我的csdn部落格',
'description'=>'歡迎訪問我的csdn部落格',
'picUrl'=>'http://avatar.csdn.net/9/5/4/1_somehow1002.jpg',
'url'=>'http://blog.csdn.net/somehow1002',
),
array(
'title'=>'開源中國',
'description'=>'。。。。。',
'picUrl'=>'https://www.oschina.net/img/ie/logo_osc.png','',
'url'=>'https://www.oschina.net/',
),
);
responseNews($postObj, $arr);
break;
default:
$content="sorry, I don't understand!";
$res->responseText($postObj, $content);
break;
}
}
}
function responseText($postObj,$content){
/* @文字訊息回覆格式
*
* <xml>
* <ToUserName><![CDATA[toUser]]></ToUserName>
* <FromUserName><![CDATA[fromUser]]></FromUserName>
* <CreateTime>12345678</CreateTime>
* <MsgType><![CDATA[text]]></MsgType>
* <Content><![CDATA[你好]]></Content>
* </xml>
*
* */
$fromUserName=$postObj->ToUserName;
$toUserName=$postObj->FromUserName;
$time=time();
$msgType='text';
$template="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
echo sprintf($template,$toUserName,$fromUserName,$time,$msgType,$content);
}
function responseNews($postObj,$arr){
/* @圖文訊息回覆格式
* #一個item一則圖文訊息
*
* <xml>
* <ToUserName><![CDATA[toUser]]></ToUserName>
* <FromUserName><![CDATA[fromUser]]></FromUserName>
* <CreateTime>12345678</CreateTime>
* <MsgType><![CDATA[news]]></MsgType>
* <ArticleCount>2</ArticleCount>
* <Articles>
* <item>
* <Title><![CDATA[title1]]></Title>
* <Description><![CDATA[description1]]></Description>
* <PicUrl><![CDATA[picurl]]></PicUrl>
* <Url><![CDATA[url]]></Url>
* </item>
* <item>
* <Title><![CDATA[title]]></Title>
* <Description><![CDATA[description]]></Description>
* <PicUrl><![CDATA[picurl]]></PicUrl>
* <Url><![CDATA[url]]></Url>
* </item>
* </Articles>
* </xml>
*
* */
$fromUserName=$postObj->ToUserName;
$toUserName=$postObj->FromUserName;
$time=time();
$msgType='text';
$template="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>".count($arr)."</ArticleCount>
<Articles>";
foreach($arr as $v){
$template.="
<item>
<Title><![CDATA[".$v[title]."]]></Title>
<Description><![CDATA[".$v[description]."]]></Description>
<PicUrl><![CDATA[".$v['picUrl']."]]></PicUrl>
<Url><![CDATA[".$v[url]."]]></Url>
</item>";
}
$template.="
</Articles>
</xml>";
echo sprintf($template,$toUserName,$fromUserName,time());
}
參考微信開發手冊
原文地址:http://blog.csdn.net/somehow1002/article/details/76919270
個人見解,如有錯誤之處,歡迎指正。
相關文章
- PHP微信開發之模板訊息回覆PHP
- 微信公眾平臺開發(十) 訊息回覆總結
- 微信開發推送訊息案例
- 微信怎麼群發訊息?微信群發助手群發訊息圖文教程
- 微信小程式開發(十七)模板訊息微信小程式
- 微信開發——同步粉絲、群發訊息
- 微信公眾號開發之客服訊息
- Java微信公眾平臺開發(四)--回覆訊息的分類及實體的建立Java
- 訊息機制篇——初識訊息與訊息佇列佇列
- 微信小程式客服自動回覆訊息功能採坑(完)微信小程式
- 給微信伺服器發訊息伺服器
- 訊息認證碼
- 訊息佇列之如何保證訊息的可靠傳輸佇列
- php ActiveMQ的傳送訊息,與處理訊息PHPMQ
- 利用redis的hash結構搭建訊息服務(發訊息,訂閱訊息,消費訊息,退訂)Redis
- 微信開發實戰(5)—粉絲關注開發者公眾號時,自動回覆訊息
- 用程式碼理解 ObjC 中的傳送訊息和訊息轉發OBJ
- 用程式碼理解ObjC中的傳送訊息和訊息轉發OBJ
- 訊息佇列-如何保證訊息的不被重複消費(如何保證訊息消費的冪等性)佇列
- 18行程式碼寫出微信拜年訊息智慧回覆,過年微信輕鬆過行程
- 分散式訊息佇列:如何保證訊息的順序性分散式佇列
- OC訊息機制,訊息轉發機制
- iOS開發訊息推送原理iOS
- chrome devtools 開發之訊息通訊Chromedev
- 使用 laravel-wechat-notification 傳送微信模板訊息、企業微信應用訊息Laravel
- RocketMQ 訊息整合:多型別業務訊息-普通訊息MQ多型型別
- Laravel 的 Validation 檢索驗證錯誤訊息Laravel
- 訊息佇列批次收發訊息,請避開這 5 個坑!佇列
- Objective-C中的訊息轉發Object
- 微信公眾號開發(二)識別訊息型別型別
- 微信公眾平臺開發(十二) 傳送客服訊息
- RocketMQ 訊息整合:多型別業務訊息——定時訊息MQ多型型別
- 【實戰教程】小程式客服訊息的自動回覆
- Kafka如何保證訊息不丟之無訊息丟失配置Kafka
- 自定義訊息和對訊息的理解
- iOS 訊息轉發iOS
- 沒用過訊息佇列?一文帶你體驗RabbitMQ收發訊息佇列MQ
- Storm保證訊息處理ORM