バリューコマースのAPIを使って成果が発生した場合に通知する。

#やりたいこと
アフィリエイトのバリューコマースの成果を確認するには、WEB画面にログインしてレポート画面を参照するのが一般的。

出来上がって安定したサイトでは週一などで発生数に変化があるか見るだけで良いが作り始めのサイトだとどのページで成果が発生しているかやチームのモチベーション上げるために1時間に一回くらいで成果を取得したい。A8で蜂🐝が飛ぶような奴ですね。

この記事ではバリューコマースのAPIを使って成果レポートを取得する所までを実装します。

#APIのリファレンス
「広告主向けAPI」「アフィリエイトサイト向けAPI」の2種類がある。
https://www.valuecommerce.ne.jp/feature/webservice.html

アフィリエイトサイト向けにはレポートAPIとウェブサービスAPIが用意されている。今回はレポートAPIの「トークン取得API」と「注文レポートAPIリファレンス」を使用する。

#API認証キーの取得
管理画面から発行する。詳細は割愛。

#トークン取得API
このAPIで取得できるトークンの有効期限は30分。期限切れの場合「invalid_token」が返ってくるので再取得が必要。取得制限は30分間以内に9000回以上の場合30分間ロック。普通の使い方ではひっかからないでしょう。

エラー表示とかは各自やっていただくとしてRubyでトークンを取得するコード。

ハマったのはマニュアルにはリクエストヘッダで「Authorization: Bearer [署名]」を指定する、とあるのだがRubyでは"Authorization" => "Bearer 署名文字列"と指定する必要がある所。失敗すると401になる。

```
# バリューコマースのAPIからトークンを取得する
# manual https://www.valuecommerce.ne.jp/feature/webservice.html

require 'open-uri'
require 'base64'
require 'json'

CLIENT_KEY = "hoge"
CLIENT_SECRET = "huga"
token = nil

bearer = Base64.strict_encode64("#{CLIENT_KEY}|#{CLIENT_SECRET}")

res = open("https://api.valuecommerce.com/auth/v1/affiliate/token/?grant_type=client_credentials","Authorization" => "Bearer #{bearer}")

if res.status[0] == "200"
  res = JSON.parse(res.read)
else
  puts "#{res.status[0]}, #{res.status[1]}"
end

token = res["resultSet"]["rowData"]["bearer_token"]
puts token
```

#レポート取得API
注文レポートAPIの取得制限は30分間以内に900回以上リクエストで30分間ロック。


```
# バリューコマースのAPIからレポートを取得する
# manual https://www.valuecommerce.ne.jp/feature/webservice.html

require 'open-uri'
require 'base64'
require 'json'
require "date"

CLIENT_KEY = "hoge"
CLIENT_SECRET = "fuga"
bearer = Base64.strict_encode64("#{CLIENT_KEY}|#{CLIENT_SECRET}")

def get_token(bearer)
  res = open("https://api.valuecommerce.com/auth/v1/affiliate/token/?grant_type=client_credentials","Authorization" => "Bearer #{bearer}")
  
  if res.status[0] == "200"
    res = JSON.parse(res.read)
  else
   puts "#{res.status[0]}, #{res.status[1]}"
  end
  
  return res["resultSet"]["rowData"]["bearer_token"]
end

token = get_token(bearer)
#puts token

def get_report(token)
  res = open("https://api.valuecommerce.com/report/v2/affiliate/transaction/?criteria=o&from_date=#{(Date.today-1).strftime("%Y-%m-%d")}","Authorization" => "Bearer #{token}")
  
  if res.status[0] == "200"
    res = JSON.parse(res.read)
  else
    puts "#{res.status[0]}, #{res.status[1]}"
  end
  return res
end

report = get_report(token)
puts report
```

このコードで以下のようなレスポンスが取得できるので後はよろしくやる。
#データは加工してあります。

```
{"resultSet"=>{"responseInfo"=>{"numberOfResult"=>1,
"nextOffset"=>-1,
"responseTime"=>"2018-10-19 12:56:38"},
"requestInfo"=>{"query"=>"criteria=o&from_date=2018-10-18",
"requestTime"=>"2018-10-19 12:56:37"},
"rowData"=>[{"clickDate"=>"2018-10-17 07:40:16",
"orderDate"=>"2018-10-18 07:09:57",
"approvalDate"=>nil,
"transactionOid"=>1111111111,
"merchantName"=>"広告主",
"merchantOid"=>22222222,
"programName"=>"広告プログラム名",
"programOid"=>3333333,
"vcptn"=>nil,
"itemQuantity"=>1,
"itemPriceTotal"=>10000000,
"affilPaymentNet"=>100000,
"affilPaymentTax"=>111,
"affilPayment"=>3333,
"approvalStatus"=>"P",
"approvalDeadline"=>58,
"referrer"=>"https://hogehuga/",
"device"=>"PC",
"updDate"=>"2018-10-18 07:22:07"}]}}

```