本文經過 OscPress 同步至oschina,最新版本請查看原文: https://www.cellmean.com/?p=1005
今天測試OscPress時發現了一些問題,aceess token失效了,token的受權沒有到失效時間,多是osc那邊重置了。從文檔知道用失效的token請求api時,會返回40x的錯誤,按照restful api, 我想固然地覺得是把錯誤號會放在響應碼的。可是osc open api並非這樣的,它是放在body裏的,由於一些瀏覽器會針對響應碼作本身的處理,因此osc 不把錯誤號放響應頭能夠理解。 測試了一下,若是token出錯了,WP_Http 請求返回的內容是這樣的,並不會返回WP_Error.json
array(5) { ["headers"]=> array(7) { ["server"]=> string(7) "Tengine" ["connection"]=> string(5) "close" ["date"]=> string(29) "Tue, 12 Jul 2016 06:39:25 GMT" ["cache-control"]=> string(8) "no-store" ["content-type"]=> string(30) "application/json;charset=utf-8" ["www-authenticate"]=> string(108) "Bearer error="invalid_token", error_description="Invalid access token: 1eb50a5d-f5ef-4c12-aaec-9c8908dc9a34"" ["pragma"]=> string(8) "no-cache" } ["body"]=> string(106) "{"error":"invalid_token","error_description":"Invalid access token: 1eb50a5d-f5ef-4c12-aaec-9c8908dc9a34"}" ["response"]=> array(2) { ["code"]=> int(401) ["message"]=> string(22) "Authorization Required" } ["cookies"]=> array(0) { } ["filename"]=> NULL }
咱們能夠修改一下 錯誤處理:osc open api的錯誤信息是放在response跟body裏的,我但願把osc返回的錯誤放入WP_Error這個Wordpress能用錯誤處理類裏,這樣更加方便一些。api
// 增長對osc api 返回的錯誤處理 protected function _check_api_error( $response ) { if( !is_wp_error($response) && $response['response']['code'] != 200 ) { $error_obj = json_decode($response['body']); return new WP_Error($error_obj->error,$error_obj->error_description); } return $response; }
用這個方法對調用osc api方法的返回內容再進行一次過濾,如獲取用戶我的信息的方法。瀏覽器
// 得到用戶信息 protected function _get_openapi_user() { $url = $this->api_site . '/action/openapi/user'; $args = array( 'access_token' => $this->_get_access_token(), 'dataType' => 'json' ); $response = wp_remote_post($url, array('body' => $args,'sslverify'=>false)); return $this->_check_api_error($response); }
增長一個顯示錯誤信息的方法:restful
// 顯示錯誤信息 protected function _show_error_info( $error ) { echo $error->get_error_message(); if($error->get_error_code() == 'invalid_token'){ printf(" <em><a href='%s'>點擊從新受權</a></em>",$this->_generate_authorize_url()); } }
在設置頁跟文章編輯頁的meta box 中分別調用這個方法顯示錯誤。cookie
// 顯示在metabox的內容 public function meta_box_callback(){ $response = $this->_get_openapi_user(); if(is_wp_error($response)){ $this->_show_error_info($response); return; } ....
public function settings_section_text(){ echo "<hr/>"; $authorize_url = $this->_generate_authorize_url(); if(false === $authorize_url){ // 未填寫應用id和私鑰 echo "<em>填寫應用的id及私鑰</em>"; }elseif( $access_token = $this->_get_access_token() ) { // 已獲取access token,顯示我的信息 $response = $this->_get_openapi_user(); if(is_wp_error($response)) { $this->_show_error_info($response); return; } ....
發佈文章時同步的錯誤也記錄下來:app
// 發佈文章時同步到osc public function publish_post($ID,$post) { if( isset($_POST['oscpress_syn_enable']) && $_POST['oscpress_syn_enable'] == 0){ return ; // 不一樣步到osc博客 } $post_arr = array(); $tags = ""; $post_arr['title'] = $post->post_title; $post_arr['content'] = $post->post_content; $post_arr['abstracts'] = get_the_excerpt($ID); $tags_arr = wp_get_post_tags($ID); if(!empty($tags_arr)){ foreach($tags_arr as $tag) { $tags .= $tag->name .','; } $tags = rtrim($tags,','); } $post_arr['tags'] = $tags; $post_arr = array_merge($post_arr,$_POST['oscpress_syn']); unset($post_arr['tweet_enable']); $response = $this->_blog_pub($post_arr); $oscpress_syn = $_POST['oscpress_syn']; $oscpress_syn['error_msg'] = "ok"; $oscpress_syn['timestamp'] = current_time('timestamp'); if(!is_wp_error($response) ){ if( $_POST['oscpress_syn']['tweet_enable']) { $post_link = apply_filters('oscpress_sync_link',wp_get_shortlink($ID),$ID); // 發佈到osc動彈的文章連接 $tweet_template ="我發佈了一篇文章:<<%%post_title%%>>,傳送門:%%post_link%%, 自豪地使用 #OscPress# 同步 "; $tweet_content = str_replace( array('%%post_title%%','%%post_link%%'), array($post_arr['title'],$post_link), $tweet_template ); $response2 = $this->_send_tweet($tweet_content); } }else{ $oscpress_syn['error_msg'] = $response->get_error_code(); } update_post_meta($ID,'_oscpress_syn',$oscpress_syn); }
metabox顯示上次同步的信息:post
public function add_meta_boxes(){ //加入一個metabox $sync_data = $this->_get_syn_data(); $sync_info = ""; if($sync_data){ $sync_info = sprintf("<span style='font-weight: normal;font-size: 0.8em'> 上次同步於: %s , 狀態: %s </span>" , date_i18n('Y-m-d H:i:s',$sync_data['timestamp']),$sync_data['error_msg']); } add_meta_box( "oscpress_meta_box", '<strong>OscPress文章同步</strong>'.$sync_info, array($this,'meta_box_callback')) ; }
好了。看一下效果: 設置頁面:測試
meta box:ui