• ベストアンサー
  • 困ってます

ファンゲートの作り方を教えてください

Facebookページに付けるファンゲートの簡単な作り方を教えてくださいませんか。 これを入れればいいらしいですが、なかなかうまく行きません。 <?php 02 function parse_signed_request($signed_request, $secret) { 03 list($encoded_sig, $payload) = explode('.', $signed_request, 2); 04 // decode the data 05 $sig = base64_url_decode($encoded_sig); 06 $data = json_decode(base64_url_decode($payload), true); 07 if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') { 08 error_log('Unknown algorithm. Expected HMAC-SHA256'); 09 return null; 10 } 11 // check sig 12 $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true); 13 if ($sig !== $expected_sig) { 14 error_log('Bad Signed JSON signature!'); 15 return null; 16 } 17 return $data; 18 } 19 function base64_url_decode($input) { 20 return base64_decode(strtr($input, '-_', '+/')); 21 } 22 ?>

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数1218
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

簡単な方法と難しい方法があります。 簡単な方法は専用のFacebookアプリを使うことです。 https://www.facebook.com/pages/Sexy-pages-%E7%84%A1%E6%96%99FB%E3%83%A9%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%95%E3%82%A1%E3%83%B3%E3%82%B2%E3%83%BC%E3%83%88/305510986125719?sk=app_162322083864426 難しい方法は自分でコーディングをすることです。 一番簡単なコードはこれです。 <?php $file1 = file_get_contents('https://自分のサーバーにあるページ.php'); $file2 = file_get_contents('https://自分のサーバーにあるページ.php'); function parsePageSignedRequest() { if (isset($_REQUEST['signed_request'])) { $encoded_sig = null; $payload = null; list($encoded_sig, $payload) = explode('.', $_REQUEST['signed_request'], 2); $sig = base64_decode(strtr($encoded_sig, '-_', '+/')); $data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true)); return $data; } return false; } if($signed_request = parsePageSignedRequest()) { if($signed_request->page->liked) { echo $file1; } else { echo $file2; } } ?> Facebook開発者として登録して、アプリを作って、そのアプリを自分のページに追加します。上記のコードをアプリが読み取るPHPファイルにして、サーバーにアップします。そのファイルとは別に、表示内容を含んだファイルfile1.php file2.phpを作ってサーバーにアップします。そうすると、ファンゲートができます。 ただし、自分でコーディングする方法のネックは、たった3ページを作るために、第三者のサーバーとSSL証明書が必要です。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

できました!ありがとうございました! https://www.facebook.com/www.yaku.ru?sk=app_183571525055518

関連するQ&A

  • 現在フェイスブックのファンゲートを作成しています

    いいねボタンを押すと違うページに推移するものです。いいねを押すと、ページ上でもフェイスブック上でも反映されますが 何故か押されたか判別するシステムではいいねボタンを押した事が上手くうけとれていません。何がわるいのでしょうか?? function parse_signed_request($signed_request, $secret) { list($encoded_sig, $payload) = explode('.', $signed_request, 2); // decode the data $sig = base64_url_decode($encoded_sig); $data = json_decode(base64_url_decode($payload), true); if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') { error_log('Unknown algorithm. Expected HMAC-SHA256'); return null; } // check sig $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true); if ($sig !== $expected_sig) { error_log('Bad Signed JSON signature!'); return null; } return $data; } function base64_url_decode($input) { return base64_decode(strtr($input, '-_', '+/')); }

    • 締切済み
    • PHP
  • PHPのSHA256変換について

    C#で以下のロジックがあるのですが、 using System.Text; using System.Security.Cryptography; private static string getHash(string data, string salt, int stretchingcount, Encoding encode) {     int m = salt.Length / 2;     string tmp = salt.Substring(0, m) + data + salt.Substring(m);     byte[] buf = encode.GetBytes(tmp);     SHA256CryptoServiceProvider algorithm = new SHA256CryptoServiceProvider();     for (int i = 0; i < stretchingcount; ++i)     {         buf = algorithm.ComputeHash(buf);     }     return BitConverter.ToString(buf).Replace("-", string.Empty); } こちらのソースをPHPで同じ結果になるように実装したいのですが、 同じ結果にならず、困っています。 PHP側のソースは以下の通りです。 public static function funcPrivacyCheck($data,$salt,$stretchingcount){ $m = strlen($salt) / 2; $tmp = substr($salt,0,$m).$id.substr($salt,$m); $tmp = base64_encode(utf8_encode($tmp)); $hash = ''; for ($i = 0; $i < $stretchingcount; $i++) { if($hash <> ''){ $hash = hash_hmac('sha256' ,$hash, false); }else{ $hash = hash_hmac('sha256' ,$tmp, false); } } return $hash; } エンコードは、UTF-8を指定することが前提です。 ご教授頂きますようよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • CGIが動きません

    GETのbodyにbase64でエンコードされた文字列 typeにMIMEタイプ それをエンコードして出力するものです よろしくお願いします。 以下はソースコードです。 #!/usr/local/bin/perl @querystring = split (/&/,$ENV{'QUERY_STRING'}); foreach $tmp (@querystring) { ($vname,$value) = split (/=/,$tmp); $args{$vname} = &url_decode($value); } sub url_decode($) { my $url_decode_str = shift; $url_decode_str =~ tr/+/ /; $url_decode_str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; return $url_decode_str; } print "Content-type:".$args{'type'}."\n\n"; binmode (STDOUT); $out = MIME::Base64::decode_base64($args{'body'}); print $out;

    • ベストアンサー
    • Perl
  • objective-cで困っています。

    objective-cをトライ&エラーで試しながら学習しているのですが、 下記の内容で行き詰っており、知恵をお借りしたいと思い投稿しました。 現在tml5のcanvasを使ってお絵描きアプリを作りました。このcanvasに書き込んだデータをiPhoneのカメラロールに保存することをトライしています。いろいろ調べてみると「HTML5 CANVASの描画内容をUIImage経由でカメラロールに保存する」という記事をみつけました。http://lab.spec5zigen.com/archives/html5-canvasの描画内容をuiimage経由でカメラロールに保存する/ その記事を参考に #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // UIWebViewのインスタンス化 CGRect rect = self.view.frame; UIWebView *webView = [[UIWebView alloc]initWithFrame:rect]; // Webページの大きさを自動的に画面にフィットさせる webView.scalesPageToFit = YES; // デリゲートを指定 webView.delegate = self; // URLを指定 NSURL *url = [NSURL URLWithString:@"http://xxxxxxxxxxxxxxxxxxxxxx"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; // リクエストを投げる [webView loadRequest:request]; // UIWebViewのインスタンスをビューに追加 [self.view addSubview:webView]; } - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if(![[request.URL.scheme] isEqualToString:@"sp5canvas2app"]){ return YES; } NSString * requestString = [[request URL] absoluteString]; NSArray *params = [requestString componentsSeparatedByString:@"data:image/png;base64,"]; // dataFromBase64String // NSData+Base64 Copyright 2009 Matt Gallagher. All rights reserved. // http://www.cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html NSData * decodedData = [NSData dataFromBase64String:[params objectAtIndex:1]];//decode base64 to NSData UIImage *image = [UIImage imageWithData:decodedData]; UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);//カメラロールに保存 return NO; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end としてみたのですが、 if(![[request.URL.scheme] isEqualToString:@"sp5canvas2app"]){ の行にExpected identifierというエラーが、 NSData * decodedData = [NSData dataFromBase64String:[params objectAtIndex:1]];の行にNo known class method for selector 'dataFromBase64String:'というエラーが という状況で詰っている状況です。 メソッドの定義や宣言されていないメソッドを使っているなどのエラーということを調べて分かったのですが、objective-cを始めたばかりで初歩的なミスかも知れませんがエラーの対応の仕方がまだまだよくわかっていません。 スキーマなど参考にしたサイトの内容も十分に理解しているのではないのですが、「sp5canvas2app」の部分は自由に変えていいのでしょうか? 解決の仕方を教えていただけないでしょうか? 宜しくお願いします。

  • 下記のような関数から外部からの戻り値を返したいのですが

    下記のような関数から外部からの戻り値を返したいのですが 良い方法はございませんでしょうか? 例えば trace( test( "test" ) ); このように戻り値を返す関数にしたいです。 function test( strData:String ):String { var variables:URLVariables = new URLVariables(); variables.data = strData; var request:URLRequest = new URLRequest(); request.url = "http://test.asp"; request.data = variables; request.method = URLRequestMethod.POST; var loader = new URLLoader(); loader.addEventListener(Event.COMPLETE , function(event) { var retValue:String = new String(event.target.data); }); loader.load(request); //return ???? }

    • ベストアンサー
    • Flash
  • タイムアウト時ソケット通信を中断して次の処理を実行したい

    だいぶはしょってありますが、大雑把な流れは下のようなサブルーチンです。 タイムアウト時エラーメッセージに飛んでしまうと、その後の&kaiseki_beta;が実行されません。 タイムアウト時にソケット通信を中断して、その後の処理を実行させたいのですが、方法がわかりません。 $SIG{'ALRM'} = \&closeSocket(SOCK);とかやってみたのですが、500エラーになってしまい困っています。 何か良い方法があったら教えてください。 sub autobeta { $SIG{'ALRM'} = \&TimeoutError; eval { alarm 10; }; if (&openSocket(SOCK, $url, $method, \%header, $stdin)) { $vieweron = 0; open(DATA,">$betafile"); while(<SOCK>) { if ($vieweron == 1) { print DATA $_; } if ($vieweron == 2) { $vieweron = 1; } if ($_ =~ /Content-Type/i) { $vieweron = 2; } } close(DATA); &closeSocket(SOCK); } else { &error; } eval { alarm 0; }; &kaiseki_beta; return($beta); }

  • mixiのブログにPHPで投稿をするプログラムで

    タイトルの件で教えて頂きたい事が出てきました。 以下のサイトで公開されてますプログラムを利用しまして ttp://creazy.net/2008/07/post_a_mixi_dialy_from_php.html 少し省略していますが下記のように少し変更して使って見ました。 尚、テキストだけでも投稿可能となっていましたので 画像の部分は外しています。 試してみましたら$res_codeの所で「404」が返って来まして 失敗しているようで投稿できません。 いろいろと考えてやってみましたが良く分かりません。 ご存知の方がいらっしゃいましたらご教授のほどお願いいたします。 環境は以下の通りです。 ・OS:Windows XP/Apache2.0 ・PHP 5.2 以下が試したプログラムの抜粋です ------------------------------------------------------------ // mixi USER infomation $user = 'mixiのログインID'; // << 実際は登録データを設定済みです $pass = 'mixiのパスワード'; // $id = 'mixiのユーザーID'; // // WSSE Authentication // Windowwsでは、posix_getpidは使えないので uniqidに変更 //$nonce = pack('H*', sha1(md5(time().rand().posix_getpid()))); $nonce = pack('H*', sha1(md5(time().rand().uniqid("")))); $created = date('Y-m-d\TH:i:s\Z'); $digest = base64_encode(pack('H*', sha1($nonce . $created . $pass))); $wsse_text = 'UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"'; $wsse_header = sprintf($wsse_text, $user, $digest, base64_encode($nonce), $created); // mixi POST URL $url = 'http://mixi.jp/atom/diary/member_id=' . $id; //------------------------------------------------------------ // Post Text //------------------------------------------------------------ $post_data = "<?xml version='1.0' encoding='utf-8'?>" . "<entry xmlns='http://www.w3.org/2007/app'>" . "<title>テストタイトル</title>" . "<summary>テスト・テスト・テスト</summary>" . "</entry>"; $request = new HTTP_Request($url); $request->setMethod(HTTP_REQUEST_METHOD_POST); $request->addHeader('X-WSSE', $wsse_header); $request->setBody($post_data); if (PEAR::isError($request->sendRequest())) { die('request failed'); } $res_code = $request->getResponseCode(); echo "$res_code\n"; // 404が返ってくる ------------------------------------------------------------

    • 締切済み
    • PHP
  • postしたコンテンツの取得

    いつもお世話になっております。 PHPでHTTPでPOSTされたコンテンツを受け取るサンプルとして以下のような スクリプトを作成しました。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>sample</title> </head> <body> <p><?php var_dump(file_get_contents('php://input')); ?></p> </body> </html> そしてデータの送信側のPHPスクリプトとして以下のようなものを作成しました。 <?php function post_request($url, $data, $referer='') { // Convert the data array into URL Parameters like a=b&foo=bar etc. $data = http_build_query($data); // parse the given URL $url = parse_url($url); if ($url['scheme'] != 'http') { die('Error: Only HTTP request are supported !'); } // extract host and path: $host = $url['host']; $path = $url['path']; $port = $url['port']; var_dump($url); $fp = fsockopen($host, $port, $errno, $errstr, 30); if ($fp){ // send the request headers: fputs($fp, "POST $path HTTP/1.1\r\n"); fputs($fp, "Host: $host\r\n"); if ($referer != '') fputs($fp, "Referer: $referer\r\n"); fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); fputs($fp, "Content-length: ". strlen($data) ."\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $data); $result = ''; while(!feof($fp)) { // receive the results of the request $result .= fgets($fp, 128); } } else { return array( 'status' => 'err', 'error' => "$errstr ($errno)" ); } // close the socket connection: fclose($fp); // split the result header from the content $result = explode("\r\n\r\n", $result, 2); $header = isset($result[0]) ? $result[0] : ''; $content = isset($result[1]) ? $result[1] : ''; // return as structured array: return array( 'status' => 'ok', 'header' => $header, 'content' => $content ); } $fileHandle = fopen("/home/a/text.txt", "rb"); $fileContents = stream_get_contents($fileHandle); fclose($fileHandle); var_dump(post_request('http://ipaddress/rawpost.php',$fileContents)); ?> 上記PHPスクリプトによってPOSTされた結果のHTMLの var_dump(file_get_contents('php://input')) の部分はstring(0)となりました。 HTTPのPOSTのコンテンツ部分を取得するには どのようなスクリプトを記載すればよいのでしょうか。 どなたかご教授よろしくお願いいたします。

    • 締切済み
    • PHP
  • ashxに送信したデータが受信時に違う値になる

    とあるZipファイルのデータをashxに送信し、 ashxで受信したデータをファイルに出力する処理を実現したいのですが、 出力されたファイルを解凍しようとしても破損しており、解凍できませんでした。 原因を調べてみたところ、ajaxでashxに送信する時点では元のZipファイルと同じBinaryデータなのですが、ashxで受信したリクエストのボディ部が送信したデータと一致していませんでした。 (ashxで受信したTotalBytesの値が送信データよりも多くなってしまっていました。) ajaxで送信する際の指定に問題があるのでしょうか? 原因分かる方おりましたら、ご教授ください。 -----------------以下データを送信するaspxファイルのJS------------------------- var base64Str = document.getElementById("hData");  ←zipファイルのbinaryをbase64変換した値が格納されているhidden項目の値を取得しています。 var binaryStr = ConvertBase64.decode(base64Str); ←base64文字列を復号する処理です。この時点では元のZipファイルのBinaryデータと一致しています。 $.ajax({ type: "POST", url: "test.ashx", catche: false, headers: { "test": "aaaa" }, data: binaryStr })

  • 初投稿です。

    初投稿です。 質問の仕方がおかしいかもしれませんが、宜しくお願いいたします。 業務でウェブアプリケーションを作っています。 【質問】 FireFox でAjax でデータを送信すると、Content-Type に「application/x-www-form-urlencoded; charset=UTF-8」が設定されてしまいます。 jQuery の $.ajax() のオプションで、「contentType:"application/x-www-form-urlencoded"」と指定しているのですが、必ず「charset=UTF-8」が付加されてしまします。 何とか「charset=UTF-8」の付加を回避する方法は無いでしょうか? ちなみに開発環境は次の様になっています。 【サーバ】 OS:CentOS5.5(エンコードはEUC_JP) Webサーバ:Apach 2.0.63 DB:PostgreSQL 8.2.14 開発言語:Perl v5.8.7 CGI JavaScriptライブラリ:jQuery 1.4.3 【クライアント】 OS:WindowsXP SP3 ブラウザ:IE8、FireFox3.6.11、Safari4.0.4 charset=UTF-8」が設定されてしまい、送信した値がCGIで受け取れない。 【質問の背景】 サーバ側でデータが取得できない原因は、Perlモジュールの(CGI)Lite.pmがフォームの値を取得する処理で、次のようなコードとなっているためです。 ※一部抜粋します。 sub parse_form_data{ $content_type = $ENV{CONTENT_TYPE}; #####▼ 問題はこの部分です。 if (!$content_type || ($content_type eq 'application/x-www-form-urlencoded')) { #####▲ local $^W = 0; read (STDIN, $post_data, $content_length); $self->_decode_url_encoded_data (\$post_data, 'form'); return wantarray ? %{ $self->{web_data} } : $self->{web_data}; } elsif ($content_type =~ /multipart\/form-data/) { ($boundary) = $content_type =~ /boundary=(\S+)$/; $self->_parse_multipart_data ($content_length, $boundary); return wantarray ? %{ $self->{web_data} } : $self->{web_data}; } else { $self->_error ('Invalid content type!'); } } 上記の書き方では、$content_type に値が入ってこないか、「application/x-www-form-urlencoded」だったらとなってしまいます。(あってますよね) 「charset=UTF-8」が付加されたときここを通ってくれずエラー扱いされてしまいます。 先輩に相談したところ、できるだけサーバのモジュールはいじりたくないとのことです。 また、GETメソッドもできるだけ使いたくないといわれました。 長文になってしまいましたが、なにとぞ宜しくおねがいいたします。