はじめに

guzzle/guzzle (PHP HTTP Client) を使って、スマレジ の API 実装サンプル。

もっと効率的な実装方法とかあると思うので、あくまでも一例として。

TL;DR

この記事が参考になった方
ここここからチャージや購入してくれると嬉しいです(ブログ主へのプレゼントではなく、ご自身へのチャージ)
欲しいもの / Wish list

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. 前置き
    2. セットアップ
    3. 実装サンプル
    4. 利用イメージ
  5. まとめ
  6. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ sw_vers
ProductName: macOS
ProductVersion: 11.0.1
BuildVersion: 20B50

$ php -v
PHP 7.3.22-(to be removed in future macOS) (cli) (built: Oct 30 2020 00:19:11) ( NTS )

$ composer -V
Composer version 1.10.10 2020-08-03 11:35:19

$ composer info guzzlehttp/guzzle
name : guzzlehttp/guzzle
versions : * 7.2.0

詳細

前置き

セットアップ

参考: Installation - Overview — Guzzle Documentation

Composer を使ってインストール

1
$ composer require guzzlehttp/guzzle:^7.0

実装サンプル

どう実装するかが悩ましかったけど、以下のようにした。 namespace とかは各自で定義。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<?php

use Exception;
use \GuzzleHttp;

class SmaregiAPI
{
private $client;
private $headers;
private $debug;
private $url = 'https://webapi.smaregi.jp/access/';

/**
* @param string $contract_id 契約ID
* @param string $access_token アクセストークン
* @param boolean $debug
*/
public function __construct($contract_id, $access_token, $debug = false)
{
$this->headers = [
'X-contract-id' => $contract_id,
'X-access-token' => $access_token,
'Content-Type' => 'application/x-www-form-urlencoded;charset=UTF-8',
];
$this->client = new GuzzleHttp\Client();
$this->debug = $debug ?? false;
}

/**
* リクエスト(POST)
*
* @param mixed $form_params
* @return mixed
*/
public function post($form_params)
{
$res = $this->client->post(
$this->url,
[
'headers' => $this->headers,
'form_params' => $form_params,
'debug' => $this->debug,
]
);
return json_decode((string) $res->getBody());
}

/**
* 参照系リクエスト
*
* @param string $proc_name
* @param string $table_name
* @param mixed $data
* @return mixed
*/
public function read($proc_name, $table_name, $data)
{
$data_obj = (object) $data;
$params = [
'table_name' => $table_name,
'fields' => optional($data_obj)->fields,
'conditions' => optional($data_obj)->conditions,
'order' => optional($data_obj)->order,
'limit' => optional($data_obj)->limit,
'page' => optional($data_obj)->page,
];
$form_params = [
'proc_name' => $proc_name,
'params' => json_encode($params),
];
return $this->post($form_params);
}

/**
* 更新系リクエスト
*
* @param string $proc_name
* @param string $table_name
* @param mixed $data
* @return mixed
*/
public function update($proc_name, $table_name, $data)
{
$data_obj = (object) $data;
$params = [
'proc_info' => [
'proc_division' => optional($data_obj)->proc_division,
'proc_detail_division' => optional($data_obj)->proc_detail_division,
],
'data' => [
[
'table_name' => $table_name,
'rows' => optional($data_obj)->rows,
]
],
];
$form_params = [
'proc_name' => $proc_name,
'params' => json_encode($params),
];
return $this->post($form_params);
}

/**
* 会員情報参照
*
* @param mixed $data
* @return mixed
*/
public function customer_ref($data)
{
$proc_name = 'customer_ref';
$table_name = 'Customer';
try {
return $this->read($proc_name, $table_name, $data);
} catch (Exception $e) {
\Log::error($e);
return json_decode(json_encode([
'total_count' => 0,
'result' => [],
]));
}
}

/**
* 会員情報更新
*
* @param mixed $data
* @return mixed
*/
public function customer_upd($data)
{
$proc_name = 'customer_upd';
$table_name = 'Customer';
try {
return $this->update($proc_name, $table_name, $data);
} catch (Exception $e) {
\Log::error($e);
return json_decode(json_encode([
'total_count' => 0,
'result' => [],
]));
}
}
}

利用イメージ

以下利用イメージ。会員登録をサンプルにあげているが、スマレジ管理画面で「必須」か「任意」かを設定できる項目がいくつかあり、「必須」になっている場合はパラメータ設定が必要。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php

use SmaregiAPI;

$contract_id = '1234abcd';
$access_token = '1234abcd1234abcd1234abcd1234abcd';
$api = new SmaregiAPI($contract_id, $access_token);


// ***** 新規会員登録 *****
$proc_division = 'U';
$proc_detail_division = null;
$customerCode = substr(str_shuffle(str_repeat('0123456789', 9)), 0, 9);
$row = [
'customerId' => $customerCode, // 必須(null, -1, 0 などを指定しても新規作成されないため、他会員と重複しない ID を指定)
'customerCode' => $customerCode, // 必須
'customerNo' => $customerCode, // 任意
'lastName' => '試験', // 必須
'firstName' => '太郎', // 必須
'sex' => 0, // 必須(0: 不明, 1: 男性, 2: 女性)
'phoneNumber' => '09012345678', // 任意
'mobileNumber' => '09012345678', // 任意
'mailAddress' => 'test.taro@example.com', // 任意
'birthDate' => '2000-01-02', // 任意
'entryDate' => today()->format('Y-m-d'), // 任意
'mailReceiveFlag' => 0, // 任意
'status' => 0, // 必須
'storeId' => null, // 任意(null だと全店舗。店舗指定が必要であれば入力)
];
$rows = [
$row,
];
$data = compact([
'proc_division',
'proc_detail_division',
'rows',
]);
$update_res = $api->customer_upd($data);


// ***** 会員情報参照 *****
$conditions = [
[
'customerCode' => $customerCode,
],
];
$data = compact(['conditions']);
$customers = $api->customer_ref($data);
$customer = $customers->result[0];
echo "id: {$customer->customerId}\n";
echo "name: {$customer->lastName} {$customer->firstName}\n";

まとめ

参考文献

関連記事

この記事が参考になった方
ここここからチャージや購入してくれると嬉しいです(ブログ主へのプレゼントではなく、ご自身へのチャージ)
欲しいもの / Wish list