1、 準備工做javascript
a) 帳號html
注意:一、我的只能申請到我的類型的訂閱號。java
二、微信公衆號認證須要300大洋。api
http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index數組
2、 微信公衆帳號介紹安全
服務號、訂閱號、企業號的介紹(區別) 服務器
一、訂閱號:主要偏於爲用戶傳達資訊(相似報紙雜誌),認證先後都是天天只能夠羣發一條消息;微信
二、服務號:主要偏於服務交互(相似銀行,114,提供服務查詢),認證先後都是每月可羣發4條消息;微信公衆平臺
三、企業號:主要用於公司內部通信使用,須要先有成員的通信信息驗證才能夠關注成功企業號;curl
舒適提示:
一、若是想簡單的發送消息,達到宣傳效果,建議可選擇訂閱號;
二、若是想進行商品銷售,進行商品售賣,建議可申請服務號;
三、若是想用來管理內部企業員工、團隊,對內使用,可申請企業號。
3、 微信數據收發原理以及消息數據格式
三、1 開發者模式成爲開發者時的消息校驗原理
開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,而且帶上四個參數(signature、timestamp、nonce、echostr),開發者經過對簽名(signature)的檢驗,來判斷此條信息的真實性。
驗證成功以後,開發者接受用戶消息的時候,微信也都會帶上前面三個參數(signature、timestamp、nonce)訪問開發者設置的URL,開發者依然經過簽名的校驗判斷消息的真實性。
加密/校驗流程以下:
1. 將token、timestamp、nonce三個參數進行字典序排序
2. 將三個參數字符串拼接成一個字符串進行sha1加密
3. 開發者得到加密後的字符串可與signature對比,標識該請求來源於微信
三、2 成爲開發者後消息收發的原理
微信消息收發原理圖:
其實,咱們須要作的事情,就是對HTTP請求,作出響應。也就是拿到微信服務器給咱們的數據,而後處理後再返回去。
上圖的消息收發過程是這樣的:用戶用手機發送一個?給微信公衆號,微信服務器接受到? 而後組裝一個消息發送給咱們本身的服務器,咱們的服務器回覆一個時間,而且將時間也按照必定的規則組裝,回覆給公衆號,公衆號所在的服務器再回復給用戶。
4、 接入指南
接入微信公衆號平臺開發,須要按照以下步驟:
一、 填寫服務器配置
二、 驗證服務器地址的有效性
三、 依據接口文檔實現業務邏輯
第一步:填寫服務器配置
進入微信公衆平臺https://mp.weixin.qq.com
在左側列表中最下方,找到基本配置,點擊進入
點擊啓用,若是編輯模式開啓了。那就先把編輯模式關閉。
點擊「修改配置」按鈕,按照要求填寫。
參數說明:
其中URL是開發者用來接收微信消息和事件的接口URL。
Token是開發者任意填寫的,可是填寫的要與代碼中的一致。Token是用做簽名(填寫的Token會和接口URL中包含的Token進行對比,從而驗證安全性),Token是爲了用來驗證發送咱們的信息是否來自微信服務器。
第二步:驗證服務器地址的有效性
開發者提供信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶四個參數:
開發者經過檢驗signature對請求進行校驗。若確認這次GET請求來自微信服務器,須要原樣返回echostr參數的內容。這樣就接入成功了,不然接入失敗。
接入的代碼以下:
//得到參數 signature nonce token timestamp echostr
$nonce = $_GET['nonce']; $token = 'imooc'; $timestamp = $_GET['timestamp']; $echostr = $_GET['echostr']; $signature = $_GET['signature'];
//第一步:造成數組,而後按字典序排序
$array = array(); $tmpArr= array($nonce, $timestamp, $token); sort($tmpArr,SORT_STRING);
//第二步:拼接成字符串,sha1加密 ,而後與signature進行校驗
$str = sha1( implode( $tmpArr ) );
//第三步:得到加密後的字符串與signature對比
if( $str == $signature && $echostr ){ //第一次接入weixin api接口的時候 echo $echostr; exit; }
第三部:依據接口文檔實現業務邏輯
驗證URL有效性後即接入生效,成爲開發者。
經歷過第一次驗證後,此後用戶每次向公衆號發送消息、或者產生自定義菜單點擊事件時,開發者填寫的服務器配置URL將獲得微信服務器推送過來的消息和事件,而後開發者能夠依據自身業務邏輯進行相應,例如回覆消息等。
其餘須要知道的:
一、 用戶向公衆號發送消息時,公衆號收到的消息發送者是一個OpenID,每一個用戶對每一個公衆號有一個惟一的OpenID。
二、 微信公衆號接口只支持80端口
5、 接受普通消息
當普通微信用戶向微信公衆帳號發消息時,微信服務器將POST消息的XML數據發送到咱們本身的服務器上,也就是咱們在微信公衆平臺填寫的URL
普通消息有:文本消息、圖片消息、語言消息、視頻消息、地理位置消息。
接受文本消息的XML格式
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></Content> <MsgId>1234567890123456</MsgId> </xml>
當微信服務器接受到用戶發送的消息,微信服務器再把這條消息經過XML格式組裝後,發送給咱們的服務器。那麼,若是咱們想要回覆文本消息。咱們也須要把消息經過XML格式組裝好發送給微信服務器,微信服務器再發送給用戶。
回覆文本消息的XML格式:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[你好]]></Content> </xml>
實例代碼:
注意,$toUser 是指將這個消息返回給誰。由於咱們是將消息回覆給用戶的,因此
$toUser = $this->postObj->FromUserName;//獲取到發送消息給微信公衆號的用戶openId
公衆號常常須要用到一些臨時性的多媒體素材的場景,例如在使用接口特別是發送消息時,對多媒體文件、多媒體消息的獲取和調用等操做,是經過media_id來進行的。素材管理接口對全部認證的訂閱號和服務號開發。經過本接口,公衆號能夠新增一些臨時素材(即上傳臨時多媒體文件)。
請注意:
一、對於臨時素材,每一個素材(media_id)會在開發者上傳或粉絲髮送到微信服務器3天后自動刪除(因此用戶發送給開發者的素材,若開發者須要,應儘快下載到本地),以節省服務器資源。 二、media_id是可複用的。 三、素材的格式大小等要求與公衆平臺官網一致。具體是,圖片大小不超過2M,支持bmp/png/jpeg/jpg/gif格式,語音大小不超過2M,長度不超過60秒(公衆平臺官網能夠在文章中插入小於30分鐘的語音,但這些語音不能用於羣發等場景,只能放在文章內,這方面接口暫不支持),支持mp3/wma/wav/amr格式 四、需使用https調用本接口。
調用接口地址
https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
其餘須要注意的問題:
一、 文件上傳時經過CURL POST方式提交的,POST內容須要是數組格式。
二、 上傳的文件必須先在你的服務器,而後獲取到上傳文件所在服務器的絕對路徑。而且須要在絕對路徑前面加上@以示區分。
三、 在Window服務上,路徑分隔符爲斜槓\,例子:@D:\soft\logo.jpg
而在Linux服務器上,路徑分隔符爲反斜槓/ 例子:@/tmp/logo.jpg
代碼示例:
公衆號可使用本接口從微信服務器下載臨時的多媒體素材。
接口調用URL
http請求方式: GET,https調用
https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
參數說明
參數 |
是否必須 |
說明 |
access_token |
是 |
調用接口憑證 |
media_id |
是 |
媒體文件ID |
返回說明
正確狀況下的返回HTTP頭以下:
HTTP/1.1 200 OK
Connection: close
Content-Type: image/jpeg
Content-disposition: attachment; filename="MEDIA_ID.jpg"
Date: Sun, 06 Jan 2013 10:20:18 GMT
Cache-Control: no-cache, must-revalidate
Content-Length: 339721
curl -G "https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"
當用戶主動發消息給公衆號的時候(包括髮送信息、點擊自定義菜單、訂閱事件、掃描二維碼事件),微信將會把消息數據推送給開發者,開發者在一段時間內能夠調用客服消息接口,經過POST一個JSON數據包來發送消息給普通用戶,在48小時內不限制發送次數。此接口主要用於客服等有人工消息處理環節的功能,方便開發者爲用戶提供更加優質的服務。
調用的接口URL
https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
具體參考文檔http://mp.weixin.qq.com/wiki/7/12a5a320ae96fecdf0e15cb06123de9f.html
至於爲何須要客服接口呢?
由於微信公衆平臺一直沒有推出手機客服端,除了程序的自動應答,運營者還須要一些人工回覆,而人工回覆目前通常都是經過電腦端操做,有了客服接口可使運營者使用手機回覆。
在關注者與公衆號產生消息交互後,公衆號可得到關注者的OpenID(加密後的微信號,每一個用戶對每一個公衆號的OpenID是惟一的。對於不一樣公衆號,同一用戶的openid不一樣)。公衆號可經過本接口來根據OpenID獲取用戶基本信息,包括暱稱、頭像、性別、所在城市、語言和關注時間。
轉自:http://www.cnblogs.com/sushaolian/p/5786698.html