Completed
Push — master ( 030474...efc864 )
by Vuong
02:11
created

RequestData::rules()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 2
cts 2
cp 1
rs 9.9
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 1
1
<?php
2
/**
3
 * @link https://github.com/yiiviet/yii2-payment
4
 * @copyright Copyright (c) 2017 Yii Viet
5
 * @license [New BSD License](http://www.opensource.org/licenses/bsd-license.php)
6
 */
7
8
namespace yiiviet\payment\momo;
9
10
use yii\base\NotSupportedException;
11
use yii\behaviors\AttributeTypecastBehavior;
12
13
use vxm\gatewayclients\RequestData as BaseRequestData;
14
15
/**
16
 * Lớp RequestData cung cấp dữ liệu đã được kiểm tra tính trọn vẹn khi tạo [[request()]] ở [[PaymentGateway]].
17
 *
18
 * @method PaymentClient getClient() đối tượng client đã dùng để thực thi request.
19
 *
20
 * @property PaymentClient $client đối tượng client đã dùng để thực thi request.
21
 *
22
 * @author Vuong Minh <[email protected]>
23
 * @since 1.0.3
24
 */
25
class RequestData extends BaseRequestData
26
{
27
    /**
28
     * @inheritdoc
29
     */
30 8
    public function behaviors()
31
    {
32
        $attributeTypes = [
33 8
            'orderId' => 'string'
34
        ];
35
36 8
        if (in_array($this->command, [PaymentGateway::RC_PURCHASE, PaymentGateway::RC_QUERY_REFUND], true)) {
37 6
            $attributeTypes['amount'] = 'string';
38
        }
39
40
        return [
41 8
            'typeCast' => [
42
                'class' => AttributeTypecastBehavior::class,
43 8
                'attributeTypes' => $attributeTypes
44
            ]
45
        ];
46
    }
47
48
    /**
49
     * @inheritdoc
50
     */
51 8
    public function rules()
52
    {
53
        return [
54 8
            [['amount'], 'required', 'on' => [PaymentGateway::RC_REFUND, PaymentGateway::RC_PURCHASE]],
55
            [['returnUrl', 'notifyUrl'], 'required', 'on' => PaymentGateway::RC_PURCHASE],
56
            [['transId'], 'required', 'on' => PaymentGateway::RC_REFUND],
57
            [['partnerCode', 'accessKey', 'requestId', 'orderId', 'signature', 'requestType'], 'required', 'on' => [
58
                PaymentGateway::RC_PURCHASE, PaymentGateway::RC_QUERY_DR, PaymentGateway::RC_REFUND, PaymentGateway::RC_QUERY_REFUND
59
            ]],
60
        ];
61
    }
62
63
    /**
64
     * @inheritdoc
65
     * @throws NotSupportedException
66
     */
67 8
    protected function ensureAttributes(array &$attributes)
68
    {
69 8
        parent::ensureAttributes($attributes);
70 8
        $client = $this->getClient();
71 8
        $command = $this->getCommand();
72 8
        $attributes['partnerCode'] = $client->partnerCode;
73 8
        $attributes['accessKey'] = $client->accessKey;
74
75 8
        if ($command === PaymentGateway::RC_PURCHASE) {
76 5
            $attributes['orderInfo'] = $attributes['orderInfo'] ?? '';
77 5
            $attributes['extraData'] = $attributes['extraData'] ?? '';
78
        }
79
80 8
        $attributes['signature'] = $this->getSignature($attributes);
81 8
        $attributes['requestType'] = $this->getRequestType();
82 8
    }
83
84
    /**
85
     * Phương thức hổ trợ lấy `requestType` tương ứng với [[getCommand()]] khi gửi dữ liệu đến MOMO.
86
     *
87
     * @return string `requestType` gửi đến MOMO
88
     * @throws NotSupportedException
89
     */
90 8
    protected function getRequestType(): string
91
    {
92 8
        switch ($command = $this->getCommand()) {
93 8
            case PaymentGateway::RC_PURCHASE:
94 5
                return 'captureMoMoWallet';
95 6
            case PaymentGateway::RC_QUERY_DR:
96 2
                return 'transactionStatus';
97 4
            case PaymentGateway::RC_REFUND:
98 2
                return 'refundMoMoWallet';
99 2
            case PaymentGateway::RC_QUERY_REFUND:
100 2
                return 'refundStatus';
101
            default:
102
                throw new NotSupportedException("Not supported command: `$command`");
103
        }
104
    }
105
106
    /**
107
     * Phương thức hồ trợ ký dữ liệu gửi đến MOMO.
108
     *
109
     * @param array $attributes mảng chứa các thông tin dùng để tạo chữ ký.
110
     * @return string chữ ký dữ liệu.
111
     * @throws NotSupportedException
112
     */
113 8
    protected function getSignature(array $attributes): string
114
    {
115 8
        switch ($command = $this->getCommand()) {
116 8
            case PaymentGateway::RC_PURCHASE:
117
                $dataSign = [
118 5
                    'partnerCode' => $attributes['partnerCode'],
119 5
                    'accessKey' => $attributes['accessKey'],
120 5
                    'requestId' => $attributes['requestId'],
121 5
                    'amount' => $attributes['amount'],
122 5
                    'orderId' => $attributes['orderId'],
123 5
                    'orderInfo' => $attributes['orderInfo'],
124 5
                    'returnUrl' => $attributes['returnUrl'],
125 5
                    'notifyUrl' => $attributes['notifyUrl'],
126 5
                    'extraData' => $attributes['extraData'],
127
                ];
128 5
                break;
129 6
            case PaymentGateway::RC_QUERY_DR:
130 4
            case PaymentGateway::RC_QUERY_REFUND:
131
                $dataSign = [
132 4
                    'partnerCode' => $attributes['partnerCode'],
133 4
                    'accessKey' => $attributes['accessKey'],
134 4
                    'requestId' => $attributes['requestId'],
135 4
                    'orderId' => $attributes['orderId'],
136 4
                    'requestType' => $this->getRequestType()
137
                ];
138 4
                break;
139 2
            case PaymentGateway::RC_REFUND:
140
                $dataSign = [
141 2
                    'partnerCode' => $attributes['partnerCode'],
142 2
                    'accessKey' => $attributes['accessKey'],
143 2
                    'requestId' => $attributes['requestId'],
144 2
                    'amount' => $attributes['amount'],
145 2
                    'orderId' => $attributes['orderId'],
146 2
                    'transId' => $attributes['transId'],
147 2
                    'requestType' => $this->getRequestType()
148
                ];
149 2
                break;
150
            default:
151
                throw new NotSupportedException("Not supported command: `$command`");
152
        }
153
154 8
        $dataSign = urldecode(http_build_query($dataSign));
155 8
        return $this->getClient()->signature($dataSign);
156
    }
157
}
158