Api   A
last analyzed

Complexity

Total Complexity 23

Size/Duplication

Total Lines 300
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Test Coverage

Coverage 89.11%

Importance

Changes 0
Metric Value
wmc 23
lcom 1
cbo 0
dl 0
loc 300
ccs 90
cts 101
cp 0.8911
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A getApiEndpoint() 0 13 2
B createCvsMapTransaction() 0 24 1
B createTransaction() 0 84 5
B getTransactionData() 0 35 1
A verifyHash() 0 6 2
B keyMap() 0 15 5
B createXml() 0 16 6
1
<?php
2
3
namespace PayumTW\Ezship;
4
5
use Http\Message\MessageFactory;
6
use Payum\Core\HttpClientInterface;
7
8
class Api
9
{
10
    protected $keyMap = [
11
        'su_id' => 'suID',
12
        'order_id' => 'orderID',
13
        'order_status' => 'orderStatus',
14
        'order_type' => 'orderType',
15
        'order_amount' => 'orderAmount',
16
        'rv_name' => 'rvName',
17
        'rv_email' => 'rvEmail',
18
        'rv_mobile' => 'rvMobile',
19
        'st_cate' => 'stCate',
20
        'st_code' => 'stCode',
21
        'rv_addr' => 'rvAddr',
22
        'rv_zip' => 'rvZip',
23
        'rtn_url' => 'rtURL',
24
        'web_para' => 'webPara',
25
        // Product
26
        'detail' => 'Detail',
27
        'prod_item' => 'prodItem',
28
        'prod_no' => 'prodNo',
29
        'prod_name' => 'prodName',
30
        'prod_price' => 'prodPrice',
31
        'prod_qty' => 'prodQty',
32
        'prod_spec' => 'prodSpec',
33
34
        'process_id' => 'processID',
35
    ];
36
37
    /**
38
     * @var \Payum\Core\HttpClientInterface
39
     */
40
    protected $client;
41
42
    /**
43
     * @var \Http\Message\MessageFactory
44
     */
45
    protected $messageFactory;
46
47
    /**
48
     * @var array
49
     */
50
    protected $options = [];
51
52
    /**
53
     * @param array $options
54
     * @param \Payum\Core\HttpClientInterface $client
55
     * @param \Http\Message\MessageFactory $messageFactory
56
     *
57
     * @throws \Payum\Core\Exception\InvalidArgumentException if an option is invalid
58
     */
59 6
    public function __construct(array $options, HttpClientInterface $client, MessageFactory $messageFactory)
60
    {
61 6
        $this->options = $options;
62 6
        $this->client = $client;
63 6
        $this->messageFactory = $messageFactory;
64 6
    }
65
66
    /**
67
     * @return string
68
     */
69
    public function getApiEndpoint($type = 'capture')
70
    {
71
        // 網站至ezShip 程式網址:
72
        $endpoints = [
73
            'cvs' => ' https://map.ezship.com.tw/ezship_map_web.jsp',
74
            'capture' => strtolower($this->options['method']) === 'xml' ?
75
                'https://www.ezship.com.tw/emap/ezship_xml_order_api.jsp' :
76
                'https://www.ezship.com.tw/emap/ezship_request_order_api.jsp',
77
            'query' => 'https://www.ezship.com.tw/emap/ezship_request_order_status_api.jsp',
78
        ];
79
80
        return $endpoints[$type];
81
    }
82
83
    /**
84
     * createCvsMapTransaction.
85
     *
86
     * @param array $params
87
     * @return array
88
     */
89 1
    public function createCvsMapTransaction(array $params)
90
    {
91
        $supportedParams = [
92
            // varchar 100 賣家登入ezShip帳號 需開通網站對接者
93 1
            'su_id' => $this->options['su_id'],
94
            // varchar 10 處理序號或訂單編號 由開通網站自行提供的編號(KEY值)。(非 ezShip 提供)
95 1
            'process_id' => null,
96
            // varchar 3 取件門市通路代號
97 1
            'st_cate' => null,
98
            // varchar 6 取件門市代號
99 1
            'st_code' => null,
100
            // varchar 100 回傳網址路徑及程式名稱 請輸入完整網站路徑網址。如 http://yourdomain.domain/direct/program.php
101 1
            'rtn_url' => null,
102
            // varchar 100 網站所需額外判別資料 由開通網站自行提供,ezShip 將原值回傳
103 1
            'web_para' => uniqid(),
104 1
        ];
105
106 1
        $params = array_filter(array_replace(
107 1
            $supportedParams,
108 1
            array_intersect_key($params, $supportedParams)
109 1
        ));
110
111 1
        return $this->keyMap($params);
112
    }
113
114
    /**
115
     * createTransaction.
116
     *
117
     * @param array $params
118
     * @return array
119
     */
120 3
    public function createTransaction(array $params)
121
    {
122 3
        $params = $this->keyMap($params, true);
123
124 3
        $orderStatus = 'A05';
125 3
        if (empty($params['st_code']) === false) {
126 1
            $orderStatus = 'A01';
127
128 1
            $params['st_code'] = empty($params['st_cate']) === false ?
129 1
                $params['st_cate'].$params['st_code'] :
130 1
                $params['st_code'];
131 1
        }
132
133
        $supportedParams = [
134
            // varchar 100 賣家登入ezShip帳號 需開通網站對接者,取貨付款訂單須帳號於合約期間內
135 3
            'su_id' => $this->options['su_id'],
136
            // varchar 10 訂單編號
137 3
            'order_id' => null,
138
            /*
139
             * varchar 3 訂單狀態
140
             * A01 超商取貨新訂單,不需在ezShip上確認訂單,可直接印單 (回覆snID)
141
             * A02 超商取貨新訂單,需在ezShip上確認訂單,確認後才可進行印單 (預設值, 回覆snID)
142
             * A03 超商取貨新訂單,使用 輕鬆袋或迷你袋 (不回覆snID,不需在ezShip上確認訂單,需登錄編號)
143
             * A04 超商取貨新訂單,使用 輕鬆袋或迷你袋 (不回覆snID,需在ezShip上確認訂單,需登錄編號)
144
             * A05 宅配新訂單,不需在ezShip上確認訂單,可直接印單 (回覆snID,10碼數字)
145
             * A06 宅配新訂單,需在ezShip上確認訂單,確認後才可進行印單 (回覆snID,10碼數字)
146
             */
147
148 3
            'order_status' => $orderStatus,
149
            // varchar 1 訂單類別 1 取貨付款 3 取貨不付款
150 3
            'order_type' => '3',
151
            /*
152
             * 代收金額或訂單金額
153
             * 若<orderType>=1,為代收金額 10~6,000
154
             * 若<orderType>=3,為訂單金額 0~2,000
155
             */
156 3
            'order_amount' => null,
157
            /*
158
             * varchar 60 取件人姓名
159
             * 若<orderType>=1,建議為取件人身分證件上之真實姓名
160
             * 若<orderType>=3,須為取件人身分證件上之真實姓名
161
             */
162 3
            'rv_name' => null,
163
            // varchar 100 取件人電子郵件 發送取件通知信函
164 3
            'rv_email' => null,
165
            // varchar 10 取件人行動電話 發送取件通知簡訊
166 3
            'rv_mobile' => null,
167
            // varchar 9 取件門市
168
            // 通路別+門市代號 電子地圖回傳之 <stCate><stCode> orderStatus 為 A01、A02、A03、A04 時必須 ( 店到店資料 )
169 3
            'st_code' => null,
170
            // varchar 120 取件人收件地址 orderStatus 為 A05、A06 時必須 ( 宅配資料 )
171 3
            'rv_addr' => null,
172
            // varchar 10 取件人郵遞區號 orderStatus 為 A05、A06 時必須 ( 宅配資料 )
173 3
            'rv_zip' => null,
174
            // varchar 100 回傳網址路徑及程式名稱 請輸入完整網站路徑網址。如 http://yourdomain.domain/direct/program.php
175 3
            'rtn_url' => null,
176
            // varchar 100 網站所需額外判別資料 ezShip 將原值回傳,供網站判別用
177 3
            'web_para' => uniqid(),
178
            // 商品明細
179 3
            'details' => [],
180 3
        ];
181
182 3
        $params = array_filter(array_replace(
183 3
            $supportedParams,
184 3
            array_intersect_key($params, $supportedParams)
185 3
        ));
186
187 3
        $params['order_amount'] = (string) $params['order_type'] === '3' ? '0' : $params['order_amount'];
188
189 3
        $details = $params['details'];
190 3
        unset($params['details']);
191
192 3
        if (strtolower($this->options['method']) === 'xml') {
193 2
            $details = implode('', array_map(function ($detail) {
194 2
                return $this->createXml($this->keyMap(['detail' => $detail]), ['prodName', 'prodSpec']);
195 2
            }, $details));
196
197
            return [
198 2
                'web_map_xml' => '<ORDER>'.$this->createXml($this->keyMap($params), ['rvName', 'rvAddr']).$details.'</ORDER>',
199 2
            ];
200
        }
201
202 1
        return $params;
203
    }
204
205
    /**
206
     * getTransactionData.
207
     *
208
     * @param mixed $params
209
     * @return array
210
     */
211 1
    public function getTransactionData(array $params)
212
    {
213
        $supportedParams = [
214
            // varchar 100 賣家登入ezShip帳號 需開通網站對接者
215 1
            'su_id' => $this->options['su_id'],
216
            // varchar 10 ezShip店到店編號 訂單成立後,ezShip回傳給網站的店到店編號
217 1
            'sn_id' => null,
218
            //  varchar 100 回傳網址路徑及程式名稱 請輸入完整網站路徑網址。如 http://yourdomain.domain/direct/program.php
219 1
            'rtn_url' => null,
220
            // varchar 100 網站所需額外判別資料 由開通網站自行提供,ezShip 將原值回傳。
221 1
            'web_para' => uniqid(),
222
            /*
223
             * varchar 3 訂單狀態
224
             * S01 尚未寄件或尚未收到超商總公司提供的寄件訊息
225
             * S02 運往取件門市途中
226
             * S03 已送達取件門市
227
             * S04 已完成取貨
228
             * S05 退貨 (包含:已退回物流中心 / 再寄一次給取件人 / 退回給寄件人)
229
             * S06 配送異常 (包含:刪單 / 門市閉店 / 貨故)
230
             * E00 參數傳遞內容有誤或欄位短缺
231
             * E01 <su_id>帳號不存在
232
             * E02 <su_id>帳號無網站串接權限
233
             * E03 <sn_id>店到店編號有誤
234
             * E04 <su_id>帳號與<sn_id>店到店編號無法對應
235
             * E99 系統錯誤
236
             */
237 1
        ];
238
239 1
        $params = array_filter(array_replace(
240 1
            $supportedParams,
241 1
            array_intersect_key($params, $supportedParams)
242 1
        ));
243
244 1
        return $params;
245
    }
246
247
    /**
248
     * verifyHash.
249
     *
250
     * @param array $params
251
     * @param array $details
252
     * @return bool
253
     */
254
    public function verifyHash($params, $details)
255
    {
256
        $webPara = isset($params['web_para']) === true ? $params['web_para'] : $params['webPara'];
257
258
        return $webPara === $details['web_para'];
259
    }
260
261
    /**
262
     * keyMap.
263
     *
264
     * @param array $array
265
     * @param bool $flip
266
     * @return array
267
     */
268 4
    protected function keyMap($array, $flip = false)
269
    {
270 4
        $map = $flip === true ? array_flip($this->keyMap) : $this->keyMap;
271 4
        $result = [];
272 4
        foreach ($array as $key => $value) {
273 4
            $key = isset($map[$key]) === true ? $map[$key] : $key;
274 4
            if (is_array($value) === true) {
275 3
                $result[$key] = $this->keyMap($value, $flip);
276 3
            } else {
277 4
                $result[$key] = $value;
278
            }
279 4
        }
280
281 4
        return $result;
282
    }
283
284
    /**
285
     * createXml.
286
     *
287
     * @param array $array
288
     * @param array $cdataSections
289
     * @return string
290
     */
291 2
    protected function createXml($array, $cdataSections = [])
292
    {
293 2
        $xml = '';
294 2
        foreach ($array as $key => $value) {
295 2
            if (is_array($value) === true) {
296 2
                $xml .= sprintf('<%s>%s</%s>', $key, $this->createXml($value, $cdataSections), $key);
297 2
            } else {
298 2
                if (empty($value) === false && (in_array($key, $cdataSections, true) === true || (bool) preg_match('/[<>&]/', $value) === true)) {
299 2
                    $value = '<![CDATA['.$value.']]>';
300 2
                }
301 2
                $xml .= sprintf('<%s>%s</%s>', $key, $value, $key);
302
            }
303 2
        }
304
305 2
        return $xml;
306
    }
307
}
308