質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

2288閲覧

カラーミーAPI / PHPで在庫数の更新ができません

mukufusa

総合スコア12

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2021/05/09 04:29

編集2021/05/09 14:28

こんにちは、いつもお世話になっております。

自分はまだ技術が十分ではありませんが、ECサイトを作っております。(セキュリティについてはSQLi,XSS,CSRF対策済みで、他は現在勉強中になります。決済機能は外部のためカード情報は保持しません)

現在、カラーミー(ユーザー数4万人のECサイトのASP)と自分のECサイトの在庫連携機能をカラーミーAPIを利用して作っているのですが、「カラーミーのショップの在庫数をAPIから更新する方法」がまったくわかりません。※商品にはオプション(サイズ)ありの条件。

オプションなしの在庫更新は知り合いにサンプルを頂き、無事に在庫更新できたのですが、オプションありの商品の在庫更新をどうやってやれば良いのか検討も付きません。SQLならWHERE句にidとoptionを入れてUPDATEするだけですが。やることは単純なのに書き方がわからないのです。

公式ドキュメントやネット上に更新のサンプルコードや解説がなく、1日以上つまってしまい、これ以上は自分で解決できる見込みがないため、投稿させて頂きました。

環境はローカルです。PHP 7.4.15 / MySQL 8.0.23 / Apache 2.4.46 (Win64)

カラーミー公式APIドキュメント
https://developer.shop-pro.jp/docs/colorme-api#operation/updateProduct
(「在庫」という機能にはGETしか存在せず「商品」というところでPUT(更新)するようです)
variants という中に、option1_value, option2_value, stocks が入ってます。

どなたかの手を借りないと、実現できそうにないので、テストアカウントを作成し、公開しても問題のないアクセストークンを取得しました。

以下が在庫数を取得できているコードになります。商品には**「カラー と サイズ」が存在します。(オプション1 と オプション2)**

<?php $header = [ 'Authorization: Bearer 3e8a09c7e2b04e8b69e52e3507daac8e334fcb6b069cef00d8caec84d2305724' ]; $url = 'https://api.shop-pro.jp/v1/products/159565096.json'; $param = array( 'product' => array( 'stocks' => 1000 ) ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param)); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); $information = curl_getinfo($ch); curl_close($ch); print_r(array( 'http_code' => $information['http_code'], 'response' => $result, )); ?>

アクセストークン: 3e8a09c7e2b04e8b69e52e3507daac8e334fcb6b069cef00d8caec84d2305724 (動作確認済)
商品ID: 159565096
商品ページ: https://apimuzui.shop-pro.jp/?pid=159565096

ちなみに、商品にはオプション1(サイズ)のみ存在する場合、オプション1と2(サイズとカラー)が存在する場合がありますが、自分の場合はオプション1(サイズ)のみ存在する場合が多いです。

もし自分に前提知識が不足している領域があれば、合わせてご指摘頂けると助かります。

PHPやDBや(セキュリティは少し)勉強はしましたが、LinuxやHTTP/TCPなどネットワークの基礎概念の勉強はまだできておりません。

トークンを作る際に、cURLというコマンドツールを使った方が良いという情報が出てきましたが、これについてもよく理解できてません。

PHPで自分だけで考えて作るときに詰まることはありませんが、いつもAPIのように外部との連携になると突然まったくわからず、1つのことに1週間以上はまってしまったりします。

この機会にちゃんと足りない知識を埋め、いろいろなAPIを問題なくスムーズに使えるようになりたいと考えております。

どなたか在庫の更新の方法をご教授いただけませんでしょうか。

公式ドキュメントもネット上にも「更新方法」については情報が不足していると思うので、実装できた際には記事にして、誰が見てもスムーズにできるように、やり方を公開しようと思っております。

お手数おかけしますが、何卒よろしくお願いいたします。jsonのURLの後に検索ワードのようにオプションの値を入れるのでしょうか。

頂いた回答を参考に以下のコードに修正しましたが、エラーになってしまいました。

実際に在庫数を変更を確認したパラメーターをそのまま参考にさせて頂き書いたので、正常に動くはずですがとても不思議です。

Array ( [http_code] => 500 [response] => {"errors":[{"code":500000,"message":"Internal Server Error","status":500}]} )

何が原因でしょうか。

<?php $header = [ 'Authorization: Bearer 3e8a09c7e2b04e8b69e52e3507daac8e334fcb6b069cef00d8caec84d2305724' ]; $url = 'https://api.shop-pro.jp/v1/products/159565096.json'; **$param = array( 'product' => array( 'variants' => array ( 'option1_value' => 'WH', 'option2_value' => 'S', 'stocks' => 99 ) ) );** $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param)); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); $information = curl_getinfo($ch); curl_close($ch); print_r(array( 'http_code' => $information['http_code'], 'response' => $result, )); ?>

