<?php
/*
* This file is part of the overtrue/wechat.
*
* (c) overtrue <i@overtrue.me>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
/**
* API.php.
*
* @author AC <alexever@gmail.com>
* @copyright 2015 overtrue <i@overtrue.me>
*
* @see https://github.com/overtrue
* @see http://overtrue.me
*/
namespace EasyWeChat\Payment\MerchantPay;
use EasyWeChat\Core\AbstractAPI;
use EasyWeChat\Payment\Merchant;
use EasyWeChat\Support\Collection;
use EasyWeChat\Support\XML;
use Psr\Http\Message\ResponseInterface;
class API extends AbstractAPI
{
protected $merchant;
const API_SEND = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
const API_QUERY = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo';
public function __construct(Merchant $merchant)
{
$this->merchant = $merchant;
}
public function query($mchBillNo)
{
$params = [
'appid' => $this->merchant->app_id,
'mch_id' => $this->merchant->merchant_id,
'partner_trade_no' => $mchBillNo,
];
return $this->request(self::API_QUERY, $params);
}
public function send(array $params)
{
$params['mchid'] = $this->merchant->merchant_id;
$params['mch_appid'] = $this->merchant->app_id;
return $this->request(self::API_SEND, $params);
}
public function setMerchant(Merchant $merchant)
{
$this->merchant = $merchant;
}
public function getMerchant()
{
return $this->merchant;
}
protected function request($api, array $params, $method = 'post')
{
$params = array_filter($params);
$params['nonce_str'] = uniqid();
$params['sign'] = \EasyWeChat\Payment\generate_sign($params, $this->merchant->key, 'md5');
$options = [
'body' => XML::build($params),
'cert' => $this->merchant->get('cert_path'),
'ssl_key' => $this->merchant->get('key_path'),
];
return $this->parseResponse($this->getHttp()->request($api, $method, $options));
}
protected function parseResponse($response)
{
if ($response instanceof ResponseInterface) {
$response = $response->getBody();
}
return new Collection((array) XML::parse($response));
}
}