CakePHP利用 Google Spread Sheetsとの連携でSSLエラーになる問題が解決しました。
PHP と Sheets API を利用して Google Spread Sheets を操作する方法 — さめたすたすのお家
上記のサイトを参考にGoogle Spread Sheetsとの連携をCakePHPを利用してコーディングしていたところ、
実行時以下のようなエラーが発生しました。
cURL error 60: SSL certificate problem: unable to get local issuer certificate
google翻訳機にかけた↓
cURLエラー60:SSL証明書の問題:ローカル発行者証明書を取得できません
というエラーらしい。
ほんとむり。リスカしよ。と思ったけどバカなりに頑張りましてどうにかなりました。
調べてみてわかった原因
・WindowsのPHPではcurlを使って通信する際、CA証明書がないというエラーが起こることがあるらしい(PHP5.5以降がなるらしい?ちなみに今回使用していたのはPHP5.6でした)
・Windows 上で cURL を使うと、SSL サイトで証明書の検証に失敗することがあるらしい
いろいろ試行錯誤し一応解決はしたので載せておきます。
ローカルのテスト環境などで開発している方の参考になりますように。
※なぜ解決したのかは私がばかゆえによくわかっていません!
1.SSLの認証情報をインターネットから取得してきます。
http://curl.haxx.se/ca/cacert.pem
↑ここからダウンロードできます。
2.1でダウンロードしたファイルをphp\extras\ssl配下に格納します。
私の場合はC:\xampp\php\extras\sslでした。
3.php.iniに以下のソースを追加します。
[cURL]
curl.cainfo = "2で格納したファイルのパス"
openssl.cafile = "2で格納したファイルのパス"
私の場合
[cURL]
curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
openssl.cafile = "C:\xampp\php\extras\ssl\cacert.pem"
ですね。
4.処理を行うPHP側に以下文を追加します。
$client->setHttpClient(new GuzzleHttp\Client(array('verify' => false)));
私の場合は
$client = new Google_Client();
~
$service = new Google_Service_Sheets($client);
の間に今回は記述しました。
ClientがcURLを叩く際に証明書の検証はデフォルトでオンになっているので、
それを回避できる書き方だそうです。
これを書いたら回避できた時点でphp.iniの記述いらんかったんじゃないかって思ってる。
検証はしてない。
5.通常通り処理を実行します!
ぱらっぱっぱっぱー
動くはずです!
おめでとうございます❀
以下参考にしたサイト様たち…
- Google APIをPHPウェブアプリケーションから呼び出す(サービスアカウント) 第5回 - プログラミングノート
- GuzzleHttpのClientでリクエスト送る時に、証明書の検証を回避する方法 - Qiita
- cURL error 60: SSL certificate problem: unable to get local issuer certificate · Issue #788 · google/google-api-php-client · GitHub
頭が悪い人向け Google Spread Sheets と CakePHPの連携①
頭悪い人向けの記事がなさすぎてむかついたので書いとく。
ほんと一生HTMLとCSSで生きていきたいんですけど神様。。。
あとわかりたいのはjavascriptしかないです神様。。。
前提
以下がすでに行われているという前提でやっていきます。
・CakePHPはインストールされている
・サーバー(Apache)やローカルDBなどは用意されている
・ネットつながーる
・ローカルでの操作である
全体的な流れ
1.Google側での前準備
①Google API Console にプロジェクト追加
②認証情報の作成
③スプレッドシートへの共有設定
④APIの有効化
2.コンポ―サーインストール
3.PHP用Google API クライアントライブラリをComposer経由でインストール
4.CakePHP実装(Googleスプレッドシート連携コンポーネントの作成)
ここでまさかの決断ですが、1は飛ばして2から書きます。
この時点で公開する勇気を一旦持ってみることが大事だと思う。
2.コンポ―サーインストール
ローカル(Windows)の場合、コマンドプロンプトからコンポ―サーをCakePHPのapp配下にインストールする。
プロジェクトへのパス\app まで移動
cd C:\【任意のプロジェクトまでのパス】\app
以下のコマンドでcomposer.pharをインストール
php -r "readfile('https://getcomposer.org/installer');" | php
composer.pharがapp配下に作成されます。
3.PHP用Google API クライアントライブラリをComposer経由でインストール
app配下に格納されているcomposer.jsonを書き換えます。
CakePHPをダウンロードしたときにapp配下には既にcomposer.jsonが作成されているはずです。
インストールしたいプラグインによってrequire部分を変更します。
インストールしたいプラグインが複数あるときは増やすだけ。
今回はgoogle-api-php-clientをインストールしたいのでこう書きます。
なんでこの書き方なんかはわからなかったけどこうらしい。
{
"require": {
"google/apiclient": "^2.0",
"他にインストールしたいのがあれば書く": "バージョンを書くとこ"
}
}
以下のコマンドをcomposer.pharを格納しているディレクトリ内で実行します。
インストールしたかったプラグインがインストールされます。よかった~。
(composer.jsonを実行するコマンド)
php composer.phar install
これでPHPファイルからgoogle-api-php-clientを呼び出せるようになりました。
なのでスプレッドシートを操作する準備は整ったといっても過言ではない!
次回以降 CakePHPの実装にすすみます。
任意のデータ型 T の要素ってのがよくわからん。
List クラスの新しいインスタンスを作成します。
リストには任意のデータ型 T の要素を保持できます。。。。
リストには任意のデータ型 T の要素を。。。
任意のデータ型 T の要素ってなんや。。。
データ型書いたらええんか。。。
わからぬ。。。
Salesforceを勉強する。5日目
1日目の次に急に5日目になる。
なぜなら
上司『APEXで外部アプリケーションとSalesforceを連携したいんだよね』
私『おめでとうございます。おつかれさまです。』
上司『つまりAPEXで外部アプリケーションとSalesforceを連携するところを作ってほしいんだよね。できるよね。』
私『できません。APEXってなんですかSalesforceってなん』
上司『よろしくね。それがお仕事だからね。』
で急にAPEXを使ってガリガリ書くことになったからです。
もういやです。
2日目~4日目はもっと基礎的なとこ書きたいので
後日書くという言い訳をして
さて、これがお仕事なのでやっていきましょう。
まずAPEXとは
salesforceの開発言語です。
ほぼjavaらしいです。
ワタシjavaアンマリツカッタコトナイCakePHPガスキスキスキ。。。
どうやって開発すんの??
まずsalesforceのソースをとってこよう
用意するのは
- MavensMate
- Sublime Text3(Package ControlでMavensMateot落としてきてね)
だよーん
上記2つのアプリを使って
自身のsalesforce環境を落としてきましょう。
本番環境じゃなくて
sandboxっていう本番環境コピーした開発環境がすぐ作れて便利!
だからそっちとまずつなげてねーーーー。
とりあえず書こう!
Apexの概要について参考になるサイトページ
ふむふむ拡張子は.clsで
classes フォルダにApexクラスを格納していくのね。
ではではさっそく簡単な処理を書いていこう。
お、こんなところにすごく便利なtrailheadはっけん。
これの最後にハンズオンのチャレンジがあるのでやってみました。
ちょっと理解した気になれるのでどうでしょうか。
でもなぜかハンズオンのチャレンジだけ英語のままだったので
日本語に訳してみたよ!↓
string型の('Test 0', 'Test 1', ...)が格納された配列を返却する
APEXクラスを作ってください。
配列内のデータ数は引数によって設定するようにしてください。
- StringArrayTestというpublicなAPEXクラスを作ってください。
- StringArrayTestにはpublicなstaticのgenerateStringArrayというメソッドをもたせてください。
- generateStringArrayメソッドはstring型の配列を返却するようにしてください。各文字列は、 'Test n'の形式で値を持たなければなりません。ここで、nは配列内の現在の文字列のインデックスです。返却される配列の文字列の数は、 generateStringArrayメソッドのinteger型引数によって指定されるようにしてください。
レッツチャレンジです!
本当にしたい機能を作っていこう
今回やりたいのは
外部アプリケーション→salesforce→外部アプリケーション
です。
詳しく書くと
外部アプリケーションでデータ取得のボタンをクリック
↓
salesforceの処理呼び出し
↓
salesforceの処理内でsalesforceで使用してるデータを取得
↓
取得したデータを外部アプリケーションに返却
がしたい!
REST APIでやっていきます。
REST APIは調べたけどよくわかんなかった(ばかすぎ)
RESTの原則に沿ったAPIってなんや
とりあえずHTTPのGETやPOST使ってウェイって感じのやつと理解した
Apex REST アノテーション
ってのがsalesforceにはあるらしいぞな。
- @RestResource(urlMapping='/yourUrl')
- @HttpDelete
- @HttpGet
- @HttpPost
- @HttpPut
この
- @RestResource(urlMapping='/yourUrl')
を使っていくぜうぇい
やり方としては
①外部アプリケーションでsalesforceにhttpリクエストする
②salesforceのソースに新しいファイル作る
③②に処理を書いていく。
④①のリクエストURLを②③の場所に合わせる
確認の方法は
ログを吐いて開発者コンソール
system.debug(なんたらかんたら);
ダオ作ってコントローラ作って
viewが外部アプリケーションないめーじ
DAOはDB関連の処理をまとめたものだよん。
ここで参考にしたページ
すごい!
めっちゃわかりやすい例がそのまま載ってやがるぜ!
ネットってめっちゃ便利やな!
ばかなので本当に1つずつ理解していきます。
@RestResource
(urlMapping=
'/Account/*'
)
⇒RESTアノテーションの宣言
アノテーションは日本語で注釈、注記といった意味。
REST APIでこのクラスの処理は実行するんですよ~っていう注意書きをします。
REST APIで指定されるURLもここでわかるようになるね~便利ね~
@HttpDelete
@HttpGet
@HttpPost
⇒これもRESTアノテーションの宣言
削除要求かゲットかポストか呼び出し元がどうしてるかわかるように
注意書きしてるよん
global with sharing
class
⇒global はアプリケーション外からもアクセスOKにするとき使う識別子みたいですね。通常はprivate / protected / publicで良いということかな。
とりあえず今回は外部アプリケーションから呼び出すのでglobalですね!
よしわかった!
…しかし、んん?with sharing??
この疑問を解決してくれているのがここ!
なるほどwithだと権限がないユーザーがこのクラス読み込んでも
データ参照できないのね!!!
逆にwithoutだと権限関係なくデータもってこれるのね!!
(間違ってたらめっちゃごめんなさい)
もはや独り言と化してますが理解した
あとは普通に書き書きしてるだけかと思いきや謎のコンストラクタ発見
RestRequest
RestResponse
ちなみにコンストラクタとは・・・
http://wa3.i-3-i.info/word13646.html
このサイトが死ぬほど初心者むけだから自分のためにメモ
とりあえずリクエストデータは
RestRequest req = RestContext.request;
レスポンスデータは
RestResponse res = RestContext.response;
に入れてつかえばええんね!
次回!城乃内死す!
デュエルスタンバイ!!!!!
(そして唐突におわる)
salesforce 認定admin取得に向けて①__権限
認定adminの取得を目標としているので
社内でもおべんきょーしております。
今日は一番重要な権限まわりのおべんきょしたので
頭の整理のためにつらつら書いていこうかと
おもうております。(こんなバカなまとめ誰も参考にしませんように)
-- ここでちょっとしたひとりごと --
権限と聞くと難しいこと考えちゃって
データベースにアクセスできるIPはこれだとか
ファイルにアクセスできるlinuxのパーミッションとかchmodとか
あっち系の話かと思ってたばかなんですが違いました。
はじめに
まずSalesforceで権限を設定しましょう!というときすることは
・プロファイルを作る
・組織の共有設定を非公開にする
この2つ!
プロファイルとは
ユーザに対して1アカウントに1つひもづけられる権限のやーつです。
たとえば社員情報管理アプリをsalesforceで作ったとします。
この社員情報管理アプリを使用するユーザーは
人事部
- Aさん Bさん
管理部
- Cさん
の3人です。
ここで
人事部のAさんBさんは社員情報の参照のみできて
管理部のCさんは社員情報の参照も書き込みもできる
みたいな設定をしたいとします。
そんなときプロファイルはこの
人事部・管理部の名前で作ります。
そして
人事部プロファイルのカスタムオブジェクト権限設定から
社員情報の参照のみにチェック
管理部プロファイルのカスタムオブジェクト権限設定から
社員情報の参照・作成・編集・削除をチェック
これでやりたいことができるようになります!!
オブジェクトに対して色々権限設定したいときは
プロファイル作ればいいって考えればいいよ♪
って私のイケメン上司は言っていました。
ということで責任を上司に丸投げしていくスタイルで
このブログは書いていこうと思います。イケメンだし。
組織の共有設定とは
レコードに対して個別に設定できる権限のやーつです。
これ設定すると
大阪と東京のデータが混在しているとき
大阪の部署には大阪に所属している人のみのデータ
東京の部署には東京に所属している人のみのデータ
を参照できるようにする
的なことができるようになります。(できる×できる)
これ結構最初わけわからんやつでした。
百聞は一見にしかずでまず
設定→クイック検索で「共有設定」を探してみそみそ。
組織の共有設定から
まず対象のレコードを探します!
そして内部アクセス権も外部アクセス権も非公開に!
とりあえずsalesforceさんの権限設定は
公開を非公開にしていくんじゃなくて
非公開を公開にしていく方法が主と考えましょう。
さらにこまかく設定しようとすると
さらにこまかく設定していくこともできます。
- 項目レベルセキュリティ
- タブの表示・非表示
- 権限セット
- ログインのセキュリティ
- チーム設定
…などなど
とりあえずはい、
書くの飽きてきたのでもう終わろうかと思います。
権限設定 自分流これだけは覚えておこう は以下3点
- プロファイルと共有設定
- オブジェクトに対して色々したいときはプロファイル
- レコードに対して制限かけたいときは共有設定
唐突におわる
Salesforceを勉強する。1日目
Salesforceとかいう素晴らしいシステムを社内で扱うこととなりました。
ので
数日前からちょっとずつさわり
勉強しております。
まずSalesforceとは
①SFA(Sales Force Automation) = 営業支援システムです。
②SaaSです。
インターネットでsalesforceにつないだら、
ボタン操作やリンクのクリックだけで
社内の営業支援システムを構築できる素晴らしい世界No.1シェアサービスです。
機能や利用状況によってお金を払う仕組み。
間違えていたのですがただたんに顧客管理システムだとCRMっていうんですね。
バカすぎて3文字のアルファベットは全部同じに見えるからいやです。
だからsalesforceってごいすーーーです、たぶん。
あとsaleseforceは正式には会社名というかひっくるめた名前で
いろいろな種類の製品があります~
- Sales Cloud
- Sales & Service
- Service Cloud
- Marketing Cloud
- Salesforce Platform
- Quip
- Community Cloud
- Einstein Analytics
- Salesforce CPQ
- Pardot
- Success Plan
- もう書きたくない
主にたぶん使ったりかかわったりするのは
- Sales Cloud
- Salesforce Platform
かなと思います。私の会社は少なくともこの2つです。
2つとも同じことが大体できますけど
元から備わってるもの と 使用料金 が異なります。
カスタマイズせんで使えるのがSales Cloud
その分料金は高いし、
会社独自のシステムとしてカスタマイズするのは向いてないイメージ。
カスタマイズばりばりしたいんやったらSalesforce Platform
料金は安いしカスタマイズするのに向いてます。
でも使えるんやったらSales Cloudを使った方がいい
そんな感じ。
そして唐突におわる。
システムもPCもプログラムもキライですが技術ブログをはじめてみます。
はじめまして。
システムもPCもプログラムもキライですし
ITなんてニュースやネットで知って
わぁすごーい
みらーい
なんかすごいみらーい
って思うだけで満足だったのですが
なぜか今プログラマーしているし
色々バカすぎてついてけないし
何度も検索しててほんとバカだなって思うので
技術??ブログ??
はじめてみます。
よろしくお願いします。