解決コードがコメント欄になってしまったので、ここに記載しておきます。

<?php $attributes = array( "product" => array( "variants" => array( array( "option1_value"=>"WH", "option2_value"=>"S", "stocks"=>1 ) ) ) ); $request_options = array( 'http' => array( 'method' => 'PUT', 'header' => "Authorization: Bearer 3e8a09c7e2b04e8b69e52e3507daac8e334fcb6b069cef00d8caec84d2305724\r\n" . "Content-Type: application/json\r\n", 'content' => json_encode($attributes) ) ); $context = stream_context_create($request_options); $url = 'https://api.shop-pro.jp/v1/products/159565096.json'; $response_body = file_get_contents($url, false, $context); $response = json_decode($response_body, true); print '<pre>'; print_r( $response ); print '</pre>'; ?>

3e8a09c7e2b04e8b69e52e3507daac8e334fcb6b069cef00d8caec84d2305724 はアクセストークンです。

$url の 159565096 は商品ID です。

それぞれのケースに合わせて変更して下さい。

同じことでハマる人が少なくなることを願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

http://turunto.blogspot.com/2014/11/api.html

商品に在庫情報が含まれるため、商品更新から在庫数の更新も可能です。

https://developer.shop-pro.jp/docs/colorme-api#operation/updateProduct

stocks、variants/stocks...

投稿2021/05/09 08:03

Gm22

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mukufusa

2021/05/09 08:12 編集

ありがとうございます。やはり商品更新の variants からできるようですね!しかしながら、どうやって書けばいいのかがわからず、ご紹介のURLも自分でも見つけて見ていたのですが、javascriptでしょうか。あとは、オプションがない場合の在庫更新なので、オプションがある場合の書き方がわからなくて投稿させて頂きました。自分は何の知識が不足しているのでしょうか。もう少し頑張ってみます。
mukufusa

2021/05/09 08:38

すみません、論点ができるかできないかの方に移ってしまい、どうやって実現するかの質問が薄まってしまったので、質問を再投稿させて頂いてもよろしいのでしょうか。実は、オプションがない在庫の更新ができたコードがあるので、そちらを元に質問させて頂いた方が良い気がして。こちらのコミュニティはルールがいろいろと厳しいようですので、もしよかったら教えて下さい。
AbeTakashi

2021/05/09 08:47

新たに質問は立てなくてもいいと思いますよ。タイトルや質問文は修正や追記もできます。みたところJavascriptが出る幕はなさそうですよ。普通にPHP使ってjsonをPUTで送るだけでいいように見えますけどね。商品情報は複雑なので、もっと単純なAPIから始めたらいいと思います。GET、POST、PUT、DELETEを使い分けられるようになるのが最初の一歩かと思います。
mukufusa

2021/05/09 09:28 編集

ありがとうございます。新しくないと下に埋もれてしまい回答がつかないのかと思いまして。今は商品IDのみをキーにして指定した値を更新しますが、商品IDとオプションの2つをキーに更新する書き方が単純にわからないのです。ロジックは超初歩的ですが、ルールがわからないのです。カラーミーのドキュメントにサンプルコードがあればそれで済む話なのですが、情報が不足しているように感じます。
AbeTakashi

2021/05/09 09:33 編集

コメントを記載すれば「アクティブな質問」と見なされ上の方に表示されるようになるのでその心配は無用です。カラーミーのドキュメントの情報が不足しているかどうかは人それぞれだと思いますが、この手のAPIを扱ったことがある人なら最低限の情報はあるなぁという気がします(どこもこんなもんですよ)。基本はヘッダーやURLのパラメータに必要なデータを入れて、jsonデータつくって、GET、POST、PUT、DELETEの4種類から選んで送るだけです。これで情報が不足していると感じるならAPI系の処理に関する知識や経験が足りないのでしょう。先ほども書きましたが、まずは簡単なAPIから試して学習を進めるといいと思います。もしくはカラーミー以外のサンプルコードがあるようなAPIを使って学習するのもいいと思います。
mukufusa

2021/05/09 09:57 編集

