いやぁ、やっとできた。
なによりもですねカラーミーいじりたおしさんに感謝。
ここのおかげでoAuthの認証を突破することができました。
なので詳細は書きません。
やったこと。
1. カラーミーデベロッパー登録
2. OAuthアプリケーション登録
ここではリダイレクトURLに認証プログラム(xxxx.php)を登録。
クライアントIDとクライアントシークレットをゲット
3. クライアントIDとクライアントシークレットを使って、認可コードを入手する
サンプルコードはアプリケーションのウェブサーバーのサンプルという、斜め上のタイトルのサンプル。
「カラーミーいじりたおし」先生のおっしゃるように、サンプルの最後に
echo $response_body;
を追加します。
なお、コードの中に’scope’という変数があります。ここでどういうAPIを使うかを決めておきます。
うまく動作すると
Notice: file_get_contents(): Content-type not specified assuming application/x-www-form-urlencoded in ?(略) {"access_token":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","token_type":"bearer","scope":"read_products write_products read_sales write_sales"}
っていうので認可コード(access_token)が帰ってきます。
4. あくまで参考ね、参考。これは私用ですから。。。
気づいたことは;
- 取引データの終わりがわからない。ここでは40個ずつとってくるって指定して、かえってきたデータが40個なかったら終わり、と判断した。
- いつからかfromで指定しないと、ここ一週間?しかもってこない。
- file_get_contents関数はfalseにしておくと、$http_response_headerという配列で状況を返す。一応、実装した。
- 一応、パソコンでもスマホでも妥当な大きさになるよにはした。
<?php function set_up($code){ $request_options = array( 'http' => array( 'method' => 'GET', 'header'=> 'Authorization: Bearer '.$code."rn", 'ignore_errors' => true, // i want to get http status code. ) ); $context = stream_context_create($request_options); return $context; } function request_sales($context, $lines, $offset){ $url = 'https://api.shop-pro.jp/v1/sales.json'; // not sent, active, id, trans, offset $request = '?$request = '?delivered=false&canceled=false&after=2014-01-01&fields=id&limit='.$lines.'&offset='.$offset; $response_body = file_get_contents($url.$request, false, $context); $pos = strpos($http_response_header[0],'200'); if ($pos === false ){ // usually don't come here. echo '<pre>'. print_r($response_body).'</pre>'; return NULL; } else { $response_json = json_decode($response_body, true);// associated array. return $response_json['sales']; } } // end function. function request_detail($context, $trxid){ $detailist = array(); $url = 'https://api.shop-pro.jp/v1/sales/' ; $request = $trxid . '.json'; $response_body = file_get_contents($url.$request, false, $context); $response_json = json_decode($response_body, true); $details = $response_json['sale']['details']; $pos = strpos($http_response_header[0],'200'); if ($pos === false ){ //usually we don't see this message. echo '<pre>'. print_r($response_json).'</pre>'; return NULL; }else{ foreach ($details as $key => $row){ $detaillist[$row['product_name']] = $row['product_num']; } return $detaillist; } } // end function. //---- Main ---- header("Content-Type:text/html; charset=UTF-8"); // force chars UTF-8 $context = set_up('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); // Phase 1: get trxs. $offset = 0; $lines = 40; $trxids = array(); while(true){ $salesdata = request_sales($context, $lines, $offset); foreach ($salesdata as $key => $row){ array_push($trxids, $row['id'] ); } if ( count($salesdata) < $lines ) { // may be last call. break; } else { // should get next entries $offset += $lines; } } // phase 2 : get each sales trx detail. $productlist = array(); for ( $i = 0; $i < count($trxids); $i++){ // get detail producs from eac transaction. $detaillines = request_detail( $context, $trxids[$i] ); // merge each transaction into final one. foreach ($detaillines as $key => $row){ if (array_key_exists( $key, $productlist) ){ // duplicate entry $productlist[$key]+= $row; } else { // first entry $productlist[$key] = $row; } } } // print_r($productlist); $today = date('Y年n月j日'); $now = date('H時i分'); ?> <html> <head><title>調達製品リスト</title> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <style type="text/css"> body { -webkit-text-size-adjust: 100%; } </style> </head> <body> <h1>調達製品リスト</h1> <p align="right"><?= $today ?><?= $now ?></p> <table border=1> <tr><th>製品</th><th>個数</th></tr> <? foreach ($productlist as $key => $row): ?> <tr><td><?= $key ?></td><td align="right"><?= $row?></td></tr> <? endforeach; ?> </table> </body> </html>
実行例: