web-dev-qa-db-ja.com

Facebook OAuth、WP_Http :: request()vs wp_remote_request()

WordPress 3.3.2およびPHPバージョン5.2.17の実行

私はwp_remote_request()とFacebook OAuth APIを使用してFacebookからaccess_tokenを取得しようとしています(ところで、このエントリーの最後にある実用的な例)。

これがうまくいかない理由はありますか(docとソースコードに従って)。

$response = wp_remote_request('https://graph.facebook.com/oauth/access_token', array(           
        'timeout' => 60,
        'sslverify' => false,
        'method' => 'GET',
        'body' =>  array( 
                'client_id' => FACEBOOK_APPID, 
                'client_secret' => FACEBOOK_APPSECRET,
                'redirect_uri' => REDIRECTURI,
                'code' => $_GET['code']
        )
));

これが起こると?

$http = new WP_Http;

$api_url = sprintf("https://graph.facebook.com/oauth/access_token?client_id=%s&redirect_uri=%s&client_secret=%s&code=%s",
    urlencode(FACEBOOK_APPID),
    urlencode(REDIRECTURI),
    urlencode(FACEBOOK_APPSECRET),
    urlencode($_GET['code'])
);
$response = $http->request($api_url, array('timeout' => 60, 'sslverify' => false));

作業例:

<?php
/* Short and sweet */
define('WP_USE_THEMES', false);
require('../wp-blog-header.php');
?>
<?php
define('FACEBOOK_APPID','123'); // replace 123 with your app id
define('FACEBOOK_APPSECRET','abc'); // replace abc with your app secret

define('REDIRECTURI','http://your.redirect.url');

if ($_GET['code'] != '') {
    if ($_GET['state'] != '' && wp_verify_nonce($_GET['state'], 'my-nonce')) { 

        $http = new WP_Http;

        $api_url = sprintf("https://graph.facebook.com/oauth/access_token?client_id=%s&redirect_uri=%s&client_secret=%s&code=%s",
            urlencode(FACEBOOK_APPID),
            urlencode(REDIRECTURI),
            urlencode(FACEBOOK_APPSECRET),
            urlencode($_GET['code'])
        );
        $response = $http->request($api_url, array('timeout' => 60, 'sslverify' => false));

        if( is_wp_error( $response ) ) {
           echo 'ERROR';
        } else {
            $args = wp_parse_args( wp_remote_retrieve_body($response), array() );
            echo $args['access_token']; 
        }
    }   
} else {
     $facebook_dialog_url = sprintf("https://www.facebook.com/dialog/oauth?client_id=%s&redirect_uri=%s&state=%s", 
        FACEBOOK_APPID, 
        urlencode(REDIRECTURI),
        wp_create_nonce ('my-nonce')
     ); 


    echo '<a href="'. $facebook_dialog_url .'">LOGIN TO FACEBOOK</a> <br />';
}
?>
3
soderlind

私自身の質問に答えるために、あなたがWP_Httpを使用するとき、使用されるトランスポートはこの順番で、この配列から選択されます: $request_order = array( 'curl', 'streams', 'fsockopen' );

PHPがカールをサポートしている場合は、WP_Http_Curlが使用されます。メソッドがGETの場合、Curlは本体配列パラメーター の追加をサポートしていません

一方、WP_Http_StreamsとWP_Http_Fsockopenでは、ボディ配列パラメータを追加します。

4
soderlind

body引数はPOST要求に使用され、ヘッダーに設定されます。 GETリクエストの場合、リクエスト引数をURLにエンコードします(2番目のスニペットのように)。

3
Rarst