コメントでアクティブな質問なるほど。かしこまりました。実はプログラマ歴35年の方が昨日から親切にも取り組んで頂いて、キーの取得からオプションなし在庫更新まではできたのですが、オプションありの在庫の更新は断念したので(本当に感謝です(ToT)、カラーミー公式の情報が不足していると判断しました。確かに、自分は json での GET POST PUT DELETE というAPIの基本をまったく勉強してないので、できないだけなのかもしれません。2つの値をキーにUPDATEするやり方なんで普通にあると思うので、まずは json の基礎を学習してみたいと思います。アドバイス参考になりました。ありがとうございます。質問するのであれば、もはやカラーミーではなく、単純に json の話のような気がしてきました。
Gm22

2021/05/09 09:50

http://siteijiri-log.blog.jp/archives/1021955672.html 上記のurlの通りで$attributeを次のようにして在庫数の変更が可能でした。 $attributes = array( "product" => array( "variants" => array( array( "option1_value"=>"WH", "option2_value"=>"S", "stocks"=>15 ) ) ) );
mukufusa

2021/05/09 10:18

ええーーーっ、ありがとうございます!まさかそういう書き方でOKとは!!!と思ってコピペして動かしましたが、エラーになりました(ToT) Array ( [http_code] => 500 [response] => {"errors":[{"code":500000,"message":"Internal Server Error","status":500}]} ) コードを追記でアップします。なんでだろう。あと少しっぽい!!感謝です!!
Gm22

2021/05/09 10:23

サンプルの在庫数が60から65に更新されたことを確認されましたか? $attributes = array( "product" => array( "variants" => array( array( "option1_value"=>"WH", "option2_value"=>"S", "stocks"=>15 ) ) ) ); $request_options = array( 'http' => array( 'method' => 'PUT', 'header' => "Authorization: Bearer 3e8a09c7e2b04e8b69e52e3507daac8e334fcb6b069cef00d8caec84d2305724\r\n" . "Content-Type: application/json\r\n", 'content' => json_encode($attributes) ) ); $context = stream_context_create($request_options); $url = 'https://api.shop-pro.jp/v1/products/159565096.json'; $response_body = file_get_contents($url, false, $context); $response = json_decode($response_body, true); print '<pre>'; print_r( $response ); print '</pre>';
mukufusa

2021/05/09 10:27

はい、Sが15個になり「合計65個」確認できました!
Gm22

2021/05/09 10:30

上記から$urlの「&#039;」を「'」に置き換えてください。
mukufusa

2021/05/09 10:34

コードありがとうございます。しかし、動作しません。というか何も表示されません・・・謎です あ、$url のセミコロンが2つ ^^
mukufusa

2021/05/09 10:40

できました!!!!!!!(ToT) 感動です!!ありがとうございます。 しかし、ちゃんと復習しないとですね。 "option1_value"=>"WH", "option2_value"=>"S", "stocks"=>15 このように、キーになる値と更新する値が並列に入力されることはまったく想像がつきませんでした。 処理が完了した今もどうしてそれで動くのか謎のままです。 メインのキーになっている、product_id 159565096 は、URLに付いているので、そこから商品IDで検索しているのはわかるのですが、変更したい値のとなりにキーを並べて更新できてしまう仕様が異様に思えます。
Gm22

2021/05/09 10:47

それはカラーミーAPI仕様なだけで、何故については説明が困難です。
mukufusa

2021/05/09 10:56

あ、そうなんですね... 笑 しかし、教えて頂いたサイトを見ても、オプションの在庫数変更のコードは書かれておらず http://siteijiri-log.blog.jp/archives/1021955672.html > オプション変更の場合はhttp://shop-pro.jp/?mode=api_startedのサンプルの形でいいはず。 上のページの右側の黒背景の配列の記載がサンプルということでしたか まさか "option1_value"=>"WH", "option2_value"=>"S", "stocks"=>15 で行けるとは、自分では一生気づかなかったと思います 経験があれば、なんとなく行けたのでしょうか... ベテランでもハマるような、解説の薄さと変な仕様だと思うのですが 今回は本当にありがとうございましたm(__)m
Gm22

2021/05/10 01:56

こちらでもとても勉強になりました。 ありがとうございました。 今後もご縁がございましたら 何卒、御協力させて下さいませ。
guest

0

昔、自分で書いたコード(おそらくサンプルコードをコピペ)では、在庫数の取得はできているのですが、在庫の更新の仕方がいくら公式ドキュメントを見ても、いくら検索しても全くわかりません。(自分にはどこにもやり方が書いてないような気さえします)

API
https://developer.shop-pro.jp/docs/colorme-api#tag/stock

APIドキュメントを見る限り、在庫を調整するAPIが提供されていないので、できないと判断します。

投稿2021/05/09 06:01

編集2021/05/09 06:02
phper.k

総合スコア3923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mukufusa

2021/05/09 06:46

回答頂きありがとうございます。 できない!なるほど、目からウロコです。 確かに在庫のところにはGETしか書いてなくて謎に思ってました。なので、商品の更新からやるのだと思ってました。そこにはオプションや在庫数のデータも入ってますので。 しかしながら、在庫ロボやネクストエンジンはカラーミーのAPIを使って在庫の更新をしてるので、できないことはないと思いますが… どういうことか謎ですね。在庫連携のソフトに誘導しようとしてるのか。それともAPIのアクセスが多そうな機能はわざと公開してないとか… それならそれで一言書くべきだと思います。 カラーミーに問い合わせしてみます。
phper.k

2021/05/09 06:57

> 在庫ロボやネクストエンジンはカラーミーのAPIを使って在庫の更新をしてる 在庫調整のAPIをそういったサービスにだけ公開しているんでしょうね。
mukufusa

2021/05/09 07:16

ネクストエンジンがカラーミーと在庫連携できないということではなく、ネクストエンジンのAPIってことですね? (在庫連携ソフトが在庫連携できないことはないと思うので)
mukufusa

2021/05/09 07:18

はい、商品にその機能がありますが、オプション(SKU)が存在する場合も在庫更新できそうですかね? もしできるとしても、書き方が書いてないのでわからなくて。
phper.k

2021/05/09 07:21 編集

データ構造を見る限り、variants の中に、stock を持っているようですね。
mukufusa

2021/05/09 07:22 編集

あ、そうです。variants の中に入ってます!
mukufusa

2021/05/09 07:22

あ、そうです。variants の中に入ってます!
phper.k

2021/05/09 07:28 編集

requestBody に 指定された json 形式でデータを詰めて PUT メソッドでリクエストすればできませんか?
mukufusa

2021/05/09 07:36

はい、できるかもしれないのですが、jsonやAPIまわりの知識が乏しく、また指定された形式がなんなのかわからず、ドンピシャのサンプルコードがないとできないといった状況でして・・m(__)m
phper.k

2021/05/09 07:38

ドンピシャで、コピペでできるようなものは流石に光賢ないでしょうけど、調べると、 https://ondotori.webstorage.jp/docs/api/reference/api_sample.html この辺使えそうですね。 もちろん、エンドポイントなどの値やメソッドを使用に合わせて変更する必要はありますが。
mukufusa

2021/05/09 07:56

ありがとうございます!ここを参考に少しやってみますm(__)m
mukufusa

2021/05/09 08:41

すみません、他の方の回答も論点が「できるかできないか」の方に移ってしまい、どうやって実現するかの質問が薄まってしまったので、質問を再投稿させて頂いてもよろしいのでしょうか。実は、オプションがない在庫の更新ができたコードがあるので、そちらを元に質問させて頂いた方が良い気がして。こちらのコミュニティはルールがしっかりとしている印象ですので、もしよかったらご教授下さい。
phper.k

2021/05/09 09:49 編集

> オプションがない在庫の更新 それができているなら、ほぼ同じはずですけどね・・・。 追記で対応できない(文字数制限で投稿できないなど)ようであれば、こちらの質問は閉じてから、新たに立ててもいいと思います。
phper.k

2021/05/09 09:52

およその場合、JSON の形式が正しくないのが原因だと思いますよ。
mukufusa

2021/05/09 10:02

ありがとうございます。JSONまったくわからずにやってしまっているので、ちょっと基本から少し勉強してやります。なんとなく自分に足りないものが見えてきました。ありがとうございます。ちょっと落ち着いて焦らずやってみます!
phper.k

2021/05/09 10:12

テラテイルの性質上、こうすればいいよと回答者が「答え」を書いてしまうことは大変憚られるので、実際に書いたコードを提示し、「どうなったのか」をしっかり書いてきれば、「ここをこうすれば?」と回答しやすくなります。
mukufusa

2021/05/09 10:47

なるほど、すばらしい教育方針ですね^^ 自分も実現したらOKでは何も身にならないと思っているので、ちゃんと理解して苦手なAPIを今回で克服したいと思います。 あ、ちなみにほかの方が正解のコードを貼ってしまいました^^; いやでも正解を見る限り、自分でたどり着けるようなものではなかったので、今回は先に正解そのものを示して頂き助かりました。 「検索キー」と「入力する値」を並列に並べて入力して動くなんて違和感しかありません。jsonを勉強すればわかるのかどうか... $attributes = array( "product" => array( "variants" => array( array( "option1_value"=>"WH", "option2_value"=>"S", "stocks"=>99 )
phper.k

2021/05/09 11:24

JSONの形式ではそうなっているので、[] ← これが配列を意味している。 ちなみに、教育方針でもなんでもなくて、 https://teratail.com/help/avoid-asking ここに書かれているように、プログラミング代行ではないからです。
mukufusa

2021/05/09 14:23

読みました。コードを下さいという意図でしたか。 まあ、でも、先に正解のコードを示さないと話が進まないことも多いので、今回は助かりました。jsonはよく出くわしそうなのでちゃんと勉強します。いろいろとアドバイス頂きありがとうございましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問