* * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ /** * Notify.php. * * @author overtrue * @copyright 2015 overtrue * * @see https://github.com/overtrue * @see http://overtrue.me */ namespace EasyWeChat\Payment; use EasyWeChat\Core\Exceptions\FaultException; use EasyWeChat\Support\Collection; use EasyWeChat\Support\XML; use Symfony\Component\HttpFoundation\Request; /** * Class Notify. */ class Notify { /** * Merchant instance. * * @var \EasyWeChat\Payment\Merchant */ protected $merchant; /** * Request instance. * * @var \Symfony\Component\HttpFoundation\Request */ protected $request; /** * Payment notify (extract from XML). * * @var Collection */ protected $notify; /** * Constructor. * * @param Merchant $merchant * @param Request $request */ public function __construct(Merchant $merchant, Request $request = null) { $this->merchant = $merchant; $this->request = $request ?: Request::createFromGlobals(); } /** * Validate the request params. * * @return bool */ public function isValid($signkey) { $localSign = generate_sign($this->getNotify()->except('sign')->all(), $signkey, 'md5'); return $localSign === $this->getNotify()->get('sign'); } /** * Return the notify body from request. * * @return \EasyWeChat\Support\Collection * * @throws \EasyWeChat\Core\Exceptions\FaultException */ public function getNotify() { if (!empty($this->notify)) { return $this->notify; } try { $xml = XML::parse(strval($this->request->getContent())); } catch (\Throwable $t) { throw new FaultException('Invalid request XML: '.$t->getMessage(), 400); } catch (\Exception $e) { throw new FaultException('Invalid request XML: '.$e->getMessage(), 400); } if (!is_array($xml) || empty($xml)) { throw new FaultException('Invalid request XML.', 400); } return $this->notify = new Collection($xml); } }