Completed
Push — master ( da1893...32f9a3 )
by recca
01:40
created

src/EcpayLogisticsApi.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace PayumTW\Ecpay;
4
5
use Http\Message\MessageFactory;
6
use Payum\Core\HttpClientInterface;
7
use Device;
8
use Distance;
9
use Temperature;
10
use IsCollection;
11
use LogisticsType;
12
use Specification;
13
use EcpayLogistics;
14
use LogisticsSubType;
15
use ScheduledPickupTime;
16
17
class EcpayLogisticsApi extends Api
18
{
19
    /**
20
     * $client.
21
     *
22
     * @var \Payum\Core\HttpClientInterface
23
     */
24
    protected $client;
25
26
    /**
27
     * MessageFactory.
28
     *
29
     * @var MessageFactory
30
     */
31
    protected $messageFactory;
32
33
    /**
34
     * $options.
35
     *
36
     * @var array
37
     */
38
    protected $options = [];
39
40
    /**
41
     * $sdk.
42
     *
43
     * @var \PayumTW\Ecpay\Bridge\Ecpay\EcpayLogistics
44
     */
45
    protected $sdk;
46
47
    /**
48
     * @var array
49
     */
50
    protected $code = [];
51
52
    /**
53
     * @param array $options
54
     * @param \Payum\Core\HttpClientInterface $client
55
     * @param MessageFactory $messageFactory
56
     * @param \PayumTW\Ecpay\Bridge\Ecpay\EcpayLogistics $sdk
57
     *
58
     * @throws \Payum\Core\Exception\InvalidArgumentException if an option is invalid
59
     */
60 3 View Code Duplication
    public function __construct(array $options, HttpClientInterface $client, MessageFactory $messageFactory, EcpayLogistics $sdk = null)
61
    {
62 3
        $this->options = $options;
63 3
        $this->client = $client;
64 3
        $this->messageFactory = $messageFactory;
65 3
        $this->sdk = $sdk ?: new EcpayLogistics();
0 ignored issues
show
Documentation Bug introduced by
$sdk ?: new \EcpayLogistics() is of type object<ECPayLogistics>, but the property $sdk was declared to be of type object<PayumTW\Ecpay\Bridge\Ecpay\EcpayLogistics>. Are you sure that you always receive this specific sub-class here, or does it make sense to add an instanceof check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a given class or a super-class is assigned to a property that is type hinted more strictly.

Either this assignment is in error or an instanceof check should be added for that assignment.

class Alien {}

class Dalek extends Alien {}

class Plot
{
    /** @var  Dalek */
    public $villain;
}

$alien = new Alien();
$plot = new Plot();
if ($alien instanceof Dalek) {
    $plot->villain = $alien;
}
Loading history...
66 3
        $this->sdk->HashKey = $this->options['HashKey'];
67 3
        $this->sdk->HashIV = $this->options['HashIV'];
68 3
        $this->sdk->Send['MerchantID'] = $this->options['MerchantID'];
69 3
    }
70
71
    /**
72
     * getApiEndpoint.
73
     *
74
     * @return string
75
     */
76
    public function getApiEndpoint()
77
    {
78
        return $this->sdk->ServiceURL;
79
    }
80
81
    /**
82
     * createTransaction.
83
     *
84
     * @param array $params
85
     * @return array
86
     */
87 1
    public function createCvsMapTransaction(array $params)
88
    {
89 1
        $this->sdk->Send = array_merge($this->sdk->Send, [
90 1
            'MerchantTradeNo' => '',
91
            'LogisticsSubType' => LogisticsSubType::UNIMART,
92
            'IsCollection' => IsCollection::NO,
93 1
            'ServerReplyURL' => '',
94 1
            'ExtraData' => '',
95 1
            'Device' => $this->isMobile() ? Device::MOBILE : Device::PC,
96
        ]);
97
98 1
        $this->sdk->Send = array_replace(
99 1
            $this->sdk->Send,
100 1
            array_intersect_key($params, $this->sdk->Send)
101
        );
102
103 1
        return $this->sdk->formToArray(
104 1
            $this->sdk->CvsMap()
105
        );
106
    }
107
108
    /**
109
     * 產生托運單(宅配)/一段標(超商取貨).
110
     *
111
     * @param array $params
112
     * @return array
113
     */
114
    public function createPrintTradeTransaction(array $params)
115
    {
116
        // 參數初始化
117
        $this->sdk->Send = array_merge($this->sdk->Send, [
118
            'AllPayLogisticsID' => '',
119
            'PlatformID' => '',
120
        ]);
121
122
        $this->sdk->Send = array_replace(
123
            $this->sdk->Send,
124
            array_intersect_key($params, $this->sdk->Send)
125
        );
126
127
        return $this->sdk->formToArray(
128
            $this->sdk->PrintTradeDoc()
129
        );
130
    }
131
132
    /**
133
     * 列印繳款單(統一超商C2C).
134
     *
135
     * @param array $params
136
     * @return array
137
     */
138 View Code Duplication
    public function createPrintUnimartC2CBillTransaction(array $params)
139
    {
140
        // 參數初始化
141
        $this->sdk->Send = array_merge($this->sdk->Send, [
142
            'AllPayLogisticsID' => '',
143
            'CVSPaymentNo' => '',
144
            'CVSValidationNo' => '',
145
            'PlatformID' => '',
146
        ]);
147
148
        $this->sdk->Send = array_replace(
149
            $this->sdk->Send,
150
            array_intersect_key($params, $this->sdk->Send)
151
        );
152
153
        return $this->sdk->formToArray(
154
            $this->sdk->PrintUnimartC2CBill()
155
        );
156
    }
157
158
    /**
159
     * 全家列印小白單(全家超商C2C).
160
     *
161
     * @param array $params
162
     * @return array
163
     */
164 View Code Duplication
    public function createPrintFamilyC2CBillTransaction(array $params)
165
    {
166
        // 參數初始化
167
        $this->sdk->Send = array_merge($this->sdk->Send, [
168
            'AllPayLogisticsID' => '',
169
            'CVSPaymentNo' => '',
170
            'PlatformID' => '',
171
        ]);
172
173
        $this->sdk->Send = array_replace(
174
            $this->sdk->Send,
175
            array_intersect_key($params, $this->sdk->Send)
176
        );
177
178
        return $this->sdk->formToArray(
179
            $this->sdk->PrintUnimartC2CBill()
180
        );
181
    }
182
183
    /**
184
     * createTransaction.
185
     *
186
     * @param array $params
187
     * @return array
188
     */
189 1
    public function createTransaction(array $params)
190
    {
191 1
        $this->sdk->Send = array_merge($this->sdk->Send, [
192 1
            'MerchantTradeNo' => '',
193 1
            'MerchantTradeDate' => date('Y/m/d H:i:s'),
194 1
            'LogisticsType' => '',
195
            'LogisticsSubType' => LogisticsSubType::UNIMART,
196 1
            'GoodsAmount' => 0,
197 1
            'CollectionAmount' => 0,
198
            'IsCollection' => IsCollection::NO,
199 1
            'GoodsName' => '',
200 1
            'SenderName' => '',
201 1
            'SenderPhone' => '',
202 1
            'SenderCellPhone' => '',
203 1
            'ReceiverName' => '',
204 1
            'ReceiverPhone' => '',
205 1
            'ReceiverCellPhone' => '',
206 1
            'ReceiverEmail' => '',
207 1
            'TradeDesc' => '',
208 1
            'ServerReplyURL' => '',
209 1
            'LogisticsC2CReplyURL' => '',
210 1
            'Remark' => '',
211 1
            'PlatformID' => '',
212
        ]);
213
214 1
        $this->sdk->SendExtend = [];
215
216 1
        $this->sdk->Send = array_replace(
217 1
            $this->sdk->Send,
218 1
            array_intersect_key($params, $this->sdk->Send)
219
        );
220
221 1
        $this->sdk->Send['GoodsAmount'] = (int) $this->sdk->Send['GoodsAmount'];
222 1
        $this->sdk->Send['CollectionAmount'] = (int) $this->sdk->Send['CollectionAmount'];
223
224 1
        if (empty($this->sdk->Send['LogisticsType']) === true) {
225
            $this->sdk->Send['LogisticsType'] = LogisticsType::CVS;
226
            switch ($this->sdk->Send['LogisticsSubType']) {
227
                case LogisticsSubType::TCAT:
228
                    $this->sdk->Send['LogisticsType'] = LogisticsType::HOME;
229
                    break;
230
            }
231
        }
232
233 1
        if ($this->sdk->Send['IsCollection'] === IsCollection::NO) {
234
            $this->sdk->Send['CollectionAmount'] = 0;
235 1
        } elseif (isset($this->sdk->Send['CollectionAmount']) === false) {
236
            $this->sdk->Send['CollectionAmount'] = (int) $this->sdk->Send['GoodsAmount'];
237
        }
238
239 1
        switch ($this->sdk->Send['LogisticsType']) {
240 1
            case LogisticsType::HOME:
241
                $this->sdk->SendExtend = array_merge($this->sdk->SendExtend, [
242
                    'SenderZipCode' => '',
243
                    'SenderAddress' => '',
244
                    'ReceiverZipCode' => '',
245
                    'ReceiverAddress' => '',
246
                    'Temperature' => '',
247
                    'Distance' => '',
248
                    'Specification' => '',
249
                    'ScheduledDeliveryTime' => '',
250
                ]);
251
                break;
252 1
            case LogisticsType::CVS:
253
                $this->sdk->SendExtend = array_merge($this->sdk->SendExtend, [
254
                    'ReceiverStoreID' => '',
255
                    'ReturnStoreID' => '',
256
                ]);
257
                break;
258
        }
259
260 1
        $this->sdk->SendExtend = array_replace(
261 1
            $this->sdk->SendExtend,
262 1
            array_intersect_key($params, $this->sdk->SendExtend)
263
        );
264
265 1
        return $this->sdk->BGCreateShippingOrder();
266
    }
267
268
    /**
269
     * refundTransaction.
270
     *
271
     * @param array $params
272
     * @return array
273
     */
274
    public function refundTransaction($params)
275
    {
276
        if ($params['LogisticsSubType'] === LogisticsSubType::TCAT) {
277
            // 宅配逆物流訂單產生
278
            $method = 'CreateHomeReturnOrder';
279
            $supportedParams = [
280
                'AllPayLogisticsID' => '',
281
                'LogisticsSubType' => '',
282
                'ServerReplyURL' => '',
283
                'SenderName' => '',
284
                'SenderPhone' => '',
285
                'SenderCellPhone' => '',
286
                'SenderZipCode' => '',
287
                'SenderAddress' => '',
288
                'ReceiverName' => '',
289
                'ReceiverPhone' => '',
290
                'ReceiverCellPhone' => '',
291
                'ReceiverZipCode' => '',
292
                'ReceiverAddress' => '',
293
                'GoodsAmount' => '',
294
                'GoodsName' => '',
295
                'Temperature' => Temperature::ROOM,
296
                'Distance' => Distance::SAME,
297
                'Specification' => Specification::CM_60,
298
                'ScheduledPickupTime' => ScheduledPickupTime::UNLIMITED,
299
                'ScheduledDeliveryTime' => '',
300
                'Remark' => '',
301
                'PlatformID' => '',
302
            ];
303
        } elseif (isset($params['LogisticsSubType']) === true) {
304
            // LogisticsSubType::FAMILY = 'FAMI'; // 全家
305
            // LogisticsSubType::UNIMART = 'UNIMART'; // 統一超商
306
            // LogisticsSubType::FAMILY_C2C = 'FAMIC2C'; // 全家店到店
307
            // LogisticsSubType::UNIMART_C2C = 'UNIMARTC2C'; // 統一超商寄貨便
308
309
            // 超商取貨逆物流訂單(全家超商B2C).
310
            $method = 'CreateFamilyB2CReturnOrder';
311
            $supportedParams = [
312
                'AllPayLogisticsID' => '',
313
                'ServerReplyURL' => '',
314
                'GoodsName' => '',
315
                'GoodsAmount' => 0,
316
                'SenderName' => '',
317
                'SenderPhone' => '',
318
                'Remark' => '',
319
                'Quantity' => '',
320
                'Cost' => '',
321
                'PlatformID' => '',
322
            ];
323
        } else {
324
            // 全家逆物流核帳(全家超商B2C).
325
            $method = 'CheckFamilyB2CLogistics';
326
            $supportedParams = [
327
                'RtnMerchantTradeNo' => '',
328
                'PlatformID' => '',
329
            ];
330
        }
331
332
        $this->sdk->Send = array_merge($this->sdk->Send, $supportedParams);
333
334
        $this->sdk->Send = array_replace(
335
            $this->sdk->Send,
336
            array_intersect_key($params, $this->sdk->Send)
337
        );
338
339
        return call_user_func_array([$this->sdk, $method]);
340
    }
341
342
    /**
343
     * cancelTransaction.
344
     *
345
     * @param array $params
346
     * @return array
347
     */
348
    public function cancelTransaction($params)
349
    {
350
        $supportedParams = [];
351
        $method = '';
352
        if (isset($params['LogisticsSubType']) === true) {
353
            // LogisticsSubType::FAMILY = 'FAMI'; // 全家
354
            // LogisticsSubType::UNIMART = 'UNIMART'; // 統一超商
355
            // LogisticsSubType::FAMILY_C2C = 'FAMIC2C'; // 全家店到店
356
            // LogisticsSubType::UNIMART_C2C = 'UNIMARTC2C'; // 統一超商寄貨便
357
358
            // 取消訂單(統一超商C2C).
359
            $method = 'CancelUnimartLogisticsOrder';
360
            $supportedParams = [
361
                'AllPayLogisticsID' => '',
362
                'CVSPaymentNo' => '',
363
                'CVSValidationNo' => '',
364
                'PlatformID' => '',
365
            ];
366
        }
367
368
        $this->sdk->Send = array_merge($this->sdk->Send, $supportedParams);
369
370
        $this->sdk->Send = array_replace(
371
            $this->sdk->Send,
372
            array_intersect_key($params, $this->sdk->Send)
373
        );
374
375
        return empty($method) === true ?
376
            [] : call_user_func_array([$this->sdk, $method]);
377
    }
378
379
    /**
380
     * getTransactionData.
381
     *
382
     * @param mixed $params
383
     * @return array
384
     */
385
    public function getTransactionData($params)
386
    {
387
        $supportedParams = [
388
            'AllPayLogisticsID' => '',
389
            'PlatformID' => '',
390
        ];
391
392
        $this->sdk->Send = array_merge($this->sdk->Send, $supportedParams);
393
394
        $this->sdk->Send = array_replace(
395
            $this->sdk->Send,
396
            array_intersect_key($params, $this->sdk->Send)
397
        );
398
399
        return $this->sdk->QueryLogisticsInfo();
400
    }
401
}
402