經(jīng)過之前系列內(nèi)容過后傲宜,接下來的代微信公眾號實(shí)現(xiàn)業(yè)務(wù)部分跟微信公眾號開發(fā)業(yè)務(wù)邏輯一樣函卒,所以公眾號其他業(yè)務(wù)功能部分后面我會(huì)單獨(dú)整理一套相關(guān)內(nèi)容撇眯,今天,咱們就來說說微信第三方平臺(tái)開發(fā)的最后一步—— 全網(wǎng)發(fā)布熊榛,因?yàn)橹挥羞M(jìn)行全網(wǎng)發(fā)布后锚国,我們的第三方平臺(tái)才可以接收所有的微信公眾號的授權(quán),否則就只能接收測試公眾號的授權(quán)血筑。
在正式進(jìn)行全網(wǎng)發(fā)布之前,必須先通過全網(wǎng)發(fā)布接入檢測车伞,意思就是此時(shí)微信服務(wù)器會(huì)通過自動(dòng)化測試的方式喻喳,來檢測我們開發(fā)的第三方平臺(tái)的基礎(chǔ)邏輯是否正常可用表伦,只有在確定基礎(chǔ)可用的情況下蹦哼,才會(huì)允許第三方平臺(tái)提交全網(wǎng)發(fā)布。
當(dāng)然翔怎,在前往開放平臺(tái)進(jìn)行全網(wǎng)發(fā)布之前赤套,我們首先要根據(jù)測試步驟,用代碼實(shí)現(xiàn)相關(guān)邏輯容握,才能順利通過全網(wǎng)發(fā)布,在這一步一般會(huì)出現(xiàn)以下三個(gè)問題:返回Api文本信息塑猖,返回普通文本信息谈跛,發(fā)送事件信息。
首先蜡励,在開發(fā)文檔里阻桅,我們可以看到,官方提供了專用測試公眾號信息稽寒,其中appid為 wx570bc396a51b8ff8趟章,Username為gh_3c884a361561慎王。
1) 發(fā)送事件信息
模擬粉絲觸發(fā)專用測試公眾號的事件搔啊,并推送事件消息到專用測試公眾號北戏,第三方平臺(tái)需要提取推送過來的XML信息中event的值嗜愈,并且第三方平臺(tái)需要在5秒內(nèi)立即返回按照官方要求組裝成文本消息回復(fù)給粉絲,格式為:event + “from_callback”(假定event為LOCATION蠕嫁,則文本消息內(nèi)容為: LOCATIONfrom_callback)剃毒。
這里,我們需要先判斷事件信息是否屬于專用測試公眾號赘阀,然后組裝進(jìn)行回復(fù):
if($toUsername== 'gh_3c884a361561'){
$event = $postObj-> Event;
$content =$event.'from_callback';
responseText($postObj,$content);
}
2)返回普通文本信息
模擬粉絲發(fā)送文本消息給專用測試公眾號基公,第三方平臺(tái)需要根據(jù)文本消息的內(nèi)容進(jìn)行相應(yīng)的響應(yīng),這里推過來的會(huì)是一個(gè)固定內(nèi)容轰豆,為TESTCOMPONENT_MSG_TYPE_TEXT酸休,而我們也是返回一個(gè)固定文本內(nèi)容即可,為TESTCOMPONENT_MSG_TYPE_TEXT_callback:
if(strtolower($postObj -> MsgType) == 'text' &&trim($postObj->Content)=='TESTCOMPONENT_MSG_TYPE_TEXT'){
$toUsername = $postObj-> ToUserName;
if($toUsername =='gh_3c884a361561'){
$content ='TESTCOMPONENT_MSG_TYPE_TEXT_callback';
responseText($postObj,$content);
}
}
3)返回Api文本信息
模擬粉絲發(fā)送文本消息給專用測試公眾號渗饮,第三方平臺(tái)需要在5秒內(nèi)返回空串表明暫時(shí)不回復(fù)陡厘,然后再立即使用客服消息接口發(fā)送消息回復(fù)粉絲。
第三方平臺(tái)接收到的文本信息為QUERY_AUTH_CODE:$query_auth_code$云茸,這里我們只要進(jìn)行“QUERY_AUTH_CODE”字段判定就可以了谤饭,在拿到$query_auth_code$的值后懊纳,需要利用$query_auth_code$的值來換取公眾號的授權(quán)信息(換取授權(quán)信息實(shí)現(xiàn)方法見微信公眾號三方平臺(tái)開發(fā)【獲取授權(quán)方的授權(quán)信息以及基本信息】)亡容,然后再調(diào)用發(fā)送客服消息api來給粉進(jìn)行文本消息回復(fù),其中文本消息內(nèi)容為:$query_auth_code$_from_api:
if(strpos ( $postObj->Content, 'QUERY_AUTH_CODE' ) !== false){
$query_auth_code =str_replace ( 'QUERY_AUTH_CODE:', '', $postObj->Content);
$wechat =A('Wechat/Wechat');
$info = $wechat->getAuthInfo($query_auth_code);
$access_info=$info['authorization_info'] ['authorizer_access_token'];
$param ['touser'] =$postObj ->FromUserName;
$param ['msgtype'] ='text';
$param ['text']['content'] = $query_auth_code . '_from_api';
$url ='https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$access_info;
$res = post_data ($url, $param );
}
完整消息事件完整代碼:
public function reponseMsg(){
require_once(dirname(__FILE__).'/wxBizMsgCrypt.php');
//encodingAesKey和token均為申請三方平臺(tái)是所填寫的內(nèi)容
$encodingAesKey = '公眾號消息加解密Key';
$token = '公眾號消息校驗(yàn)Token';
$appId = '三方平臺(tái)appid';
$timeStamp = empty($_GET ['timestamp'] ) ? "" : trim ( $_GET ['timestamp'] );
$nonce = empty ($_GET['nonce'] ) ? "" : trim ( $_GET ['nonce'] );
$msg_sign = empty($_GET ['msg_signature'] ) ? "" : trim ( $_GET ['msg_signature'] );
$pc = new\WXBizMsgCrypt( $token, $encodingAesKey, $appId );
//獲取到微信推送過來post數(shù)據(jù)(xml格式)
$postArr=$GLOBALS['HTTP_RAW_POST_DATA'];
$msg = '';
$errCode=$pc->decryptMsg($msg_sign, $timeStamp, $nonce, $postArr,$msg);
if($errCode == 0){
//處理消息類型,并設(shè)置回復(fù)類型和內(nèi)容
$postObj=simplexml_load_string($msg,'SimpleXMLElement',LIBXML_NOCDATA);
//判斷該數(shù)據(jù)包是否是訂閱(用戶關(guān)注)的事件推送
if(strtolower($postObj-> MsgType) == 'event'){
//第三方平臺(tái)全網(wǎng)發(fā)布檢測發(fā)送事件消息測試
$toUsername= $postObj -> ToUserName;
if($toUsername== 'gh_3c884a361561'){
$event= $postObj -> Event;
$content= $event.'from_callback';
responseText($postObj,$content);
}
//如果是關(guān)注subscribe事件
if(strtolower($postObj->Event== 'subscribe')){
$public_name=strval($postObj->ToUserName);
$map['public_name']=$public_name;
$cont=M('Subscribe')->where($map)->find();
//回復(fù)用戶消息
$content=$cont['content'];
responseText($postObj,$content);
}
}
//第三方平臺(tái)全網(wǎng)發(fā)布檢測普通文本消息測試
if(strtolower($postObj-> MsgType) == 'text' &&trim($postObj->Content)=='TESTCOMPONENT_MSG_TYPE_TEXT'){
$toUsername= $postObj -> ToUserName;
if($toUsername== 'gh_3c884a361561'){
$content= 'TESTCOMPONENT_MSG_TYPE_TEXT_callback';
responseText($postObj,$content);
}
}
//第三方平臺(tái)全網(wǎng)發(fā)布檢測返回api文本消息測試
if(strpos ($postObj->Content, 'QUERY_AUTH_CODE' ) !== false){
$query_auth_code= str_replace ( 'QUERY_AUTH_CODE:', '', $postObj->Content);
$wechat= A('Wechat/Wechat');
$info= $wechat ->getAuthInfo($query_auth_code);
$access_info=$info['authorization_info'] ['authorizer_access_token'];
$param['touser'] = $postObj ->FromUserName;
$param['msgtype'] = 'text';
$param['text'] ['content'] = $query_auth_code . '_from_api';
$url='https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$access_info;
$res = post_data ( $url,$param );
}
//用戶發(fā)送某一圖文關(guān)鍵字的時(shí)候,回復(fù)圖文消息
if(strtolower($postObj->MsgType) == 'text' && trim($postObj->Content)=='圖文'){
//這一步可從數(shù)據(jù)庫中查詢得到
$arr=array(
array(
'title'=>'test1',
'description'=>'test1',
'picUrl'=>'http://mmbiz.qpic.cn/mmbiz/mLiaE7fSUysSbbqzicX2LVsLL1HsXMRV0m6uicfiaSX9Aic43BA5vnpFOBMWAoEuaVDicoOX4HzGT8OT5QK6DRs14VkQ/0',
'url'=>'https://mp.weixin.qq.com/s?__biz=MjM5NzY4MDc0MA==&tempkey=mKI6U0rlJZofvceyQdxTPAYtneMxKyhWy52ytbUZfOJzFEHMDqmYTQLQWrkrSRky&appmsgid=10000002&itemidx=1&sign=99baf31f45e2357af575c63b5b303b6a#wechat_redirect',
),
array(
'title'=>'test2',
'description'=>'test2',
'picUrl'=>'http://mmbiz.qpic.cn/mmbiz_jpg/mLiaE7fSUysTFDEZQTOvXleYwYqFN1JeLwM66Zg7dHjK3aHQxdVtwGTJgzuKJRuZCBHljIvVLkvZ2CADJ6paJYQ/0?wx_fmt=jpeg',
'url'=>'https://mp.weixin.qq.com/s?__biz=MjM5NzY4MDc0MA==&tempkey=mKI6U0rlJZofvceyQdxTPDXw5wcPw4rpHzkwOv4U7kDY1V%2BUUirAB0C9oEEsX5HQB8Uv1Ut2zj3buNkRPh6KNYWVyTaxebMkb8IcD9FjNbpcqY0mdRbCxRnbIjtmNBd37cKXm3Egbo1KWdkSEy5NZg%3D%3D&chksm=315123030626aa15c3e454afbd931ec3458149b13370999b16bc72b876326977e7d68b406a8c#rd',
)
);
responseNews($postObj,$arr);
}else{
//當(dāng)微信用戶發(fā)送關(guān)鍵字,公眾號回復(fù)對應(yīng)內(nèi)容
$public_name=strval($postObj->ToUserName);
$keyword=strval(trim($postObj -> Content));
$log['public_name']=$public_name;
$log['keyword']=array('like','%'.$keyword.'%');
$con=M('Keyword')->where($log)->select();
foreach($conas $vo => $k){
$conn=$con[$vo]['content'];
}
if($conn){
$content=$conn;
}else{
$lg['public_name']=$public_name;
$lg['keyword']='';
$con=M('Keyword')->where($lg)->select();
foreach($conas $vo => $k){
$conn=$con[$vo]['content'];
}
$content=$conn;
}
responseText($postObj,$content);
}
}
}
完成后衬以,再前往開放平臺(tái)校摩,點(diǎn)擊全網(wǎng)發(fā)布,等待一分鐘左右备籽,看到所有狀態(tài)都為成功分井,則代表全網(wǎng)發(fā)布接入檢測通過了,點(diǎn)擊【確定】尺锚,就愉快的發(fā)布咯。