記事を書くきっかけ
自身で物販システムを構築したときに解説記事が皆無だったため本記事を執筆することにしました。
※構築した物販システムは下記の動画で紹介しております。
対象の読者像
・pythonで注文APIを使ってみたい方
・ヤフーショッピング、Qoo10、au payマーケットの注文APIの違いを理解したい方
・python以外で注文API使用したいけど、解説記事が見当たらなくて困っている方
※pythonでスクレイピング経験がある方なら理解できるレベルと思います。
事前にインストールが必要なライブラリ
事前に下記のリンク先を参考にをpip installして下さい。
※selenium3をインストールして下さい
受注APIの解説
ヤフーショッピング
事前準備
上記リンク先の1~5までを実施します。
※注文APIを利用できるまでに約1週間程度かかります
リフレッシュトークンを取得する
公式ですとアクセストークン取得となっておりますが、重要なのはアクセストークンと同時に取得できるリフレッシュトークンになります。
アクセストークンとは、APIにアクセスする際に使用するトークン
リフレッシュトークンとは、アクセストークンを再取得するのに必要なトークン
になります。
下記の公式画像①~③がリフレッシュトークン取得までの内容になります。
※画像は公式ページにリンクしてます。
以下のpythonソースコードを実行して、リフレッシュトークンを取得します。
import requests
import json
import pprint
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.keys import Keys
import base64
app_id = #事前準備で取得したアプリケーションIDを入力
secret = #事前準備で取得したシークレットを入力
redirect_uri = #事前準備で登録したリダイレクトURIを入力
driver = webdriver.Chrome()
url = "https://auth.login.yahoo.co.jp/yconnect/v2/authorization?response_type=code+id_token&client_id={app_id}\
&state=xyz&redirect_uri={redirect_uri}&&scope=openid+profile&nonce=ef3a091928d5491624c0ac54d697124422705091"\
.format(app_id=app_id,redirect_uri=redirect_uri)
driver.get(url)
code = input("認可コードを入力>>>")
body = app_id + ":" + secret
basic = base64.b64encode(body.encode())
headers = {"Accept":"*/*","Content-Type":"application/x-www-form-urlencoded; charset=utf-8"}
#headers["Authorization"] = "Basic " + str(basic)
data = "grant_type=authorization_code&code={code}&redirect_uri={redirect_uri}&client_id={app_id}&client_secret={secret}"\
.format(code=code,redirect_uri=redirect_uri,app_id=app_id,secret=secret)
url = "https://auth.login.yahoo.co.jp/yconnect/v2/token"
req = requests.post(url=url,headers=headers,data=data)
print(req)
token_directry = json.loads(req.text)
print("access_token:>>>" + token_directry["access_token"])
print("refresh_token:>>>" + token_directry["refresh_token"])
※seleniumを使用してchromeブラウザでスクレイピング可能にしておく必要があります。詳しくは、こちらを参照してください。
※実行環境はselenium3になります。(selenium4だとエラーになります)
◎リフレッシュトークン取得までの流れ
①必要情報をソースコードに入力する
app_id = #事前準備で取得したアプリケーションIDを入力
secret = #事前準備で取得したシークレットを入力
redirect_uri = #事前準備で登録したリダイレクトURIを入力
上記の#部分に取得した情報を入力してpythonを実行して下さい
②ヤフーIDを認可する
pythonを実行すると上記の画面が立ち上がるので、受注APIを利用するストアと紐づいてるヤフーIDにログインします。
③認可コードを取得する
事前に登録したリダイレクトURIにリダイレクトするので、出力されたURLを確認します。https://{リダイレクトURL}#state=xyz&
id_token={~長い~}&
code=xxxxxxxx
上記の形式のURLになっているので、
一番末尾のcode=xxxxxxxxのxxxxxxxxの部分をコピーします。
※この部分が認可コード
④認可コードをDOS画面にコピペ
pythonを実行したDOS画面に③でコピーした認可コードを貼付けて”Enter”を押します。⑤リフレッシュトークンの取得
上記のようにDOS画面にリフレッシュトークン(画像赤枠)が出力されます。">>>"の先がリフレッシュトークンになるのでコピーして使用して下さい。
これでヤフーショッピングの受注APIを使用する準備が完了しました!
注文APIの使用方法
各トークンの有効期限
アクセストークン:取得から1時間
リフレッシュトークン(証明書なし):取得から12時間
リフレッシュトークン(証明書あり):取得から4週間
※1度でも証明書なしでAPIにアクセスすると元のリフレッシュトークンの有効期限は4週間➡12時間に変更される
リフレッシュトークンからアクセストークンの再発行方法
アクセストークンの有効期限が1時間と短いため
受注管理の完全自動化をしたい場合、リフレッシュトークンからアクセストークンを再取得する必要があります。
上記は下記の関数で実現できます。
def refresh_token(refresh_token_base):
app_id = #事前準備で取得したアプリケーションIDを入力
secret = #事前準備で取得したシークレットを入力
headers = {"Accept":"*/*","Content-Type":"application/x-www-form-urlencoded; charset=utf-8"}
data = "grant_type=refresh_token&client_id={app_id}&client_secret={secret}&refresh_token={refresh_token}".format(app_id=app_id,secret=secret,refresh_token=refresh_token)
print(data)
url = "https://auth.login.yahoo.co.jp/yconnect/v2/token"
req = requests.post(url=url,headers=headers,data=data)
token_directry = json.loads(req.text)
print(req.text)
return token_directry["access_token"]
上記の【app_id,secret】の部分を自身で取得した情報を入力すれば、このまま組み込めば使用可能です。
access_token = refresh_token(#取得したリフレッシュトークンを入力)
という感じで呼び出して使ってください。
証明書の使用方法
※重要
証明書をダウンロードするとzipになっているので、解凍したフォルダを任意の場所に設置して下さい
req = requests.post\
(url=url,headers=headers,data=data,\
cert=\
({証明書フォルダ内.crtファイルまでのpath},\
{証明書フォルダ内.keyファイルまでのpath})
上記のように"cert="の部分を組み込んでrequests.postすれば証明書情報を含んでpostできます。
注文検索APIの特徴と使い方
公式ページを見て頂くとわかりますが
注文APIといっても沢山種類があるので、まずは基本となる【注文検索API】について解説します。
特徴
①1回のpostで複数種類の注文番号情報をレスポンスできる(最大2000件)
②注文された商品情報等レスポンスしてくれない情報が存在する
使い方
def YahooShopOderApi1(refresh_token_base):
T_now = datetime.datetime.now()
T_before = T_now + datetime.timedelta(days=-15)
T_to = T_now.strftime('%Y%m%d%H%M%S')
T_from = T_before.strftime('%Y%m%d%H%M%S')
access_token = refresh_token(refresh_token_base)
url = "https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/orderList"
headers = {"Authorization":"Bearer " + access_token}
data = """
<Req>
<Search>
<Result>1000</Result>
<Condition>
<OrderTimeFrom>{OrderTimeFrom}</OrderTimeFrom>
<OrderTimeTo>{OrderTimeTo}</OrderTimeTo>
</Condition>
<Field>OrderId,OrderStatus,PayStatus</Field>
</Search>
<SellerId>#ストア名を入力してください</SellerId>
</Req>""".format(OrderTimeFrom=T_from,OrderTimeTo=T_to)
req = requests.post(url=url,headers=headers,data=data,cert=({証明書フォルダ内.crtファイルまでのpath},{証明書フォルダ内.keyファイルまでのpath})
※重要
①refresh_token_baseという変数には、取得したリフレッシュトークンを事前に代入して実行して下さい
②<SellerId></SellerId>の項には、自身のストア名を入力してください
ソースコードの解説
実行日から15日以内の注文全て(上限1000件)について、
【OrderId,OrderStatus,PayStatus】のレスポンスをお願いします。
という内容です。
レスポンス項目は色々ありますので、公式解説を照会しながら
<Field></Field>の項に付け足しすればレスポンス項目の増減ができます。
注文詳細APIの特徴と使い方、レスポンス形式
前項で解説した注文検索APIでは照会できない情報が存在するので、さらに詳細な注文情報を照会したい場合に本APIを使用します。
特徴
①1回のpostで1つの注文番号しか照会できない
②全ての注文情報を照会できる
使い方
def YahooShopOderApi2(refresh_token_base,OrderId):
data = """
<Req>
<Target>
<OrderId>{OrderId}</OrderId>
<Field>BillMailAddress,ItemId,Quantity</Field>
</Target>
<SellerId>#ストア名を入力してください</SellerId>
</Req>""".format(OrderId = OrderId)
url = "https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/orderInfo"
headers = {"Authorization":"Bearer " + access_token}
req = requests.post(url=url,headers=headers,data=data,cert=({証明書フォルダ内.crtファイルまでのpath},{証明書フォルダ内.keyファイルまでのpath})
※重要
①refresh_token_baseという変数には、取得したリフレッシュトークンを事前に代入して実行して下さい
②OrderIdという変数には、参照したい注文番号を代入して下さい
③<SellerId></SellerId>の項には、自身のストア名を入力してください
ソースコードの解説
指定した注文番号の【顧客メールアドレス、注文された商品管理番号と数量】をレスポンスして下さい
という内容です。
レスポンス項目は色々ありますので、公式解説を照会しながら
<Field></Field>の項に付け足しすればレスポンス項目の増減ができます。
レスポンス形式
<OrderInfo>
<Item>
<ItemId><![CDATA[item-n77]]></ItemId>
<Quantity>2</Quantity>
</Item>
<Item>
<ItemId><![CDATA[item-p09]]></ItemId>
<Quantity>1</Quantity>
</Item>
</OrderInfo>
ここが他モール間で差異が大きい部分なのですが
1つの注文番号に対して2種類以上の商品が注文されている場合、どのように表現するかという部分に焦点をあてると色々なモールのAPI仕様が早く理解できるようになります。
ヤフーショッピングの特徴としては、上記【レスポンスXML】のように
注文された商品種類数だけ<OrderInfo>タグ内に<Item>タグを発行することで複数種類の注文商品を表現してます。
au payマーケット
事前準備
wow!managerより、
各種お申込み >> API利用申請
から申請し、APIキーを取得して下さい
※APIキーの有効期限は3か月なので3か月おきに再発行する流れになります
注文API(受注API)の使用方法
受注情報一括取得APIの特徴と使い方、レスポンス形式
特徴
①1回のgetで複数種類の注文番号情報をレスポンスできる(最大1000件)
②注文された情報全てをレスポンスしてくれる
使い方
def auOrderApi1(au_api_key):
shopId = #ストアに割り振られている会員番号を入力してください
T_now = datetime.datetime.now()
T_before = T_now + datetime.timedelta(days=-30)
endDate = T_now.strftime('%Y%m%d')
startDate = T_before.strftime('%Y%m%d')
requestURL = "https://api.manager.wowma.jp/wmshopapi/searchTradeInfoListProc"
params = {"shopId":shopid,\
"totalCount":100,\
"startDate":startDate,\
"endDate":endDate}
headers = {"Content-type": "application/x-www-form-urlencoded",\
"Authorization": "Bearer " + au_api_key}
req = requests.get(url=requestURL,headers=headers,params=params)
※重要
①変数【au_api_key】には、取得したAPIキーを事前に代入して下さい
②【shopId】には、ストアに割り振られている会員番号を入力して組み込んでください
ソースコードの解説
本日から30日以内の注文(上限100件)について、全注文の情報をレスポンスして下さい
という意味合いになります。
特徴的な部分として、該当する注文情報を参照可能な155項目の注文情報全てレスポンスします。
※公式ドキュメントは非公開ですので、wowマネージャーから取得して下さい
レスポンス形式
<orderInfo>
<detail>
<itemCode><![CDATA[item-n77]]></itemCode>
<unit>2</unit>
</detail>
<detail>
<itemCode><![CDATA[item-p09]]></itemCode>
<unit>1</unit>
</detail>
</orderInfo>
au payマーケットの特徴としては、上記【レスポンスXML】のように
注文された商品種類数だけ<orderInfo>タグ内に<detail>タグを発行することで複数種類の注文商品を表現してます。また、注文情報を一括取得できるAPIのみで必要な受注情報全てが取得可能です。
Qoo10
事前準備
APIキーの発行
上記、公式ソースを参照してQSMよりAPIキー発行申請をするとAPIキーを貰えます。
※APIキー申請から発効までに数日かかります
SAKの発行
公式ドキュメントは、こちらを参照してください。
def SAK(USER_ID,PASS,API_KEY):
url = "https://api.qoo10.jp/GMKT.INC.Front.QAPIService/ebayjapan.qapi/CertificationAPI.CreateCertificationKey"
headers = {"Content-Type":"application/x-www-form-urlencoded","Content-Length":"length","GiosisCertificationKey":API_KEY,"QAPIVersion":"1.0"}
params = {"returnType":"text/xml","user_id":USER_ID,"pwd":PASS}
req = requests.post(url=url,headers=headers,data=params)
print(req.text)
USER_ID = #QSMのログインID
PASS = #QSMのログインPASS
API_KEY = #事前に発行したAPIキー
SAK(USER_ID,PASS,API_KEY)
上記をpythonで実行すれば、下記のようにレスポンスされるので
<ResultObject>タグ内の情報がSAKになります。
APIキーとSAKについて
APIキー:SAKを発行するのに必要。期限は明記されていない
SAK:APIにリクエストするのに必要。期限は発行から1年間
注文API(配送API)の使用方法
ShippingBasic.GetShippingInfo_v2の特徴と使い方、レスポンス形式
特徴
①1回のリクエストで複数種類の注文番号情報をレスポンスできる(件数上限なし)
②注文された情報全てをレスポンスしてくれる
③ステータス管理において、ヤフーショッピングでいうところの注文ステータス・入金ステータス・出荷ステータスを全て合わせた"ShippingStat"という概念で管理している
※テスト注文を通して私の理解したところでは、
1:未入金・出荷不可
2:入金済・出荷可
4:出荷済
と解釈してシステム化しております。
使い方
def Qoo10OrderApi(Qoo10_SAK):
T_now = datetime.datetime.now()
T_before = T_now + datetime.timedelta(days=-30)
endDate = T_now.strftime('%Y%m%d')
startDate = T_before.strftime('%Y%m%d')
requestURL = "https://api.qoo10.jp/GMKT.INC.Front.QAPIService/ebayjapan.qapi"
params = {"v":"1.0",\
"returnType":"xml",\
"ShippingStat":"2",\
"method":"ShippingBasic.GetShippingInfo_v2",\
"key":Qoo10_SAK,\
"search_Sdate":startDate,\
"search_Edate":endDate}
req = requests.get(url=requestURL,params=params)
※重要
変数【Qoo10_SAK】には事前に取得したSAKを代入して関数実行して下さい
ソースコードの解説
本日から30日以内の未出荷、かつ出荷可能な注文("ShippingStat":"2")全ての情報をレスポンスして下さい
という内容になります。
検索条件は、"ShippingStat"・"search_Sdate"・"search_Edate"の内容を変更すれば良いので、公式ソースを読みながら変更してみてください。
レスポンス形式
<ShippingInfo>
<packNo>0</packNo>
<orderNo>0</orderNo>
<sellerItemCode>co-1</sellerItemCode>
<orderQty>1</orderQty>
</ShippingInfo>
<ShippingInfo>
<packNo>0</packNo>
<orderNo>1</orderNo>
<sellerItemCode>co-2</sellerItemCode>
<orderQty>2</orderQty>
</ShippingInfo>
Qoo10の特徴としては、上記【レスポンスXML】のように
注文された商品種類数だけ<shippingInfo>タグを発行することで複数種類の注文商品を表現してます。
つまるところ、Qoo10での注文情報出力は”受注した商品種類単位"で出力している特徴があります。
※<packNo>タグ情報が同じであれば同一注文という意味になります。
※ヤフーショッピング、au payマーケットは"受注した注文数単位”で出力してます。
また、注文情報を一括取得できるAPIのみで必要な受注情報全てが取得可能です。