微信公衆號php從0開發,包括功能(自定義菜單,分享)

以前寫的一篇微信公衆號文章。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字段
    ?>

//因爲微信在開發模式下原有的失效功能比較多須要從新配置,暫時發現失效的有:自動回覆,自定義菜單。不肯定失效是否須要配置的有:用戶留言,客服功能,
//故開發公衆號必需要配置的功能有:自定義菜單,自動回覆,分享功能。
/*

  • 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)獲取簽名成功

一、多是服務器時間和本地時間不一致
二、多是更換帳號致使後臺數據token,ticket緩存,不一樣步
三、多是分享的域名後綴太多配置不正確
四、若是時網頁登陸受權,ios分享異常 ,多是跳轉到的時候用了from字段
五、多是後臺生成簽名規則不正確
六、js安全域名配置

  • 5、前端配置公衆號。
相關文章
相關標籤/搜索