openid 與 unionid
每一個用戶針對每一個公衆號會產生一個安全的OpenID
若是須要在多公衆號、移動應用之間作用戶共通,則需前往微信開放平臺,
將這些公衆號和應用綁定到一個開放平臺帳號下,綁定後,
一個用戶雖然對多個公衆號和應用有多個不一樣的OpenID,
但他對全部這些同一開放平臺帳號下的公衆號和應用,只有一個UnionIDphp
**************************************************************************************************************************html
access_token
公衆平臺以access_token爲接口調用憑據,來調用接口,全部接口的調用須要先獲取access_token,
access_token在2小時內有效,過時須要從新獲取,但1天內獲取次數有限,開發者需自行存儲,
詳見獲取接口調用憑據(access_token)文檔。
access_token是公衆號的全局惟一接口調用憑據,公衆號調用各接口時都需使用access_token。
開發者須要進行妥善保存。access_token的存儲至少要保留512個字符空間。
access_token的有效期目前爲2個小時,需定時刷新,重複獲取將致使上次獲取的access_token失效。web
**************************************************************************************************************************小程序
獲取access token
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183api
公衆號和小程序都可以使用AppID和AppSecret調用本接口來獲取access_token。
AppID和AppSecret可在「微信公衆平臺-開發-基本配置」頁中得到(須要已經成爲開發者,且賬號沒有異常狀態)。安全
https請求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
grant_type 是 獲取access_token填寫client_credential
appid 是 第三方用戶惟一憑證
secret 是 第三方用戶惟一憑證密鑰,即appsecret
返回:
{"access_token":"ACCESS_TOKEN","expires_in":7200} //正確
{"errcode":40013,"errmsg":"invalid appid"} //錯誤服務器
-1 系統繁忙,此時請開發者稍候再試
0 請求成功
40001 AppSecret錯誤或者AppSecret不屬於這個公衆號,請開發者確認AppSecret的正確性
40002 請確保grant_type字段值爲client_credential
40164 調用接口的IP地址不在白名單中,請在接口IP白名單中進行設置。(小程序及小遊戲調用不要求IP地址在白名單內。)微信
**************************************************************************************************************************app
公衆號主要經過公衆號消息會話和公衆號內網頁來爲用戶提供服務的,下面分別介紹這兩種狀況:微信公衆平臺
一、公衆號消息會話
二、公衆號內網頁
1)網頁受權獲取用戶基本信息:經過該接口,能夠獲取用戶的基本信息(獲取用戶的OpenID是無需用戶贊成的,獲取用戶的基本信息則需用戶贊成)
2)微信JS-SDK:是開發者在網頁上經過JavaScript代碼使用微信原生功能的工具包,
開發者可使用它在網頁上錄製和播放微信語音、監聽微信分享、上傳手機本地圖片、拍照等許多能力。
**************************************************************************************************************************
不一樣的公衆號類型具有不一樣的接口權限:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433401084
公衆號每次調用接口時,可能得到正確或錯誤的返回碼,
開發者能夠根據返回碼信息調試接口,排查錯誤。
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433747234
**************************************************************************************************************************
入門指引
公衆號類型: 訂閱號,服務號,企業號
公衆平臺官網登陸以後,找到「基本配置」菜單欄
url填寫:http://外網IP:端口號/wx 。外網IP請到騰訊雲購買成功處查詢, http的端口號固定使用80,不可填寫其餘。
一、需微信接入生效才行
在公衆平臺官網的開發-基本設置頁面,勾選協議成爲開發者,點擊「修改配置」按鈕,填寫服務器地址(URL)、Token和EncodingAESKey,其中
URL是開發者用來接收微信消息和事件的接口URL。
Token可由開發者能夠任意填寫,用做生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)。
EncodingAESKey由開發者手動填寫或隨機生成,將用做消息體加解密密鑰。
開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶參數以下表所示:
signature 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
timestamp 時間戳
nonce 隨機數
echostr 隨機字符串 //請原樣返回echostr參數內容
開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。
若確認這次GET請求來自微信服務器,請原樣返回echostr參數內容,
則接入生效,成爲開發者成功,不然接入失敗。
二、
用戶每次向公衆號發送消息、或者產生自定義菜單、或產生微信支付訂單等狀況時,
開發者填寫的服務器配置URL將獲得微信服務器推送過來的消息和事件, //獲得微信的消息和事件
開發者能夠依據自身業務邏輯進行響應,如回覆消息。
用戶向公衆號發送消息時,公衆號方收到的消息發送者是一個OpenID,
是使用用戶微信號加密後的結果,每一個用戶對每一個公衆號有一個惟一的OpenID。
另請注意,微信公衆號接口必須以http://或https://開頭,分別支持80端口和443端口。
三、接收普通消息
當普通微信用戶向公衆帳號發消息時,微信服務器將POST消息的XML數據包到開發者填寫的URL上。
文本消息
-------------------------------------------------
<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>
參數 描述
ToUserName 開發者微信號
FromUserName 發送方賬號(一個OpenID)
CreateTime 消息建立時間 (整型)
MsgType text
Content 文本消息內容
MsgId 消息id,64位整型
圖片消息
-------------------------------------------------
<xml>
<ToUserName>< ![CDATA[toUser] ]></ToUserName>
<FromUserName>< ![CDATA[fromUser] ]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType>< ![CDATA[image] ]></MsgType>
<PicUrl>< ![CDATA[this is a url] ]></PicUrl>
<MediaId>< ![CDATA[media_id] ]></MediaId>
<MsgId>1234567890123456</MsgId>
</xml>
ToUserName 開發者微信號
FromUserName 發送方賬號(一個OpenID)
CreateTime 消息建立時間 (整型)
MsgType image
PicUrl 圖片連接(由系統生成)
MediaId 圖片消息媒體id,能夠調用多媒體文件下載接口拉取數據。
MsgId 消息id,64位整型
**************************************************************************************************************************
微信網頁受權 (獲取用戶openid)
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
若是用戶在微信客戶端中訪問第三方網頁,公衆號能夠經過微信網頁受權機制,
來獲取用戶基本信息,進而實現業務邏輯。
一、在微信公衆號請求用戶網頁受權以前, //
開發者須要先到公衆平臺官網中的「開發 - 接口權限 - 網頁服務 - 網頁賬號 - 網頁受權獲取用戶基本信息」的配置選項中,修改受權回調域名。
請注意,這裏填寫的是域名(是一個字符串),而不是URL,所以請勿加 http:// 等協議頭;
//這一步很是重要,只有配置了這個,纔可以經過微信受權進行回調。
二、受權回調域名配置規範爲全域名,好比須要網頁受權的域名爲:www.qq.com,
配置之後此域名下面的頁面http://www.qq.com/music.html 、 http://www.qq.com/login.html 均可以進行OAuth2.0鑑權。
但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com沒法進行OAuth2.0鑑權
-------------------------------------------------------
關於網頁受權的兩種scope的區別說明
一、直接進了回調頁:
以snsapi_base爲scope發起的網頁受權,是用來獲取進入頁面的用戶的openid的,
而且是靜默受權並自動跳轉到回調頁的。用戶感知的就是直接進入了回調頁(每每是業務頁面)
二、需用戶手動贊成後才進入的
以snsapi_userinfo爲scope發起的網頁受權,是用來獲取用戶的基本信息的。但這種受權須要用戶手動贊成,而且因爲用戶贊成過,
因此無須關注,就可在受權後獲取該用戶的基本信息。(關注了公衆號後,才能調用成功的)
三、用戶管理類接口中的「獲取用戶基本信息接口」,是在用戶和公衆號產生消息交互或關注後事件推送後,(因此要隨便發些東西)
才能根據用戶OpenID來獲取用戶基本信息。這個接口,包括其餘微信接口,都是須要該用戶(即openid)關注了公衆號後,才能調用成功的。
--------------------------------------------------------
關於網頁受權access_token和普通access_token的區別
一、微信網頁受權是經過OAuth2.0機制實現的,在用戶受權給公衆號後,
公衆號能夠獲取到一個網頁受權特有的接口調用憑證(網頁受權access_token), //公衆號能夠獲取用戶基本信息
經過網頁受權access_token能夠進行受權後接口調用,如獲取用戶基本信息;
二、其餘微信接口,須要經過基礎支持中的「獲取access_token」接口來獲取到的普通access_token調用。
---------------------------------------------------------
關於特殊場景下的靜默受權
一、上面已經提到,對於以snsapi_base爲scope的網頁受權,就靜默受權的,用戶無感知;
二、對於已關注公衆號的用戶,若是用戶從公衆號的會話或者自定義菜單進入本公衆號的網頁受權頁,
即便是scope爲 snsapi_userinfo ,也是靜默受權,用戶無感知。 //從公衆號進入的即便是snsapi_userinfo,默認是不需經用戶贊成獲取openid
1 第一步:用戶贊成受權,獲取code
在確保微信公衆帳號擁有受權做用域(scope參數)的權限的前提下
(服務號得到高級接口後,默認擁有scope參數中的snsapi_base和snsapi_userinfo),
引導關注者打開以下頁面:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
若提示「該連接沒法訪問」,請檢查參數是否填寫錯誤,是否擁有scope參數對應的受權做用域權限。
尤爲注意:因爲受權操做安全等級較高,因此在發起受權請求時,微信會對受權連接作正則強匹配校驗,
若是連接的參數順序不對,受權頁面將沒法正常訪問
必須?
appid 是 公衆號的惟一標識
redirect_uri 是 受權後重定向的回調連接地址, 請使用 urlEncode 對連接進行處理
response_type 是 返回類型,請填寫code
scope 是 應用受權做用域,
snsapi_base (不彈出受權頁面,直接跳轉,只能獲取用戶openid),
snsapi_userinfo (彈出受權頁面,可經過openid拿到暱稱、性別、所在地。而且,即便在未關注的狀況下,只要用戶受權,也能獲取其信息 )
state 否 重定向後會帶上state參數,開發者能夠填寫a-zA-Z0-9的參數值,最多128字節
#wechat_redirect 是 不管直接打開仍是作頁面302重定向時候,必須帶此參數
用戶贊成受權後
若是用戶贊成受權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。
code說明 : code做爲換取access_token的票據,每次用戶受權帶上的code將不同,code只能使用一次,5分鐘未被使用自動過時。
10003 redirect_uri域名與後臺配置不一致
10004 此公衆號被封禁
10005 此公衆號並無這些scope的權限
10006 必須關注此測試號
10009 操做太頻繁了,請稍後重試
10010 scope不能爲空
10011 redirect_uri不能爲空
10012 appid不能爲空
10013 state不能爲空
10015 公衆號未受權第三方平臺,請檢查受權狀態
10016 不支持微信開放平臺的Appid,請使用公衆號Appid
第二步:經過code換取網頁受權access_token
首先請注意,這裏經過code換取的是一個特殊的網頁受權access_token,與基礎支持中的access_token(該access_token用於調用其餘接口)不一樣。
公衆號可經過下述接口來獲取網頁受權access_token。若是網頁受權的做用域爲snsapi_base,
則本步驟中獲取到網頁受權access_token的同時,也獲取到了openid,
snsapi_base式的網頁受權流程即到此爲止。
scope爲snsapi_base
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect
scope爲snsapi_userinfo
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
**************************************************************************************************************************