Completed
Push — master ( 5477de...06addb )
by Carlos
03:04
created

API::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 4
ccs 3
cts 3
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
/*
4
 * This file is part of the overtrue/wechat.
5
 *
6
 * (c) overtrue <[email protected]>
7
 *
8
 * This source file is subject to the MIT license that is bundled
9
 * with this source code in the file LICENSE.
10
 */
11
12
/**
13
 * API.php.
14
 *
15
 * @author    tianyong90 <[email protected]>
16
 * @copyright 2015 overtrue <[email protected]>
17
 *
18
 * @link      https://github.com/overtrue
19
 * @link      http://overtrue.me
20
 */
21
namespace EasyWeChat\Payment\LuckyMoney;
22
23
use EasyWeChat\Core\AbstractAPI;
24
use EasyWeChat\Payment\Merchant;
25
use EasyWeChat\Support\Collection;
26
use EasyWeChat\Support\XML;
27
use Psr\Http\Message\ResponseInterface;
28
29
/**
30
 * Class API.
31
 */
32
class API extends AbstractAPI
33
{
34
    /**
35
     * Merchant instance.
36
     *
37
     * @var Merchant
38
     */
39
    protected $merchant;
40
41
    // api
42
    const API_SEND = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
43
    const API_SEND_GROUP = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack';
44
    const API_QUERY = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo';
45
    const API_PREPARE = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder';
46
47
    // LuckyMoney type
48
    const TYPE_NORMAL = 'NORMAL';
49
    const TYPE_GROUP = 'GROUP';
50
51
    // Risk control type.
52
    const RISK_NORMAL = 'NORMAL';
53
    const RISK_IGN_FREQ_LMT = 'IGN_FREQ_LMT';
54
    const RISK_IGN_DAY_LMT = 'IGN_DAY_LMT';
55
    const RISK_IGN_FREQ_DAY_LMT = 'IGN_FREQ_DAY_LMT';
56
57
    /**
58
     * API constructor.
59
     *
60
     * @param \EasyWeChat\Payment\Merchant $merchant
61
     */
62 7
    public function __construct(Merchant $merchant)
63
    {
64 7
        $this->merchant = $merchant;
65 7
    }
66
67
    /**
68
     * Prepare luckymoney.
69
     *
70
     * @param array $params
71
     *
72
     * @return \EasyWeChat\Support\Collection
73
     */
74 1
    public function prepare(array $params)
75
    {
76 1
        $params['wxappid'] = $this->merchant->app_id;
77
78
        // XXX: PLEASE DON'T CHANGE THE FOLLOWING LINES.
79 1
        $params['auth_mchid'] = '1000052601';
80 1
        $params['auth_appid'] = 'wxbf42bd79c4391863';
81
82 1
        $params['amt_type'] = 'ALL_RAND';
83
84 1
        return $this->request(self::API_PREPARE, $params);
85
    }
86
87
    /**
88
     * Query luckymoney.
89
     *
90
     * @param string $mchBillNo
91
     *
92
     * @return \EasyWeChat\Support\Collection
93
     */
94 1
    public function query($mchBillNo)
95
    {
96
        $params = [
97 1
            'appid' => $this->merchant->app_id,
98 1
            'mch_billno' => $mchBillNo,
99 1
            'bill_type' => 'MCHT',
100 1
        ];
101
102 1
        return $this->request(self::API_QUERY, $params);
103
    }
104
105
    /**
106
     * Send LuckyMoney.
107
     *
108
     * @param array  $params
109
     * @param string $type
110
     *
111
     * @return \EasyWeChat\Support\Collection
112
     */
113 3
    public function send(array $params, $type = self::TYPE_NORMAL)
114
    {
115 3
        $api = ($type === self::TYPE_NORMAL) ? self::API_SEND : self::API_SEND_GROUP;
116
117 3
        $params['wxappid'] = $this->merchant->app_id;
118
        //如果类型为分裂红则去掉client_ip参数,否则签名会出错
119 3
        if ($type == self::TYPE_GROUP) {
120 2
            unset($params['client_ip']);
121 2
        }
122 3
        return $this->request($api, $params);
123
    }
124
125
    /**
126
     * Send normal LuckyMoney.
127
     *
128
     * @param array $params
129
     *
130
     * @return \EasyWeChat\Support\Collection
131
     */
132 1
    public function sendNormal($params)
133
    {
134 1
        $params['total_num'] = 1;
135 1
        $params['client_ip'] = !empty($params['client_ip']) ? $params['client_ip'] : getenv('SERVER_ADDR');
136
137 1
        return $this->send($params, self::TYPE_NORMAL);
138
    }
139
140
    /**
141
     * Send group luckymoney.
142
     *
143
     * @param array $params
144
     *
145
     * @return \EasyWeChat\Support\Collection
146
     */
147 1
    public function sendGroup($params)
148
    {
149 1
        $params['amt_type'] = 'ALL_RAND';
150
151 1
        return $this->send($params, self::TYPE_GROUP);
152
    }
153
154
    /**
155
     * Merchant setter.
156
     *
157
     * @param Merchant $merchant
158
     *
159
     * @return $this
160
     */
161 1
    public function setMerchant(Merchant $merchant)
162
    {
163 1
        $this->merchant = $merchant;
164 1
    }
165
166
    /**
167
     * Merchant getter.
168
     *
169
     * @return Merchant
170
     */
171 1
    public function getMerchant()
172
    {
173 1
        return $this->merchant;
174
    }
175
176
    /**
177
     * Make a API request.
178
     *
179
     * @param string $api
180
     * @param array  $params
181
     * @param string $method
182
     *
183
     * @return \EasyWeChat\Support\Collection
184
     */
185 5 View Code Duplication
    protected function request($api, array $params, $method = 'post')
186
    {
187 5
        $params = array_filter($params);
188 5
        $params['mch_id'] = $this->merchant->merchant_id;
189 5
        $params['nonce_str'] = uniqid();
190 5
        $params['sign'] = \EasyWeChat\Payment\generate_sign($params, $this->merchant->key, 'md5');
191
192
        $options = [
193 5
            'body' => XML::build($params),
194 5
            'cert' => $this->merchant->get('cert_path'),
195 5
            'ssl_key' => $this->merchant->get('key_path'),
196 5
        ];
197
198 5
        return $this->parseResponse($this->getHttp()->request($api, $method, $options));
199
    }
200
201
    /**
202
     * Parse Response XML to array.
203
     *
204
     * @param \Psr\Http\Message\ResponseInterface|string $response
205
     *
206
     * @return \EasyWeChat\Support\Collection
207
     */
208 5
    protected function parseResponse($response)
209
    {
210 5
        if ($response instanceof ResponseInterface) {
211
            $response = $response->getBody();
212
        }
213
214 5
        return new Collection((array) XML::parse($response));
215
    }
216
}
217