此类用于调用WMS APi时请求参数生成签名
<?php namespace amazon; class Signature { /** * The signed string. * * @var string */ protected $signedString; /** * Create a new signature instance. * * @param string $url * @param array $data * @param string $secretAccessKey */ public function __construct($url, array $parameters, $secretAccessKey) { $stringToSign = $this->calculateStringToSign($url, $parameters); $this->signedString = $this->sign($stringToSign, $secretAccessKey); } /** * Calculate the string to sign. * * @param string $url * @param array $parameters * @return string */ protected function calculateStringToSign($url, array $parameters) { $url = parse_url($url); $string = "POST "; $string .= $url['host']." "; $string .= $url['path']." "; $string .= $this->getParametersAsString($parameters); return $string; } /** * Computes RFC 2104-compliant HMAC signature. * * @param string $data * @param string $secretAccessKey * @return string */ protected function sign($data, $secretAccessKey) { return base64_encode(hash_hmac('sha256', $data, $secretAccessKey, true)); } /** * Convert paremeters to URL-encoded query string. * * @param array $parameters * @return string */ protected function getParametersAsString(array $parameters) { uksort($parameters, 'strcmp'); $queryParameters = []; foreach ($parameters as $key => $value) { $key = rawurlencode($key); $value = rawurlencode($value); $queryParameters[] = sprintf('%s=%s', $key, $value); } return implode('&', $queryParameters); } /** * The string representation of this signature. * * @return string */ public function __toString() { return $this->signedString; } }