HitoHana(ひとはな)の舞台裏

HitoHana(ひとはな)運営の舞台裏をご紹介いたします!

RMSのAPIをRubyで実装したい 1/3

発端

新人の田中です。HitoHanaは、楽天でもお店を出してます!
で、本家のECサイトと楽天の店舗とのデータのやりとりを手軽にやりたいってことで、RMS(Rakuten Marchant Service)のWEBAPIサービスを利用してみようってことになりました。
この記事では3回に分けてRMSの受注APIをRailsアプリケーションに導入した事例を紹介します。

イチから実装してみることに

APIサービスの利用は決まったんですが、Rubyで実装されてる参考ソースがなかなか見つからず、本家もJavaしか書いてないんでイチから実装してみることにしました。

完成形のイメージ

新人の僕がいきなり実装するとごっちゃごちゃになっちゃうので、まずは完成形をイメージします。
外部のシステム(RMS)と自社システム(HitoHana)をスムーズにつなげられるように緩衝材(Proxy)を用意することにしました。

  1. モデル層:HitoHanaのRailsアプリケーションのモデルです。基本ここはさわらない感じにしたい。

  2. サービス層:HitoHanaとRMSのAPI(ライブラリ層)をつなぐProxyです。HitoHanaアプリのモデルをこのProxyに渡してRMSのAPIをコントロールします。

  3. ライブラリ層:RMSのWEBAPIをRubyで使うためのモジュールです。

でもまずはとりあえずつなげよう

完成形のイメージはつくってみたけど、でもそもそもRMSのAPIを呼び出せないとお話にならないので、完成形のイメージはいったんほっといて、単純に楽天の注文の情報だけを取得するコードを書いてみます。
RMSの受注APIはSoapを使用しているのでSoap通信のgemとしてSavonを使いました。

github.com

require 'base64'
require 'savon'

# 初期設定
service_secret = 'WEB API契約時に配布されるサービスシークレット'
license_key    = 'WEB API契約時に配布されるライセンスキー(有効期限付き)'
shop_url       = '楽天の店舗URL'

# 受注APIのうち、試しにgetOrderを使うことにした
operation = :get_order
message = {
  # 認証系パラメタ
  # user_nameはタグとしては必須だが、入力不要らしい
  arg0: {
    auth_key: "ESA #{Base64.strict_encode64(service_secret + ':' + license_key)}",
    shop_url: shop_url,
    user_name: 'hitohana',
  },
  # 業務系パラメタ
  arg1: {
    is_order_number_only_flag: false,
    order_number: ['楽天の注文番号(やたら長い)'],
  },
}

# Savon client でRMSのAPIを呼び出す
wsdl = 'https://api.rms.rakuten.co.jp/es/1.0/order/ws?WSDL'
client = Savon.client(wsdl: wsdl)

# Debug用コード リクエストのxmlを確認できる
# client.operation(operation).build(message: message).pretty

response = client.call(operation, message: message)
response_body = response.body["#{operation}_response".to_sym][:return]

結果は以下のような感じ

{
    error_code: 'N00-000',
    message: '正常終了',
    order_model: '注文情報のHashインスタンス'
}

うまくいきました。
RubyでRMSのWEB APIを使用できるようになったので次回からは構造的にアプリケーションを作っていきます。
第2回はライブラリ層を実装していく予定です。

おわりに

HitoHana(ひとはな)では、仕事が大好きで個性的なエンジニアを大募集しています!

www.wantedly.com