OAuth2の認証を使う(Misoca API)

OAuth2の認証を使う(Misoca API)

Misoca(ミソカ)のAPIを使ってみよう!
OAuth2の認証を使っているということなのでOAuth2のことを調べてみた。

■Misoca(ミソカ)
Misocaにアカウントを登録してAPIの準備をします。

Misoca APIのドキュメント
https://doc.misoca.jp/
Misoca API v1
https://doc.misoca.jp/v1/
Misoca API v3
https://doc.misoca.jp/v3/

上記ドキュメントの「アプリケーション登録」の手順でAPIの準備をします。
・Application Id
・Secret
・Callback urls
上記の3つの値をメモします。

■OAuth2
https://github.com/thephpleague/oauth2-client

OAuth2の認証は上記ツールを使いました。
ダウンロードしたバージョンは2.4.1です。

上記バージョンだとPHP5.6、7~7.3まで対応です。

Composerで必要ツールを用意します。

#-- ディレクトリの移動(oauthフォルダを作ってそちらに)
$ cd oauth
#-- composerで必要ツールを取得
$ composer require league/oauth2-client

 

プログラムコード

README.mdの中に記載のあるコードを使いましょう。
修正したものが下記になります。

$provider = new \League\OAuth2\Client\Provider\GenericProvider([
    'clientId'                => '*************************',    // The client ID assigned to you by the provider
    'clientSecret'            => '*************************',   // The client password assigned to you by the provider
    'redirectUri'             => 'http://********/your-redirect-url/',
    'urlAuthorize'            => 'https://app.misoca.jp/oauth2/authorize',
    'urlAccessToken'          => 'https://app.misoca.jp/oauth2/token',
    'urlResourceOwnerDetails' => '',
    'scopes'=>'write'
]);

// If we don't have an authorization code then get one
if (!isset($_GET['code'])) {
    // Fetch the authorization URL from the provider; this returns the
    // urlAuthorize option and generates and applies any necessary parameters
    // (e.g. state).
    $authorizationUrl = $provider->getAuthorizationUrl();

    // Get the state generated for you and store it to the session.
    $_SESSION['oauth2state'] = $provider->getState();

    // Redirect the user to the authorization URL.
    header('Location: ' . $authorizationUrl);
    exit;

// Check given state against previously stored one to mitigate CSRF attack
} elseif (empty($_GET['state']) || (isset($_SESSION['oauth2state']) && $_GET['state'] !== $_SESSION['oauth2state'])) {

    if (isset($_SESSION['oauth2state'])) {
        unset($_SESSION['oauth2state']);
    }
    
    exit('Invalid state');

} else {
    try {
        // Try to get an access token using the authorization code grant.
        $accessToken = $provider->getAccessToken('authorization_code', [
            'code' => $_GET['code']
        ]);

		// APIにリクエストを送信(見積もりの作成)
		// $mitsumoriに見積もりの配列を入れます。詳細はMisocaのドキュメントを確認
		$request = $provider->getAuthenticatedRequest(
			'POST',
			'https://app.misoca.jp/api/v3/estimate',
			$accessToken,
			array(
				"body"=>json_encode($mitsumori),
				'headers' => array(
					'Content-Type' => 'application/json;charset=UTF-8', // このヘッダーがないと返りがうまくいかない
				),
			)
		);

		// APIからのレスポンスを取得
		$response = $provider->getResponse($request);
		// レスポンスのボディ部分を取得
		$data = $response->getBody()->getContents();

		// JSONで返ってきているのでデコード
		$result = json_decode($data, true);

		session_destroy();// セッションを削除

    } catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) {

        // Failed to get the access token or user details.
        exit($e->getMessage());

    }

}

 

●修正内容
2~7行目を修正
8行目に「scopes」を追加

41~63行目を追加・修正
リクエスト&レスポンスを追加
詳しくはMisocaのドキュメントを確認してください

