以前寫的一篇微信公衆號文章。php
工做須要,進行這次調研,並記錄開發過程。
開發目的,頁面受權,頁面獲取用戶頭像,用戶暱稱 微信id, 分享頁面。css
微信訂閱號 沒法獲取用戶我的信息前端
寫在記錄前,公衆號也是第二次搞了,每次看完內心都是一陣苦,究其緣由就是沒有完全搞懂他,不明白各個文檔直接的關係,此次從頭至尾搞一下,記錄下整個流程,備忘。ios
微信服務號開發:nginx
微信公衆號開發從0到配置相關功能json
//因爲微信在開發模式下原有的失效功能比較多須要從新配置,暫時發現失效的有:自動回覆,自定義菜單。不肯定失效是否須要配置的有:用戶留言,客服功能, //故開發公衆號必需要配置的功能有:自定義菜單,自動回覆,分享功能。 /* * * 1、封裝一個函數,獲取全局access_token(須要緩存) (1) 開發須要參數 appid:wxa2ea17e5be3addff; secret:35db2d277d8d16d387008bf66f0c868d grant_type:'client_credential' * (2) 參考文檔:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183 * 2、配置自定義菜單:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013,post請求配置,須要參數access_token * 3、配置自動回覆 首先獲取用戶關注推送過來的數據(xml格式),判斷事件類型,若是是首次發送,並檢測到時間是關注,則回覆相關信息 參考文檔 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543(官方文檔) https://blog.csdn.net/qq_34827048/article/details/70243268(實例代碼) 4、配置分享功能 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115(參考文檔) wx.config({ debug: true, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。 appId: '', // 必填,公衆號的惟一標識 timestamp: , // 必填,生成簽名的時間戳 nonceStr: '', // 必填,生成簽名的隨機串 signature: '',// 必填,簽名 jsApiList: [] // 必填,須要使用的JS接口列表 }); 根據前端配置須要後端返回參數 timestamp nonceStr signature - timestamp 生成隨機時間戳 - nonceStr 生成隨機字符串 - signature //獲取簽名, (1)第一步須要獲取請求接口獲取jsapi_ticket 參考文檔:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 (2)簽名生成規則以下:參與簽名的字段包括noncestr(隨機字符串), 有效的jsapi_ticket, timestamp(時間戳), url(當前網頁的URL,不包含#及其後面部分) 。對全部待簽名參數按照字段名的ASCII 碼從小到大排序(字典序)後,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1。這裏須要注意的是全部參數名均爲小寫字符。對string1做sha1加密,字段名和字段值都採用原始值,不進行URL 轉義。 (3)獲取簽名成功 * 5、前端配置公衆號。
前置基礎:後端
微信公衆號:訂閱號,服務號有一個就能夠了,這裏我使用的是服務號
服務器或空間:api
測試帳號:
設置-> 開發者工具 -> 點擊公衆平臺測試帳號,到下面的頁面
緩存
這裏的appId 和appsecret會直接給你安全
接口配置信息的url,和token 是下面實戰的方法獲取,
填寫js接口安全域名,就是你的頁面調用微信api所在的服務器一級域名,
測試號二維碼:微信掃描二維碼,能夠查看調試的頁面
這個表就是咱們能夠開發的功能的接口文檔,須要開發什麼功能直接去看文檔調試就能夠了
》》》》》
實戰帳號:
第一部分:
設置-> 公衆號設置 -> js接口安全域名
想要調用js-sdk,須要設置js安全域名
一、點擊設置:
二、點擊下載文件 MP_verify_KCefT6WvD8zHKxNd.txt(點擊下載),將文件放在網站根目錄下(若是有nginx配置,須要放在一級域名進入後訪問的目錄下)
三、輸入域名,點擊保存,正常狀況下,設置完成。
第二部分:
開發-> 基本配置 (進入當前頁面)
appid(開發者id)
appSecret(開發者密碼)
第三個須要設置下ip白名單,是你訪問頁面所在的服務器的ip,不須要輸入端口號;
點擊修改配置,彈出以下頁面
這裏的url是配置服務器代碼文件所在的目錄,
咱們新建一個token.php文件
<?php /** * wechat php test */ //define your token define("TOKEN", "weixin");//定義token $wechatObj = new wechatCallbackapiTest(); $wechatObj->valid(); class wechatCallbackapiTest{ public function valid() { $echoStr = $_GET["echostr"]; //valid signature , option if($this->checkSignature()){ echo $echoStr; exit; } } public function responseMsg() { //get post data, May be due to the different environments $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //extract post data if (!empty($postStr)){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $keyword = trim($postObj->Content); $time = time(); $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; if(!empty( $keyword )){ $msgType = "text"; $contentStr = "Welcome to wechat world!"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; }else{ echo "Input something..."; } }else { echo ""; 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; } } } ?> //這段代碼是爲了驗證服務器token和微信的token是否一致,因此,這裏咱們須要 define("TOKEN", "weixin"); 定義的token,要和圖中的token保持一致,能夠自定義命名。
url:是這個文件所在的目錄,確保能夠訪問,放在根目錄下面。 這個url是爲了驗證你接下來處理的消息 是否來自服務器。在服務器首次提交驗證申請的時候,微信服務器將發送get請求道填寫的url上,並帶上四個參數(signature,timestamp,nonce,echostr),開發者經過對簽名(即signature)的效驗,來判斷此條消息的真實性。 此後,每次開發者接收用戶消息的時候,微信也都會帶上前面三個參數(signature、timestamp、nonce)訪問開發者設置的URL,開發者依然經過對簽名的效驗判斷此條消息的真實性。效驗方式與首次提交驗證申請一致。 開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。若確認這次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗。 加密/校驗流程以下:1. 將token、timestamp、nonce三個參數進行字典序排序2. 將三個參數字符串拼接成一個字符串進行sha1加密3. 開發者得到加密後的字符串可與signature對比,標識該請求來源於微信 token: 自定義,和token.php中定義的保持一致 EncodingAESKey 隨機生成,暫時使用不到 加密方式,咱們選擇兼容模式
先部署服務器代碼,而後這裏填寫參數,點擊提交,若是驗證經過,就證實配置成功,而後點擊啓用。
第三部分:
接下來,咱們先作自定義菜單的建立,首先看文檔
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013
一、首先咱們須要獲取asscss_token,這個字段
<?php $appid = "你的appId"; $appsecret = "你的app開發者密碼"; define("APPID",$appid); define("APPSECRET",$appsecret); $token_access_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . APPID . "&secret=" . APPSECRET; $res = file_get_contents($token_access_url); //獲取文件內容或獲取網絡請求的內容//echo $res; $result = json_decode($res, true); //接受一個 JSON 格式的字符串而且把它轉換爲 PHP 變量 $access_token = $result['access_token']; echo $access_token;// echo '<br>';// print_r($result);//輸出access_token字段 ?>
//因爲微信在開發模式下原有的失效功能比較多須要從新配置,暫時發現失效的有:自動回覆,自定義菜單。不肯定失效是否須要配置的有:用戶留言,客服功能,
//故開發公衆號必需要配置的功能有:自定義菜單,自動回覆,分享功能。
/*
(2) 參考文檔:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
3、配置自動回覆 首先獲取用戶關注推送過來的數據(xml格式),判斷事件類型,若是是首次發送,並檢測到時間是關注,則回覆相關信息
參考文檔 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543(官方文檔) https://blog.csdn.net/qq_34827048/article/details/70243268(實例代碼)
4、配置分享功能 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115(參考文檔)
wx.config({ debug: true, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。 appId: '', // 必填,公衆號的惟一標識 timestamp: , // 必填,生成簽名的時間戳 nonceStr: '', // 必填,生成簽名的隨機串 signature: '',// 必填,簽名 jsApiList: [] // 必填,須要使用的JS接口列表 }); 根據前端配置須要後端返回參數 timestamp nonceStr signature - timestamp 生成隨機時間戳 - nonceStr 生成隨機字符串 - signature //獲取簽名, (1)第一步須要獲取請求接口獲取jsapi_ticket 參考文檔:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 (2)簽名生成規則以下:參與簽名的字段包括noncestr(隨機字符串), 有效的jsapi_ticket, timestamp(時間戳), url(當前網頁的URL,不包含#及其後面部分) 。對全部待簽名參數按照字段名的ASCII 碼從小到大排序(字典序)後,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1。這裏須要注意的是全部參數名均爲小寫字符。對string1做sha1加密,字段名和字段值都採用原始值,不進行URL 轉義。 (3)獲取簽名成功
一、多是服務器時間和本地時間不一致
二、多是更換帳號致使後臺數據token,ticket緩存,不一樣步
三、多是分享的域名後綴太多配置不正確
四、若是時網頁登陸受權,ios分享異常 ,多是跳轉到的時候用了from字段
五、多是後臺生成簽名規則不正確
六、js安全域名配置