OAuth2.0網頁受權php
官方網站:http://oauth.net/ http://oauth.net/2/html
權威定義:OAuth is An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications. python
OAuth是一個開放協議,容許用戶讓第三方應用以安全且標準的方式獲取該用戶在某一網站、移動或桌面應用上存儲的私密的資源(如用戶我的信息、照片、視頻、聯繫人列表),而無需將用戶名和密碼提供給第三方應用。git
OAuth 2.0是OAuth協議的下一版本,但不向後兼容OAuth 1.0。 OAuth 2.0關注客戶端開發者的簡易性,同時爲Web應用,桌面應用和手機,和起居室設備提供專門的認證流程。web
OAuth容許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每個令牌受權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth容許用戶受權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不須要分享他們的訪問許可或他們數據的全部內容。json
新浪微博API目前也使用OAuth 2.0。api
微信官方文檔 https://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html 不是很完善安全
網頁受權域名填寫 填寫域名便可 將MP_verify_CvTI87TanTCtnz9M.txt文件放在根目錄便可服務器
python實現:微信
1.獲取用戶點擊的url 受權獲取code
1 def get_url(): 2 url = 'https://open.weixin.qq.com/connect/oauth2/authorize' 3 data = collections.OrderedDict() 4 data['appid'] = 'xxxxxxxxx' ### 5 data['redirect_uri'] = 'https://xxxxxxxxxxx' 6 data['response_type'] = 'code' 7 data['scope'] = 'snsapi_userinfo' 8 data['state'] = '123' 9 wei_url = url + '?' +urllib.urlencode(data) + '#wechat_redirect' 10 return wei_url
用戶點擊url後 redirect_uri 收到返回的code
2.經過code獲取用戶openid access_token
1 def get_openid(code): 2 url = 'https://api.weixin.qq.com/sns/oauth2/access_token' 3 data = collections.OrderedDict() ####按插入順序排序的字典 4 data['appid'] = 'xxxxxxx' 5 data['secret'] = 'xxxxxxxxxxxxx' 6 data['code'] = code 7 data['grant_type'] = 'authorization_code' 8 data = urllib.urlencode(data) 9 ss = requests.session() 10 req = ss.post(url, data=data, verify = False) 11 cont = json.loads(req.content) 12 print cont 13 errcode = cont.get('errcode',None) 14 if errcode is not None: 15 return cont.get('errcode') 16 access_token= cont['access_token'] 17 openid= cont['openid'] 18 expires_in = cont['expires_in'] 19 refresh_token = cont['refresh_token'] 20 scope = cont['scope']
在開發中心>接口權限>對話服務中開啓獲取用戶地理位置(我開啓的是用戶對話是上報位置)
在基本配置中啓用服務器配置(這個配置開啓後自定義菜單將不能使用,須要再開發)
配置url 用於接收微信事件推送,token與該文件中一致
EncodingAESKey 隨機生成便可
php文件接收,將位置信息post python接口,寫庫
1 <?php 2 define("TOKEN", "weixin"); 3 class wechatCallbackapiTest{ 4 public function valid() 5 { 6 $echoStr = $_GET["echostr"]; 7 if($this->checkSignature()){ 8 echo $echoStr; 9 //exit; 10 } 11 } 12 public function post_curl_json($url,$post_data){ // 非用戶中心 post傳參 curl調用 13 $ch = curl_init(); //curl_init 初始化一個curl會話 14 curl_setopt($ch, CURLOPT_URL,$url); //curl_setopt 爲一個curl設置會話參數 15 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 16 curl_setopt($ch, CURLOPT_POST, 1);//設置請求方式POST 17 18 curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);//請求所帶變量數據 19 $result = curl_exec($ch); //curl_exec 執行一個curl會話 20 if(curl_errno($ch)){ //curl_error 返回一個包含當前會話錯誤信息的字符串 21 print_r(curl_error($ch)); 22 } 23 //print_r($result); 24 curl_close($ch); //curl_close 關閉一個curl會話 25 return json_decode($result,TRUE); 26 } 27 public function responseMsg() 28 { 29 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 30 if (!empty($postStr)){ 31 /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection, 32 the best way is to check the validity of xml by yourself */ 33 // 使用simplexml技術對xml進行解析 34 // libxml_disable_entity_loader(true), 是從安全性考慮,爲了防止xml外部注入, 35 //只對xml內部實體內容進行解析 36 libxml_disable_entity_loader(true); 37 //加載 postStr 字符串 38 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 39 $fromUsername = $postObj->FromUserName; 40 $toUsername = $postObj->ToUserName; 41 $keyword = trim($postObj->Content); 42 $time = time(); 43 global $tmp_arr; 44 if($postObj->MsgType == 'event'){ 45 if($postObj->Event == 'LOCATION'){ 46 $re['Latitude'] = $postObj->Latitude;//緯度 47 $re['Longitude'] = $postObj->Longitude;//經度 48 $re['FromUserName'] = $postObj->FromUserName;//經度 49 $re['CreateTime'] = $postObj->CreateTime;//消息建立時間 (整型) 50 $re['ToUserName'] = $postObj->ToUserName;//開發者微信號 51 $re['Precision'] = $postObj->Precision;//地理位置精度 52 return $re; 53 } 54 } 55 56 }else { 57 echo ""; 58 //exit; 59 } 60 } 61 62 private function checkSignature() 63 { 64 // you must define TOKEN by yourself 65 if (!defined("TOKEN")) { 66 throw new Exception('TOKEN is not defined!'); 67 } 68 69 $signature = $_GET["signature"]; 70 $timestamp = $_GET["timestamp"]; 71 $nonce = $_GET["nonce"]; 72 73 $token = TOKEN; 74 $tmpArr = array($token, $timestamp, $nonce); 75 // use SORT_STRING rule 76 sort($tmpArr, SORT_STRING); 77 $tmpStr = implode( $tmpArr ); 78 $tmpStr = sha1( $tmpStr ); 79 80 if( $tmpStr == $signature ){ 81 return true; 82 }else{ 83 return false; 84 } 85 } 86 } 87 88 //若是這段代碼放在上面,那程序將會報錯,由於繼承的問題,會顯示類沒有找到 89 $wechatObj = new wechatCallbackapiTest(); 90 //當接入成功後,請註銷這句話,不然,會反覆驗證。 91 //$wechatObj->valid(); 92 //添加響應請求的語句 93 $dates = $wechatObj->responseMsg(); 94 $url = "http://xxxxxxxxxxxxxxxxxxxxxxxxx"; // python 接口地址 95 $wechatObj->post_curl_json($url,$dates); 96 ?>