OAuth2にすごい時間かかりました・・・(疲

htaccessでerror_reportingの変更

htaccessでerror_reportingを変更する場合にはまったので備忘録

php_value error_reporting E_ALL

 

上記のような感じで書いちゃうと動かないみたいだ。

htaccessで指定する場合はビット値での指定が必須のようです。

各値は公式サイトを参考に。

E_ALLを指定する場合は「32767」を指定
※PHP5.4は32767、5.3は30719、5.2は6143、それ以前は2047とバージョンによって若干値が変わります。

E_ALL & ~E_NOTICE & ~E_DEPRECATED

例えば上記を指定したい場合

E_ALL:32767
E_NOTICE:8
E_DEPRECATED:8192

NOTの分を引き算します。
32767 – 8 – 8192 = 24567

php_value error_reporting 24567

 

となる。

XAMPPにLaravel

Laravelのインストール

Composerのインストール方法はコチラから

XAMPPのコントロールパネルからShellを起動
Shellで下記のコマンドでLaravelをインストール

# cd htdocs
# mkdir laravel
# composer create-project –prefer-dist laravel/laravel laravel

完了したら「Application key set successfully.」と表示されます。

下記のURLにアクセスでLaravelにアクセスできます。
http://localhost/laravel/public/

XAMPPにComposer

CakePHP3とかLaravelとか入れるにはComposerが必要になってきます。
XAMPP環境でもComposerが使えるようなのでその方法です。

まずはサイトからComposerをダウンロードしてインストールします。

https://getcomposer.org/download/

XAMPPのPHPの場所を指定。
C:\xampp\php\php.exe
※XAMPPポータブルだとこける可能性があるので、通常版を使うことをお勧めします。

プロキシの設定がある場合は、その設定を。

そのまま進めてインストール完了したらコマンドプロンプトで確認

>composer -V

バージョンが返ってこない場合はPCを再起動して試してみましょう。
それでもダメな場合は再インストールしてみてください。

Googleの同期とバックアップが動作しない

Googleの同期とバックアップが動作しない。

なんか2ヶ月以上ぶりの投稿になってしまいました・・・

100GBが半年無料の案内が来たので試して見ました。

しかしインストールしても設定画面が表示されない。
色々検索して調べてみました。

下記の方法で解決できます。
※ユーザー名は日本語じゃないほうが良いです。それが原因の場合もあります。

ちなみにうーちゃんの環境はWindows7です。

1.Driveフォルダを削除
 C:\Users\<ユーザー名>\AppData\Local\Google\
 Driveフォルダを削除
 この中に設定ファイルなど色々あってこれが邪魔しているようです。


2.インストールしたアプリをアンインストール
 「Backup and Sync from Google」をアンインストール
 インストールした状態でexeをクリックしても状況は変わらないのでアンインストールすること


3.管理者として実行
 exeファイルを管理者として実行

インストール完了後にGoogleのログイン画面が表示されると思います。

CakePHP2.10の認証でACLのエラーが・・・

CakePHP2.10でAuthコンポーネントを使って認証機能を作った。

ID、パスワード認証までは問題なかったが、認証後に別のページにアクセスしたらACLのエラーが出て困った。

Error: Table aros_acos for model Permission was not found in datasource default.

コンポーネントでACLの読込はしてないのに上記エラーが出てる。

検索しても情報が出てこなかった。

ソースを追ったりして色々調べてみたら下記の設定が原因だった。

$this->Auth->authorize = ‘actions’;

上記設定をするとACLを読み込んでACLの機能でチェックするらしい。

AUTHだけ使う場合は上記設定はなくていいみたい。

JSのslideDownやslideToggleがうまく動かないとき

slideDownやslideToggleがうまく動かないとき

スライドするところがshow()を使ったときみたいにパッと表示される場合

表示する要素がblockでなければなりません。

inlineだとパッと表示されます。

これの解決に2時間ほどかかりました・・・

はぁ。

EC-CUBE2のシーケンス一覧

前回のブログ「EC-CUBE2の規格登録でエラー」でシーケンスの更新を書きました。
他のシーケンスの重複でエラーが出たと報告があったのでシーケンスの値を全てチェックして更新しました。

EC-CUBE2で使われているシーケンスは下記になります。

dtb_api_account_api_account_id_seq
dtb_api_config_api_config_id_seq
dtb_best_products_best_id_seq
dtb_bloc_bloc_id_seq
dtb_category_category_id_seq
dtb_class_class_id_seq
dtb_classcategory_classcategory_id_seq
dtb_coupon_coupon_id_seq
dtb_coupon_products_coupon_products_id_seq
dtb_coupon_used_coupon_used_id_seq
dtb_csv_no_seq
dtb_csv_sql_sql_id_seq
dtb_customer_customer_id_seq
dtb_deliv_deliv_id_seq
dtb_holiday_holiday_id_seq
dtb_kiyaku_kiyaku_id_seq
dtb_mail_history_send_id_seq
dtb_mailmaga_template_template_id_seq
dtb_maker_maker_id_seq
dtb_member_member_id_seq
dtb_module_update_logs_log_id_seq
dtb_news_news_id_seq
dtb_order_detail_order_detail_id_seq
dtb_order_order_id_seq
dtb_other_deliv_other_deliv_id_seq
dtb_pagelayout_page_id_seq
dtb_payment_payment_id_seq
dtb_plugin_hookpoint_plugin_hookpoint_id_seq
dtb_plugin_plugin_id_seq
dtb_products_class_product_class_id_seq
dtb_products_product_id_seq
dtb_review_review_id_seq
dtb_send_history_send_id_seq
dtb_tax_rule_tax_rule_id_seq

上記の値をチェック

select * from dtb_category_category_id_seq;

修正が必要なら値を更新

select setval('dtb_category_category_id_seq',100);

EC-CUBE2の規格登録でエラー

EC-CUBEの規格登録をしようとしたら下記のエラーが出た件

*—————————————————————*
SQL: [INSERT INTO dtb_classcategory(name,class_id,creator_id,rank,create_date,update_date,classcategory_id)
SELECT $1,$2,$3,$4,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,$5]
PlaceHolder: [array (
0 => ‘テストデータ’,
1 => ’92’,
2 => ‘2’,
3 => 3,
4 => 96,
)]
MDB2 Error: unknown error
_doQuery: [Error message: Could not execute statement]
[Last executed query: EXECUTE mdb2_statement_pgsql_2977d07f3499f15f5f700e51693c3dfbbe8b622f1d (‘テストデータ’, ’92’, ‘2’, 3, 96)]
[Native message: ERROR: 重複キーが一意性制約”dtb_classcategory_pkey”に違反しています
DETAIL: キー (classcategory_id)=(96) はすでに存在します]
*—————————————————————*

EC-CUBE 2.x
PostgreSQL

classcategory_idがかぶっているよというエラーです。

PostgreSQLで状況を確認します。(phpPgAdmin)

まずはシーケンスの状況を確認します。

select * from dtb_classcategory_classcategory_id_seq;

last_valueの値がclasscategory_idの最後の値です。
これが96になっています。

classcategory_idのMAXの値を調べます。

SELECT MAX(classcategory_id) FROM dtb_classcategory;

240と値が返ってきました。

last_valueの値を変える必要があります。

select setval('dtb_classcategory_classcategory_id_seq',241);

下記のエラーが出ました。

「リードオンリーのトランザクションでは setval() を実行できません」

phpPgAdminでは実行ができないようなので、SSHでサーバーに繋げて直接PostgreSQLから実行します。

# select setval('dtb_classcategory_classcategory_id_seq',241);

最後に規格登録の動作確認をして登録できればOKです。

JavaScriptで日付の取得

JSでの日付の取得など備忘録

var now = new Date();// 現在の日時を取得

結果:Date 2018-07-14T08:00:35.771Z

このままだと使いづらいので下記のように個別で取得します。

var y = now.getFullYear();// 年を取得
var m = now.getMonth() + 1;// 月を取得(1月は0になるため+1する)
var d = now.getDate();// 日を取得
var h = now.getHours();// 時間を取得
var mi = now.getMinutes();// 分を取得
var s = now.getSeconds();// 秒を取得

ifなどで判定する場合はちょっと注意
数値型なので+すると足し算をしてしまうので、文字列に変換(toString())してから結合させる

if(y.toString()+m.toString()+d.toString() === "20180714"){
	// 処理をゴニョゴニョ
}