微信公眾號開發(一)--公眾號關注推送
阿新 • • 發佈:2019-02-01
使用者關注公眾號回撥
參考資料
基本資訊
- AppID:開發者ID,微信公眾號的唯一標識
- AppSecret:開發者密碼,操作微信公眾號的驗證
- IP白名單:獲取access_token時,需要IP白名單才可以獲取
- OpenID:微信使用者在當前公眾號的唯一標識
- UnionID:微信使用者在當前開放平臺賬號的所有公眾號和應用情景下的唯一標識
- 伺服器配置:
(1)地址:配置以後,使用者對公眾號的操作(關注、發訊息),微信會轉到該連結
(2)令牌:用作生成簽名
(3)金鑰:訊息加密
官方文件教程
7.驗證伺服器地址,6(1) 配置時要在連結下,原樣輸出微信傳送GET請求的引數echostr,驗證成功過後,才能配置完成。
公眾號關注後的推送
- 在上一步的伺服器地址中,加入以下程式碼
(1) 介面加密,官方PHP-DEMO
include_once "wxBizMsgCrypt.php";
// 第三方傳送訊息給公眾平臺
$encodingAesKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG";
$token = "pamtest";
$timeStamp = "1409304348";
$nonce = "xxxxxx";
$appId = "wxb11529c136998cb6";
$text = "<xml><ToUserName ><![CDATA[oia2Tj我是中文jewbmiOUlr6X-1crbLOvLw]]></ToUserName><FromUserName><![CDATA[gh_7f083739789a]]></FromUserName><CreateTime>1407743423</CreateTime><MsgType><![CDATA[video]]></MsgType><Video><MediaId><![CDATA[eYJ1MbwPRJtOvIEabaxHs7TX2D-HV71s79GUxqdUkjm6Gs2Ed1KF3ulAOA9H1xG0]]> </MediaId><Title><![CDATA[testCallBackReplyVideo]]></Title><Description><![CDATA[testCallBackReplyVideo]]></Description></Video></xml>";
$pc = new WXBizMsgCrypt($token, $encodingAesKey, $appId);
$encryptMsg = '';
$errCode = $pc->encryptMsg($text, $timeStamp, $nonce, $encryptMsg);
if ($errCode == 0) {
print("加密後: " . $encryptMsg . "\n");
} else {
print($errCode . "\n");
}
$xml_tree = new DOMDocument();
$xml_tree->loadXML($encryptMsg);
$array_e = $xml_tree->getElementsByTagName('Encrypt');
$array_s = $xml_tree->getElementsByTagName('MsgSignature');
$encrypt = $array_e->item(0)->nodeValue;
$msg_sign = $array_s->item(0)->nodeValue;
$format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%s]]></Encrypt></xml>";
$from_xml = sprintf($format, $encrypt);
// 第三方收到公眾號平臺傳送的訊息
$msg = '';
$errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $from_xml, $msg);
if ($errCode == 0) {
print("解密後: " . $msg . "\n");
} else {
print($errCode . "\n");
}
(2) 關注、傳送訊息的推送 官方文件
$xmlStr = $GLOBALS['HTTP_RAW_POST_DATA'];
if(!empty($xmlStr )){
// 解析該xml字串,利用simpleXML
libxml_disable_entity_loader(true);
//禁止xml實體解析,防止xml注入
$requestXml = simplexml_load_string($xmlStr , 'SimpleXMLElement', LIBXML_NOCDATA);
//判斷該訊息的型別,通過元素MsgType
switch ($requestXml ->MsgType){
case 'event':
//判斷具體的時間型別(關注、取消、點選)
$event = $requestXml->Event;
if ($event=='subscribe') { // 關注事件
//檢視使用者是否首次關注
$content = '歡迎關注!';
if(isset($requestXml->EventKey)) {
// 掃特定二維碼關注會攜帶相對應的引數,具體見下一篇
}
}elseif ($event=='CLICK') {//選單點選事件
}elseif ($event=='VIEW') {//連線跳轉事件
}
break;
case 'text'://文字訊息
break;
case 'image'://圖片訊息
break;
case 'voice'://語音訊息
break;
case 'video'://視訊訊息
break;
case 'shortvideo'://短視訊訊息
break;
case 'location'://位置訊息
break;
case 'link'://連結訊息
break;
}
}
(3)接受關注的資料格式
(4) 回覆訊息
//基本訊息模板
private $mMsgTemplate = [
'text' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>',//文本回復XML模板
'image' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[image]]></MsgType><Image><MediaId><![CDATA[%s]]></MediaId></Image></xml>',//圖片回覆XML模板
'music' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[music]]></MsgType><Music><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><MusicUrl><![CDATA[%s]]></MusicUrl><HQMusicUrl><![CDATA[%s]]></HQMusicUrl><ThumbMediaId><![CDATA[%s]]></ThumbMediaId></Music></xml>',//音樂模板
'news' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>%s</ArticleCount><Articles>%s</Articles></xml>',// 新聞主體
'news_item' => '<item><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item>',//某個新聞模板
];
//回覆
echo sprintf($this->mMsgTemplate ['text'], $requestXml->FromUserName, $requestXml ->ToUserName, time(), $msgContent);