spill_create_ip = $value; } /** * @param int $money * @param string $orderNo * @param string $openId * @return Result * @throws */ public function recharge(int $money, string $orderNo, string $openId = ''): Result { if ($money < 0) { return new Result(code: 500, message: '充值金额不能小于0.'); } $this->money = $money; $this->orderNo = $orderNo; $this->data['openid'] = $openId; $client = new Client('qpay.qq.com', 443, true); $client->withHeader(['Content-Type' => 'application/xml']); $client->withBody($this->builder()); $proxyHost = $this->getConfig()->getProxyHost(); $proxyPort = $this->getConfig()->getProxyPort(); if (!empty($proxyHost) && $proxyPort > 0) { $client->withProxyHost($proxyHost)->withProxyPort($proxyPort); } $client->post($this->uniformer); $client->close(); if (!in_array($client->getStatusCode(), [101, 200, 201])) { return new Result(code: 505, message: $client->getBody()); } $data = Help::toArray($client->getBody()); if (isset($data['return_code']) && $data['return_code'] != 'SUCCESS') { return new Result(code: 503, message: $data['return_msg']); } if ($data['result_code'] != 'SUCCESS') { return new Result(code: 504, message: $data['err_code_des']); } return new Result(code: 0, data: $this->reception($data['prepayid'])); } /** * @param string $prepay_id * @return string */ public function reception(string $prepay_id): string { return Help::sign([ 'signType' => $this->config->getSignType(), 'package' => 'prepay_id=' . $prepay_id, 'nonceStr' => Help::random(32), 'timestamp' => time() ], $this->getConfig()->getKey(), $this->getConfig()->getSignType()); } /** * @return string */ protected function builder(): string { $data = [ 'appid' => $this->config->getAppid(), 'mch_id' => $this->config->getMchId(), 'nonce_str' => Help::random(32), 'body' => $this->config->getBody(), 'out_trade_no' => $this->orderNo, 'total_fee' => $this->money, 'spbill_create_ip' => $this->spill_create_ip, 'notify_url' => $this->config->getNotifyUrl(), 'trade_type' => $this->config->getTradeType(), ]; $this->data = array_merge($data, $this->data); $key = $this->config->getKey(); $sign_type = $this->config->getSignType(); $this->data['sign_type'] = $this->config->getSignType(); $this->data['sign'] = Help::sign($this->data, $key, $sign_type); return Help::toXml($this->data); } }