1583 lines
58 KiB
PHP
1583 lines
58 KiB
PHP
<?php
|
|
namespace PayWithAmazon;
|
|
|
|
// Exit if accessed directly
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/* Class Client
|
|
* Takes configuration information
|
|
* Makes API calls to MWS for Pay With Amazon
|
|
* returns Response Object
|
|
*/
|
|
|
|
require_once 'ResponseParser.php';
|
|
require_once 'HttpCurl.php';
|
|
require_once 'Interface.php';
|
|
|
|
class Client implements ClientInterface
|
|
{
|
|
const MWS_CLIENT_VERSION = '1.0.0';
|
|
const SERVICE_VERSION = '2013-01-01';
|
|
const MAX_ERROR_RETRY = 3;
|
|
|
|
// Construct User agent string based off of the application_name, application_version, PHP platform
|
|
private $userAgent = null;
|
|
private $parameters = null;
|
|
private $mwsEndpointPath = null;
|
|
private $mwsEndpointUrl = null;
|
|
private $profileEndpoint = null;
|
|
private $config = array('merchant_id' => null,
|
|
'secret_key' => null,
|
|
'access_key' => null,
|
|
'region' => null,
|
|
'currency_code' => null,
|
|
'sandbox' => false,
|
|
'platform_id' => null,
|
|
'cabundle_file' => null,
|
|
'application_name' => null,
|
|
'application_version' => null,
|
|
'proxy_host' => null,
|
|
'proxy_port' => -1,
|
|
'proxy_username' => null,
|
|
'proxy_password' => null,
|
|
'client_id' => null,
|
|
'handle_throttle' => true
|
|
);
|
|
|
|
private $modePath = null;
|
|
|
|
// Final URL to where the API parameters POST done, based off the config['region'] and respective $mwsServiceUrls
|
|
private $mwsServiceUrl = null;
|
|
|
|
private $mwsServiceUrls = array('eu' => 'mws-eu.amazonservices.com',
|
|
'na' => 'mws.amazonservices.com',
|
|
'jp' => 'mws.amazonservices.jp');
|
|
|
|
// Production profile end points to get the user information
|
|
private $liveProfileEndpoint = array('uk' => 'https://api.amazon.co.uk',
|
|
'us' => 'https://api.amazon.com',
|
|
'de' => 'https://api.amazon.de',
|
|
'jp' => 'https://api.amazon.co.jp');
|
|
|
|
// Sandbox profile end points to get the user information
|
|
private $sandboxProfileEndpoint = array('uk' => 'https://api.sandbox.amazon.co.uk',
|
|
'us' => 'https://api.sandbox.amazon.com',
|
|
'de' => 'https://api.sandbox.amazon.de',
|
|
'jp' => 'https://api.sandbox.amazon.co.jp');
|
|
|
|
private $regionMappings = array('de' => 'eu',
|
|
'uk' => 'eu',
|
|
'us' => 'na',
|
|
'jp' => 'jp');
|
|
|
|
// Boolean variable to check if the API call was a success
|
|
public $success = false;
|
|
|
|
/* Takes user configuration array from the user as input
|
|
* Takes JSON file path with configuration information as input
|
|
* Validates the user configuration array against existing config array
|
|
*/
|
|
|
|
public function __construct($config = null)
|
|
{
|
|
if (!is_null($config)) {
|
|
|
|
if (is_array($config)) {
|
|
$configArray = $config;
|
|
} elseif (!is_array($config)) {
|
|
$configArray = $this->checkIfFileExists($config);
|
|
}
|
|
|
|
if (is_array($configArray)) {
|
|
$this->checkConfigKeys($configArray);
|
|
} else {
|
|
throw new \Exception('$config is of the incorrect type ' . gettype($configArray) . ' and should be of the type array');
|
|
}
|
|
} else {
|
|
throw new \Exception('$config cannot be null.');
|
|
}
|
|
}
|
|
|
|
/* checkIfFileExists - check if the JSON file exists in the path provided */
|
|
|
|
private function checkIfFileExists($config)
|
|
{
|
|
if(file_exists($config))
|
|
{
|
|
$jsonString = file_get_contents($config);
|
|
$configArray = json_decode($jsonString, true);
|
|
|
|
$jsonError = json_last_error();
|
|
|
|
if ($jsonError != 0) {
|
|
$errorMsg = "Error with message - content is not in json format" . $this->getErrorMessageForJsonError($jsonError) . " " . $configArray;
|
|
throw new \Exception($errorMsg);
|
|
}
|
|
} else {
|
|
$errorMsg ='$config is not a Json File path or the Json File was not found in the path provided';
|
|
throw new \Exception($errorMsg);
|
|
}
|
|
return $configArray;
|
|
}
|
|
|
|
/* Checks if the keys of the input configuration matches the keys in the config array
|
|
* if they match the values are taken else throws exception
|
|
* strict case match is not performed
|
|
*/
|
|
|
|
private function checkConfigKeys($config)
|
|
{
|
|
$config = array_change_key_case($config, CASE_LOWER);
|
|
$config = $this->trimArray($config);
|
|
|
|
foreach ($config as $key => $value) {
|
|
if (array_key_exists($key, $this->config)) {
|
|
$this->config[$key] = $value;
|
|
} else {
|
|
throw new \Exception('Key ' . $key . ' is either not part of the configuration or has incorrect Key name.
|
|
check the config array key names to match your key names of your config array', 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Convert a json error code to a descriptive error message
|
|
*
|
|
* @param int $jsonError message code
|
|
*
|
|
* @return string error message
|
|
*/
|
|
|
|
private function getErrorMessageForJsonError($jsonError)
|
|
{
|
|
switch ($jsonError) {
|
|
case JSON_ERROR_DEPTH:
|
|
return " - maximum stack depth exceeded.";
|
|
break;
|
|
case JSON_ERROR_STATE_MISMATCH:
|
|
return " - invalid or malformed JSON.";
|
|
break;
|
|
case JSON_ERROR_CTRL_CHAR:
|
|
return " - control character error.";
|
|
break;
|
|
case JSON_ERROR_SYNTAX:
|
|
return " - syntax error.";
|
|
break;
|
|
default:
|
|
return ".";
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* Setter for sandbox
|
|
* Sets the Boolean value for config['sandbox'] variable
|
|
*/
|
|
|
|
public function setSandbox($value)
|
|
{
|
|
if (is_bool($value)) {
|
|
$this->config['sandbox'] = $value;
|
|
} else {
|
|
throw new \Exception($value . ' is of type ' . gettype($value) . ' and should be a boolean value');
|
|
}
|
|
}
|
|
|
|
/* Setter for config['client_id']
|
|
* Sets the value for config['client_id'] variable
|
|
*/
|
|
|
|
public function setClientId($value)
|
|
{
|
|
if (!empty($value)) {
|
|
$this->config['client_id'] = $value;
|
|
} else {
|
|
throw new \Exception('setter value for client ID provided is empty');
|
|
}
|
|
}
|
|
|
|
/* Setter for Proxy
|
|
* input $proxy [array]
|
|
* @param $proxy['proxy_user_host'] - hostname for the proxy
|
|
* @param $proxy['proxy_user_port'] - hostname for the proxy
|
|
* @param $proxy['proxy_user_name'] - if your proxy required a username
|
|
* @param $proxy['proxy_user_password'] - if your proxy required a password
|
|
*/
|
|
|
|
public function setProxy($proxy)
|
|
{
|
|
$proxy = $this->trimArray($proxy);
|
|
|
|
if (!empty($proxy['proxy_user_host']))
|
|
$this->config['proxy_user_host'] = $proxy['proxy_user_host'];
|
|
|
|
if (!empty($proxy['proxy_user_port']))
|
|
$this->config['proxy_user_port'] = $proxy['proxy_user_port'];
|
|
|
|
if (!empty($proxy['proxy_user_name']))
|
|
$this->config['proxy_user_name'] = $proxy['proxy_user_name'];
|
|
|
|
if (!empty($proxy['proxy_user_password']))
|
|
$this->config['proxy_user_password'] = $proxy['proxy_user_password'];
|
|
}
|
|
|
|
/* Setter for $mwsServiceUrl
|
|
* Set the URL to which the post request has to be made for unit testing
|
|
*/
|
|
|
|
public function setMwsServiceUrl($url)
|
|
{
|
|
$this->mwsServiceUrl = $url;
|
|
}
|
|
|
|
/* Getter
|
|
* Gets the value for the key if the key exists in config
|
|
*/
|
|
|
|
public function __get($name)
|
|
{
|
|
if (array_key_exists(strtolower($name), $this->config)) {
|
|
return $this->config[strtolower($name)];
|
|
} else {
|
|
throw new \Exception('Key ' . $name . ' is either not a part of the configuration array config or the' . $name . 'does not match the key name in the config array', 1);
|
|
}
|
|
}
|
|
|
|
/* Getter for parameters string
|
|
* Gets the value for the parameters string for unit testing
|
|
*/
|
|
|
|
public function getParameters()
|
|
{
|
|
return trim($this->parameters);
|
|
}
|
|
|
|
/* Trim the input Array key values */
|
|
|
|
private function trimArray($array)
|
|
{
|
|
foreach ($array as $key => $value)
|
|
{
|
|
$array[$key] = trim($value);
|
|
}
|
|
return $array;
|
|
}
|
|
|
|
/* GetUserInfo convenience function - Returns user's profile information from Amazon using the access token returned by the Button widget.
|
|
*
|
|
* @see http://login.amazon.com/website Step 4
|
|
* @param $accessToken [String]
|
|
*/
|
|
|
|
public function getUserInfo($accessToken)
|
|
{
|
|
// Get the correct Profile Endpoint URL based off the country/region provided in the config['region']
|
|
$this->profileEndpointUrl();
|
|
|
|
if (empty($accessToken)) {
|
|
throw new \InvalidArgumentException('Access Token is a required parameter and is not set');
|
|
}
|
|
|
|
// To make sure double encoding doesn't occur decode first and encode again.
|
|
$accessToken = urldecode($accessToken);
|
|
$url = $this->profileEndpoint . '/auth/o2/tokeninfo?access_token=' . urlEncode($accessToken);
|
|
|
|
$httpCurlRequest = new HttpCurl();
|
|
|
|
$response = $httpCurlRequest->httpGet($url);
|
|
$data = json_decode($response);
|
|
|
|
if ($data->aud != $this->config['client_id']) {
|
|
// The access token does not belong to us
|
|
throw new \Exception('The Access token entered is incorrect');
|
|
}
|
|
|
|
// Exchange the access token for user profile
|
|
$url = $this->profileEndpoint . '/user/profile';
|
|
$httpCurlRequest = new HttpCurl();
|
|
|
|
$httpCurlRequest->setAccessToken($accessToken);
|
|
$httpCurlRequest->setHttpHeader(true);
|
|
$response = $httpCurlRequest->httpGet($url);
|
|
|
|
$userInfo = json_decode($response, true);
|
|
return $userInfo;
|
|
}
|
|
|
|
/* setParametersAndPost - sets the parameters array with non empty values from the requestParameters array sent to API calls.
|
|
* If Provider Credit Details is present, values are set by setProviderCreditDetails
|
|
* If Provider Credit Reversal Details is present, values are set by setProviderCreditDetails
|
|
*/
|
|
|
|
private function setParametersAndPost($parameters, $fieldMappings, $requestParameters)
|
|
{
|
|
/* For loop to take all the non empty parameters in the $requestParameters and add it into the $parameters array,
|
|
* if the keys are matched from $requestParameters array with the $fieldMappings array
|
|
*/
|
|
foreach ($requestParameters as $param => $value) {
|
|
|
|
if(!is_array($value)) {
|
|
$value = trim($value);
|
|
}
|
|
|
|
if (array_key_exists($param, $fieldMappings) && $value!='') {
|
|
|
|
if(is_array($value)) {
|
|
// If the parameter is a provider_credit_details or provider_credit_reversal_details, call the respective functions to set the values
|
|
if($param === 'provider_credit_details') {
|
|
$parameters = $this->setProviderCreditDetails($parameters,$value);
|
|
} elseif ($param === 'provider_credit_reversal_details') {
|
|
$parameters = $this->setProviderCreditReversalDetails($parameters,$value);
|
|
}
|
|
|
|
} else{
|
|
// For variables that are boolean values, strtolower them
|
|
if($this->checkIfBool($value))
|
|
{
|
|
$value = strtolower($value);
|
|
}
|
|
|
|
$parameters[$fieldMappings[$param]] = $value;
|
|
}
|
|
}
|
|
}
|
|
|
|
$parameters = $this->setDefaultValues($parameters, $fieldMappings, $requestParameters);
|
|
$responseObject = $this->calculateSignatureAndPost($parameters);
|
|
|
|
return $responseObject;
|
|
}
|
|
|
|
/* checkIfBool - checks if the input is a boolean */
|
|
|
|
private function checkIfBool($string)
|
|
{
|
|
$string = strtolower($string);
|
|
return in_array($string, array('true', 'false'));
|
|
}
|
|
|
|
/* calculateSignatureAndPost - convert the Parameters array to string and curl POST the parameters to MWS */
|
|
|
|
private function calculateSignatureAndPost($parameters)
|
|
{
|
|
// Call the signature and Post function to perform the actions. Returns XML in array format
|
|
$parametersString = $this->calculateSignatureAndParametersToString($parameters);
|
|
|
|
// POST using curl the String converted Parameters
|
|
$response = $this->invokePost($parametersString);
|
|
|
|
// Send this response as args to ResponseParser class which will return the object of the class.
|
|
$responseObject = new ResponseParser($response);
|
|
return $responseObject;
|
|
}
|
|
|
|
/* If merchant_id is not set via the requestParameters array then it's taken from the config array
|
|
*
|
|
* Set the platform_id if set in the config['platform_id'] array
|
|
*
|
|
* If currency_code is set in the $requestParameters and it exists in the $fieldMappings array, strtoupper it
|
|
* else take the value from config array if set
|
|
*/
|
|
|
|
private function setDefaultValues($parameters, $fieldMappings, $requestParameters)
|
|
{
|
|
if (empty($requestParameters['merchant_id']))
|
|
$parameters['SellerId'] = $this->config['merchant_id'];
|
|
|
|
if (array_key_exists('platform_id', $fieldMappings)) {
|
|
if (empty($requestParameters['platform_id']) && !empty($this->config['platform_id']))
|
|
$parameters[$fieldMappings['platform_id']] = $this->config['platform_id'];
|
|
}
|
|
|
|
if (array_key_exists('currency_code', $fieldMappings)) {
|
|
if (!empty($requestParameters['currency_code'])) {
|
|
$parameters[$fieldMappings['currency_code']] = strtoupper($requestParameters['currency_code']);
|
|
} else {
|
|
$parameters[$fieldMappings['currency_code']] = strtoupper($this->config['currency_code']);
|
|
}
|
|
}
|
|
|
|
return $parameters;
|
|
}
|
|
|
|
/* setProviderCreditDetails - sets the provider credit details sent via the Capture or Authorize API calls
|
|
* @param provider_id - [String]
|
|
* @param credit_amount - [String]
|
|
* @optional currency_code - [String]
|
|
*/
|
|
|
|
private function setProviderCreditDetails($parameters, $providerCreditInfo)
|
|
{
|
|
$providerIndex = 0;
|
|
$providerString = 'ProviderCreditList.member.';
|
|
|
|
$fieldMappings = array(
|
|
'provider_id' => 'ProviderId',
|
|
'credit_amount' => 'CreditAmount.Amount',
|
|
'currency_code' => 'CreditAmount.CurrencyCode'
|
|
);
|
|
|
|
foreach ($providerCreditInfo as $key => $value)
|
|
{
|
|
$value = array_change_key_case($value, CASE_LOWER);
|
|
$providerIndex = $providerIndex + 1;
|
|
|
|
foreach ($value as $param => $val)
|
|
{
|
|
if (array_key_exists($param, $fieldMappings) && trim($val)!='') {
|
|
$parameters[$providerString.$providerIndex. '.' .$fieldMappings[$param]] = $val;
|
|
}
|
|
}
|
|
|
|
// If currency code is not entered take it from the config array
|
|
if(empty($parameters[$providerString.$providerIndex. '.' .$fieldMappings['currency_code']]))
|
|
{
|
|
$parameters[$providerString.$providerIndex. '.' .$fieldMappings['currency_code']] = strtoupper($this->config['currency_code']);
|
|
}
|
|
}
|
|
|
|
return $parameters;
|
|
}
|
|
|
|
/* setProviderCreditReversalDetails - sets the reverse provider credit details sent via the Refund API call.
|
|
* @param provider_id - [String]
|
|
* @param credit_amount - [String]
|
|
* @optional currency_code - [String]
|
|
*/
|
|
|
|
private function setProviderCreditReversalDetails($parameters, $providerCreditInfo)
|
|
{
|
|
$providerIndex = 0;
|
|
$providerString = 'ProviderCreditReversalList.member.';
|
|
|
|
$fieldMappings = array(
|
|
'provider_id' => 'ProviderId',
|
|
'credit_reversal_amount' => 'CreditReversalAmount.Amount',
|
|
'currency_code' => 'CreditReversalAmount.CurrencyCode'
|
|
);
|
|
|
|
foreach ($providerCreditInfo as $key => $value)
|
|
{
|
|
$value = array_change_key_case($value, CASE_LOWER);
|
|
$providerIndex = $providerIndex + 1;
|
|
|
|
foreach ($value as $param => $val)
|
|
{
|
|
if (array_key_exists($param, $fieldMappings) && trim($val)!='') {
|
|
$parameters[$providerString.$providerIndex. '.' .$fieldMappings[$param]] = $val;
|
|
}
|
|
}
|
|
|
|
// If currency code is not entered take it from the config array
|
|
if(empty($parameters[$providerString.$providerIndex. '.' .$fieldMappings['currency_code']]))
|
|
{
|
|
$parameters[$providerString.$providerIndex. '.' .$fieldMappings['currency_code']] = strtoupper($this->config['currency_code']);
|
|
}
|
|
}
|
|
|
|
return $parameters;
|
|
}
|
|
|
|
/* GetOrderReferenceDetails API call - Returns details about the Order Reference object and its current state.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_GetOrderReferenceDetails.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_order_reference_id'] - [String]
|
|
* @optional requestParameters['address_consent_token'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function getOrderReferenceDetails($requestParameters = array())
|
|
{
|
|
|
|
$parameters['Action'] = 'GetOrderReferenceDetails';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
|
|
'address_consent_token' => 'AddressConsentToken',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* SetOrderReferenceDetails API call - Sets order reference details such as the order total and a description for the order.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_SetOrderReferenceDetails.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_order_reference_id'] - [String]
|
|
* @param requestParameters['amount'] - [String]
|
|
* @param requestParameters['currency_code'] - [String]
|
|
* @optional requestParameters['platform_id'] - [String]
|
|
* @optional requestParameters['seller_note'] - [String]
|
|
* @optional requestParameters['seller_order_id'] - [String]
|
|
* @optional requestParameters['store_name'] - [String]
|
|
* @optional requestParameters['custom_information'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function setOrderReferenceDetails($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'SetOrderReferenceDetails';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
|
|
'amount' => 'OrderReferenceAttributes.OrderTotal.Amount',
|
|
'currency_code' => 'OrderReferenceAttributes.OrderTotal.CurrencyCode',
|
|
'platform_id' => 'OrderReferenceAttributes.PlatformId',
|
|
'seller_note' => 'OrderReferenceAttributes.SellerNote',
|
|
'seller_order_id' => 'OrderReferenceAttributes.SellerOrderAttributes.SellerOrderId',
|
|
'store_name' => 'OrderReferenceAttributes.SellerOrderAttributes.StoreName',
|
|
'custom_information' => 'OrderReferenceAttributes.SellerOrderAttributes.CustomInformation',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* ConfirmOrderReferenceDetails API call - Confirms that the order reference is free of constraints and all required information has been set on the order reference.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_ConfirmOrderReference.html
|
|
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_order_reference_id'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function confirmOrderReference($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'ConfirmOrderReference';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* CancelOrderReferenceDetails API call - Cancels a previously confirmed order reference.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_CancelOrderReference.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_order_reference_id'] - [String]
|
|
* @optional requestParameters['cancelation_reason'] [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function cancelOrderReference($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'CancelOrderReference';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
|
|
'cancelation_reason' => 'CancelationReason',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* CloseOrderReferenceDetails API call - Confirms that an order reference has been fulfilled (fully or partially)
|
|
* and that you do not expect to create any new authorizations on this order reference.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_CloseOrderReference.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_order_reference_id'] - [String]
|
|
* @optional requestParameters['closure_reason'] [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function closeOrderReference($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'CloseOrderReference';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
|
|
'closure_reason' => 'ClosureReason',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* CloseAuthorization API call - Closes an authorization.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_CloseOrderReference.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_authorization_id'] - [String]
|
|
* @optional requestParameters['closure_reason'] [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function closeAuthorization($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'CloseAuthorization';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_authorization_id' => 'AmazonAuthorizationId',
|
|
'closure_reason' => 'ClosureReason',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* Authorize API call - Reserves a specified amount against the payment method(s) stored in the order reference.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_Authorize.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_order_reference_id'] - [String]
|
|
* @param requestParameters['authorization_amount'] [String]
|
|
* @param requestParameters['currency_code'] - [String]
|
|
* @param requestParameters['authorization_reference_id'] [String]
|
|
* @optional requestParameters['capture_now'] [String]
|
|
* @optional requestParameters['provider_credit_details'] - [array (array())]
|
|
* @optional requestParameters['seller_authorization_note'] [String]
|
|
* @optional requestParameters['transaction_timeout'] [String] - Defaults to 1440 minutes
|
|
* @optional requestParameters['soft_descriptor'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function authorize($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'Authorize';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
|
|
'authorization_amount' => 'AuthorizationAmount.Amount',
|
|
'currency_code' => 'AuthorizationAmount.CurrencyCode',
|
|
'authorization_reference_id' => 'AuthorizationReferenceId',
|
|
'capture_now' => 'CaptureNow',
|
|
'provider_credit_details' => array(),
|
|
'seller_authorization_note' => 'SellerAuthorizationNote',
|
|
'transaction_timeout' => 'TransactionTimeout',
|
|
'soft_descriptor' => 'SoftDescriptor',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* GetAuthorizationDetails API call - Returns the status of a particular authorization and the total amount captured on the authorization.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_GetAuthorizationDetails.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_authorization_id'] [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function getAuthorizationDetails($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'GetAuthorizationDetails';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_authorization_id' => 'AmazonAuthorizationId',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* Capture API call - Captures funds from an authorized payment instrument.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_Capture.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_authorization_id'] - [String]
|
|
* @param requestParameters['capture_amount'] - [String]
|
|
* @param requestParameters['currency_code'] - [String]
|
|
* @param requestParameters['capture_reference_id'] - [String]
|
|
* @optional requestParameters['provider_credit_details'] - [array (array())]
|
|
* @optional requestParameters['seller_capture_note'] - [String]
|
|
* @optional requestParameters['soft_descriptor'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function capture($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'Capture';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_authorization_id' => 'AmazonAuthorizationId',
|
|
'capture_amount' => 'CaptureAmount.Amount',
|
|
'currency_code' => 'CaptureAmount.CurrencyCode',
|
|
'capture_reference_id' => 'CaptureReferenceId',
|
|
'provider_credit_details' => array(),
|
|
'seller_capture_note' => 'SellerCaptureNote',
|
|
'soft_descriptor' => 'SoftDescriptor',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* GetCaptureDetails API call - Returns the status of a particular capture and the total amount refunded on the capture.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_GetCaptureDetails.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_capture_id'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function getCaptureDetails($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'GetCaptureDetails';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_capture_id' => 'AmazonCaptureId',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* Refund API call - Refunds a previously captured amount.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_Refund.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_capture_id'] - [String]
|
|
* @param requestParameters['refund_reference_id'] - [String]
|
|
* @param requestParameters['refund_amount'] - [String]
|
|
* @param requestParameters['currency_code'] - [String]
|
|
* @optional requestParameters['provider_credit_reversal_details'] - [array(array())]
|
|
* @optional requestParameters['seller_refund_note'] [String]
|
|
* @optional requestParameters['soft_descriptor'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function refund($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'Refund';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_capture_id' => 'AmazonCaptureId',
|
|
'refund_reference_id' => 'RefundReferenceId',
|
|
'refund_amount' => 'RefundAmount.Amount',
|
|
'currency_code' => 'RefundAmount.CurrencyCode',
|
|
'provider_credit_reversal_details' => array(),
|
|
'seller_refund_note' => 'SellerRefundNote',
|
|
'soft_descriptor' => 'SoftDescriptor',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* GetRefundDetails API call - Returns the status of a particular refund.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_GetRefundDetails.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_refund_id'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function getRefundDetails($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'GetRefundDetails';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_refund_id' => 'AmazonRefundId',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* GetServiceStatus API Call - Returns the operational status of the Off-Amazon Payments API section
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_GetServiceStatus.html
|
|
*
|
|
* The GetServiceStatus operation returns the operational status of the Off-Amazon Payments API
|
|
* section of Amazon Marketplace Web Service (Amazon MWS).
|
|
* Status values are GREEN, GREEN_I, YELLOW, and RED.
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function getServiceStatus($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'GetServiceStatus';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* CreateOrderReferenceForId API Call - Creates an order reference for the given object
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_CreateOrderReferenceForId.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['Id'] - [String]
|
|
* @optional requestParameters['inherit_shipping_address'] [Boolean]
|
|
* @optional requestParameters['ConfirmNow'] - [Boolean]
|
|
* @optional Amount (required when confirm_now is set to true) [String]
|
|
* @optional requestParameters['currency_code'] - [String]
|
|
* @optional requestParameters['seller_note'] - [String]
|
|
* @optional requestParameters['seller_order_id'] - [String]
|
|
* @optional requestParameters['store_name'] - [String]
|
|
* @optional requestParameters['custom_information'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function createOrderReferenceForId($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'CreateOrderReferenceForId';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'id' => 'Id',
|
|
'id_type' => 'IdType',
|
|
'inherit_shipping_address' => 'InheritShippingAddress',
|
|
'confirm_now' => 'ConfirmNow',
|
|
'amount' => 'OrderReferenceAttributes.OrderTotal.Amount',
|
|
'currency_code' => 'OrderReferenceAttributes.OrderTotal.CurrencyCode',
|
|
'platform_id' => 'OrderReferenceAttributes.PlatformId',
|
|
'seller_note' => 'OrderReferenceAttributes.SellerNote',
|
|
'seller_order_id' => 'OrderReferenceAttributes.SellerOrderAttributes.SellerOrderId',
|
|
'store_name' => 'OrderReferenceAttributes.SellerOrderAttributes.StoreName',
|
|
'custom_information' => 'OrderReferenceAttributes.SellerOrderAttributes.CustomInformation',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* GetBillingAgreementDetails API Call - Returns details about the Billing Agreement object and its current state.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_GetBillingAgreementDetails.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_billing_agreement_id'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function getBillingAgreementDetails($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'GetBillingAgreementDetails';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
|
|
'address_consent_token' => 'AddressConsentToken',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* SetBillingAgreementDetails API call - Sets Billing Agreement details such as a description of the agreement and other information about the seller.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_SetBillingAgreementDetails.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_billing_agreement_id'] - [String]
|
|
* @param requestParameters['amount'] - [String]
|
|
* @param requestParameters['currency_code'] - [String]
|
|
* @optional requestParameters['platform_id'] - [String]
|
|
* @optional requestParameters['seller_note'] - [String]
|
|
* @optional requestParameters['seller_billing_agreement_id'] - [String]
|
|
* @optional requestParameters['store_name'] - [String]
|
|
* @optional requestParameters['custom_information'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function setBillingAgreementDetails($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'SetBillingAgreementDetails';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
|
|
'platform_id' => 'BillingAgreementAttributes.PlatformId',
|
|
'seller_note' => 'BillingAgreementAttributes.SellerNote',
|
|
'seller_billing_agreement_id' => 'BillingAgreementAttributes.SellerBillingAgreementAttributes.SellerBillingAgreementId',
|
|
'custom_information' => 'BillingAgreementAttributes.SellerBillingAgreementAttributes.CustomInformation',
|
|
'store_name' => 'BillingAgreementAttributes.SellerBillingAgreementAttributes.StoreName',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* ConfirmBillingAgreement API Call - Confirms that the Billing Agreement is free of constraints and all required information has been set on the Billing Agreement.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_ConfirmBillingAgreement.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_billing_agreement_id'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function confirmBillingAgreement($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'ConfirmBillingAgreement';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* ValidateBillignAgreement API Call - Validates the status of the Billing Agreement object and the payment method associated with it.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_ValidateBillingAgreement.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_billing_agreement_id'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function validateBillingAgreement($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'ValidateBillingAgreement';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* AuthorizeOnBillingAgreement API call - Reserves a specified amount against the payment method(s) stored in the Billing Agreement.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_AuthorizeOnBillingAgreement.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_billing_agreement_id'] - [String]
|
|
* @param requestParameters['authorization_reference_id'] [String]
|
|
* @param requestParameters['authorization_amount'] [String]
|
|
* @param requestParameters['currency_code'] - [String]
|
|
* @optional requestParameters['seller_authorization_note'] [String]
|
|
* @optional requestParameters['transaction_timeout'] - Defaults to 1440 minutes
|
|
* @optional requestParameters['capture_now'] [String]
|
|
* @optional requestParameters['soft_descriptor'] - - [String]
|
|
* @optional requestParameters['seller_note'] - [String]
|
|
* @optional requestParameters['platform_id'] - [String]
|
|
* @optional requestParameters['custom_information'] - [String]
|
|
* @optional requestParameters['seller_order_id'] - [String]
|
|
* @optional requestParameters['store_name'] - [String]
|
|
* @optional requestParameters['inherit_shipping_address'] [Boolean] - Defaults to true
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function authorizeOnBillingAgreement($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'AuthorizeOnBillingAgreement';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
|
|
'authorization_reference_id' => 'AuthorizationReferenceId',
|
|
'authorization_amount' => 'AuthorizationAmount.Amount',
|
|
'currency_code' => 'AuthorizationAmount.CurrencyCode',
|
|
'seller_authorization_note' => 'SellerAuthorizationNote',
|
|
'transaction_timeout' => 'TransactionTimeout',
|
|
'capture_now' => 'CaptureNow',
|
|
'soft_descriptor' => 'SoftDescriptor',
|
|
'seller_note' => 'SellerNote',
|
|
'platform_id' => 'PlatformId',
|
|
'custom_information' => 'SellerOrderAttributes.CustomInformation',
|
|
'seller_order_id' => 'SellerOrderAttributes.SellerOrderId',
|
|
'store_name' => 'SellerOrderAttributes.StoreName',
|
|
'inherit_shipping_address' => 'InheritShippingAddress',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* CloseBillingAgreement API Call - Returns details about the Billing Agreement object and its current state.
|
|
* @see http://docs.developer.amazonservices.com/en_US/off_amazon_payments/OffAmazonPayments_CloseBillingAgreement.html
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_billing_agreement_id'] - [String]
|
|
* @optional requestParameters['closure_reason'] [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function closeBillingAgreement($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'CloseBillingAgreement';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
|
|
'closure_reason' => 'ClosureReason',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* charge convenience method
|
|
* Performs the API calls
|
|
* 1. SetOrderReferenceDetails / SetBillingAgreementDetails
|
|
* 2. ConfirmOrderReference / ConfirmBillingAgreement
|
|
* 3. Authorize (with Capture) / AuthorizeOnBillingAgreeemnt (with Capture)
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
*
|
|
* @param requestParameters['amazon_reference_id'] - [String] : Order Reference ID /Billing Agreement ID
|
|
* If requestParameters['amazon_reference_id'] is empty then the following is required,
|
|
* @param requestParameters['amazon_order_reference_id'] - [String] : Order Reference ID
|
|
* or,
|
|
* @param requestParameters['amazon_billing_agreement_id'] - [String] : Billing Agreement ID
|
|
*
|
|
* @param $requestParameters['charge_amount'] - [String] : Amount value to be captured
|
|
* @param requestParameters['currency_code'] - [String] : Currency Code for the Amount
|
|
* @param requestParameters['authorization_reference_id'] - [String]- Any unique string that needs to be passed
|
|
* @optional requestParameters['charge_note'] - [String] : Seller Note sent to the buyer
|
|
* @optional requestParameters['transaction_timeout'] - [String] : Defaults to 1440 minutes
|
|
* @optional requestParameters['charge_order_id'] - [String] : Custom Order ID provided
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function charge($requestParameters = array()) {
|
|
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
$requestParameters= $this->trimArray($requestParameters);
|
|
|
|
$setParameters = $authorizeParameters = $confirmParameters = $requestParameters;
|
|
|
|
$chargeType = '';
|
|
|
|
if (!empty($requestParameters['amazon_order_reference_id']))
|
|
{
|
|
$chargeType = 'OrderReference';
|
|
|
|
} elseif(!empty($requestParameters['amazon_billing_agreement_id'])) {
|
|
$chargeType = 'BillingAgreement';
|
|
|
|
} elseif (!empty($requestParameters['amazon_reference_id'])) {
|
|
switch (substr(strtoupper($requestParameters['amazon_reference_id']), 0, 1)) {
|
|
case 'P':
|
|
case 'S':
|
|
$chargeType = 'OrderReference';
|
|
$setParameters['amazon_order_reference_id'] = $requestParameters['amazon_reference_id'];
|
|
$authorizeParameters['amazon_order_reference_id'] = $requestParameters['amazon_reference_id'];
|
|
$confirmParameters['amazon_order_reference_id'] = $requestParameters['amazon_reference_id'];
|
|
break;
|
|
case 'B':
|
|
case 'C':
|
|
$chargeType = 'BillingAgreement';
|
|
$setParameters['amazon_billing_agreement_id'] = $requestParameters['amazon_reference_id'];
|
|
$authorizeParameters['amazon_billing_agreement_id'] = $requestParameters['amazon_reference_id'];
|
|
$confirmParameters['amazon_billing_agreement_id'] = $requestParameters['amazon_reference_id'];
|
|
break;
|
|
default:
|
|
throw new \Exception('Invalid Amazon Reference ID');
|
|
}
|
|
} else {
|
|
throw new \Exception('key amazon_order_reference_id or amazon_billing_agreement_id is null and is a required parameter');
|
|
}
|
|
|
|
// Set the other parameters if the values are present
|
|
$setParameters['amount'] = !empty($requestParameters['charge_amount']) ? $requestParameters['charge_amount'] : '';
|
|
$authorizeParameters['authorization_amount'] = !empty($requestParameters['charge_amount']) ? $requestParameters['charge_amount'] : '';
|
|
|
|
$setParameters['seller_note'] = !empty($requestParameters['charge_note']) ? $requestParameters['charge_note'] : '';
|
|
$authorizeParameters['seller_authorization_note'] = !empty($requestParameters['charge_note']) ? $requestParameters['charge_note'] : '';
|
|
$authorizeParameters['seller_note'] = !empty($requestParameters['charge_note']) ? $requestParameters['charge_note'] : '';
|
|
|
|
$setParameters['seller_order_id'] = !empty($requestParameters['charge_order_id']) ? $requestParameters['charge_order_id'] : '';
|
|
$setParameters['seller_billing_agreement_id'] = !empty($requestParameters['charge_order_id']) ? $requestParameters['charge_order_id'] : '';
|
|
$authorizeParameters['seller_order_id'] = !empty($requestParameters['charge_order_id']) ? $requestParameters['charge_order_id'] : '';
|
|
|
|
$authorizeParameters['capture_now'] = 'true';
|
|
|
|
$response = $this->makeChargeCalls($chargeType, $setParameters, $confirmParameters, $authorizeParameters);
|
|
return $response;
|
|
}
|
|
|
|
/* makeChargeCalls - makes API calls based off the charge type (OrderReference or BillingAgreement) */
|
|
|
|
private function makeChargeCalls($chargeType, $setParameters, $confirmParameters, $authorizeParameters)
|
|
{
|
|
switch ($chargeType) {
|
|
case 'OrderReference':
|
|
$response = $this->setOrderReferenceDetails($setParameters);
|
|
if ($this->success) {
|
|
$this->confirmOrderReference($confirmParameters);
|
|
}
|
|
if ($this->success) {
|
|
$response = $this->Authorize($authorizeParameters);
|
|
}
|
|
return $response;
|
|
case 'BillingAgreement':
|
|
// Get the Billing Agreement details and feed the response object to the ResponseParser
|
|
$responseObj = $this->getBillingAgreementDetails($setParameters);
|
|
// Call the function GetBillingAgreementDetailsStatus in ResponseParser.php providing it the XML response
|
|
// $baStatus is an aray containing the State of the Billing Agreement
|
|
$baStatus = $responseObj->getBillingAgreementDetailsStatus($responseObj->toXml());
|
|
if ($baStatus['State'] != 'Open') {
|
|
$response = $this->SetBillingAgreementDetails($setParameters);
|
|
if ($this->success) {
|
|
$response = $this->ConfirmBillingAgreement($confirmParameters);
|
|
}
|
|
}
|
|
// Check the Billing Agreement status again before making the Authorization.
|
|
$responseObj = $this->getBillingAgreementDetails($setParameters);
|
|
$baStatus = $responseObj->GetBillingAgreementDetailsStatus($responseObj->toXml());
|
|
if ($this->success && $baStatus['State'] === 'Open') {
|
|
$response = $this->AuthorizeOnBillingAgreement($authorizeParameters);
|
|
}
|
|
return $response;
|
|
}
|
|
}
|
|
|
|
/* GetProviderCreditDetails API Call - Get the details of the Provider Credit.
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_provider_credit_id'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function getProviderCreditDetails($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'GetProviderCreditDetails';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_provider_credit_id' => 'AmazonProviderCreditId',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* GetProviderCreditReversalDetails API Call - Get details of the Provider Credit Reversal.
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_provider_credit_reversal_id'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function getProviderCreditReversalDetails($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'GetProviderCreditReversalDetails';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_provider_credit_reversal_id' => 'AmazonProviderCreditReversalId',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* ReverseProviderCredit API Call - Reverse the Provider Credit.
|
|
*
|
|
* @param requestParameters['merchant_id'] - [String]
|
|
* @param requestParameters['amazon_provider_credit_id'] - [String]
|
|
* @optional requestParameters['credit_reversal_reference_id'] - [String]
|
|
* @param requestParameters['credit_reversal_amount'] - [String]
|
|
* @optional requestParameters['currency_code'] - [String]
|
|
* @optional requestParameters['credit_reversal_note'] - [String]
|
|
* @optional requestParameters['mws_auth_token'] - [String]
|
|
*/
|
|
|
|
public function reverseProviderCredit($requestParameters = array())
|
|
{
|
|
$parameters = array();
|
|
$parameters['Action'] = 'ReverseProviderCredit';
|
|
$requestParameters = array_change_key_case($requestParameters, CASE_LOWER);
|
|
|
|
$fieldMappings = array(
|
|
'merchant_id' => 'SellerId',
|
|
'amazon_provider_credit_id' => 'AmazonProviderCreditId',
|
|
'credit_reversal_reference_id' => 'CreditReversalReferenceId',
|
|
'credit_reversal_amount' => 'CreditReversalAmount.Amount',
|
|
'currency_code' => 'CreditReversalAmount.CurrencyCode',
|
|
'credit_reversal_note' => 'CreditReversalNote',
|
|
'mws_auth_token' => 'MWSAuthToken'
|
|
);
|
|
|
|
$responseObject = $this->setParametersAndPost($parameters, $fieldMappings, $requestParameters);
|
|
|
|
return ($responseObject);
|
|
}
|
|
|
|
/* Create an Array of required parameters, sort them
|
|
* Calculate signature and invoke the POST to the MWS Service URL
|
|
*
|
|
* @param AWSAccessKeyId [String]
|
|
* @param Version [String]
|
|
* @param SignatureMethod [String]
|
|
* @param Timestamp [String]
|
|
* @param Signature [String]
|
|
*/
|
|
|
|
private function calculateSignatureAndParametersToString($parameters = array())
|
|
{
|
|
$parameters['AWSAccessKeyId'] = $this->config['access_key'];
|
|
$parameters['Version'] = self::SERVICE_VERSION;
|
|
$parameters['SignatureMethod'] = 'HmacSHA256';
|
|
$parameters['SignatureVersion'] = 2;
|
|
$parameters['Timestamp'] = $this->getFormattedTimestamp();
|
|
uksort($parameters, 'strcmp');
|
|
|
|
$this->createServiceUrl();
|
|
|
|
$parameters['Signature'] = $this->signParameters($parameters);
|
|
$parameters = $this->getParametersAsString($parameters);
|
|
|
|
// Save these parameters in the parameters variable so that it can be returned for unit testing.
|
|
$this->parameters = $parameters;
|
|
return $parameters;
|
|
}
|
|
|
|
/* Computes RFC 2104-compliant HMAC signature for request parameters
|
|
* Implements AWS Signature, as per following spec:
|
|
*
|
|
* If Signature Version is 0, it signs concatenated Action and Timestamp
|
|
*
|
|
* If Signature Version is 1, it performs the following:
|
|
*
|
|
* Sorts all parameters (including SignatureVersion and excluding Signature,
|
|
* the value of which is being created), ignoring case.
|
|
*
|
|
* Iterate over the sorted list and append the parameter name (in original case)
|
|
* and then its value. It will not URL-encode the parameter values before
|
|
* constructing this string. There are no separators.
|
|
*
|
|
* If Signature Version is 2, string to sign is based on following:
|
|
*
|
|
* 1. The HTTP Request Method followed by an ASCII newline (%0A)
|
|
* 2. The HTTP Host header in the form of lowercase host, followed by an ASCII newline.
|
|
* 3. The URL encoded HTTP absolute path component of the URI
|
|
* (up to but not including the query string parameters);
|
|
* if this is empty use a forward '/'. This parameter is followed by an ASCII newline.
|
|
* 4. The concatenation of all query string components (names and values)
|
|
* as UTF-8 characters which are URL encoded as per RFC 3986
|
|
* (hex characters MUST be uppercase), sorted using lexicographic byte ordering.
|
|
* Parameter names are separated from their values by the '=' character
|
|
* (ASCII character 61), even if the value is empty.
|
|
* Pairs of parameter and values are separated by the '&' character (ASCII code 38).
|
|
*
|
|
*/
|
|
|
|
private function signParameters(array $parameters)
|
|
{
|
|
$signatureVersion = $parameters['SignatureVersion'];
|
|
$algorithm = "HmacSHA1";
|
|
$stringToSign = null;
|
|
if (2 === $signatureVersion) {
|
|
$algorithm = "HmacSHA256";
|
|
$parameters['SignatureMethod'] = $algorithm;
|
|
$stringToSign = $this->calculateStringToSignV2($parameters);
|
|
} else {
|
|
throw new \Exception("Invalid Signature Version specified");
|
|
}
|
|
|
|
return $this->sign($stringToSign, $algorithm);
|
|
}
|
|
|
|
/* Calculate String to Sign for SignatureVersion 2
|
|
* @param array $parameters request parameters
|
|
* @return String to Sign
|
|
*/
|
|
|
|
private function calculateStringToSignV2(array $parameters)
|
|
{
|
|
$data = 'POST';
|
|
$data .= "\n";
|
|
$data .= $this->mwsEndpointUrl;
|
|
$data .= "\n";
|
|
$data .= $this->mwsEndpointPath;
|
|
$data .= "\n";
|
|
$data .= $this->getParametersAsString($parameters);
|
|
return $data;
|
|
}
|
|
|
|
/* Convert paremeters to Url encoded query string */
|
|
|
|
private function getParametersAsString(array $parameters)
|
|
{
|
|
$queryParameters = array();
|
|
foreach ($parameters as $key => $value) {
|
|
$queryParameters[] = $key . '=' . $this->urlEncode($value);
|
|
}
|
|
|
|
return implode('&', $queryParameters);
|
|
}
|
|
|
|
private function urlEncode($value)
|
|
{
|
|
return str_replace('%7E', '~', rawurlencode($value));
|
|
}
|
|
|
|
/* Computes RFC 2104-compliant HMAC signature */
|
|
|
|
private function sign($data, $algorithm)
|
|
{
|
|
if ($algorithm === 'HmacSHA1') {
|
|
$hash = 'sha1';
|
|
} else if ($algorithm === 'HmacSHA256') {
|
|
$hash = 'sha256';
|
|
} else {
|
|
throw new \Exception("Non-supported signing method specified");
|
|
}
|
|
|
|
return base64_encode(hash_hmac($hash, $data, $this->config['secret_key'], true));
|
|
}
|
|
|
|
/* Formats date as ISO 8601 timestamp */
|
|
|
|
private function getFormattedTimestamp()
|
|
{
|
|
return gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time());
|
|
}
|
|
|
|
/* invokePost takes the parameters and invokes the httpPost function to POST the parameters
|
|
* Exponential retries on error 500 and 503
|
|
* The response from the POST is an XML which is converted to Array
|
|
*/
|
|
|
|
private function invokePost($parameters)
|
|
{
|
|
$response = array();
|
|
$statusCode = 200;
|
|
$this->success = false;
|
|
|
|
// Submit the request and read response body
|
|
try {
|
|
$shouldRetry = true;
|
|
$retries = 0;
|
|
do {
|
|
try {
|
|
$this->constructUserAgentHeader();
|
|
|
|
$httpCurlRequest = new HttpCurl($this->config);
|
|
$response = $httpCurlRequest->httpPost($this->mwsServiceUrl, $this->userAgent, $parameters);
|
|
|
|
// Split the API response into Response Body and the other parts of the response into other
|
|
list($other, $responseBody) = explode("\r\n\r\n", $response, 2);
|
|
$other = preg_split("/\r\n|\n|\r/", $other);
|
|
|
|
list($protocol, $code, $text) = explode(' ', trim(array_shift($other)), 3);
|
|
$response = array(
|
|
'Status' => (int) $code,
|
|
'ResponseBody' => $responseBody
|
|
);
|
|
|
|
$statusCode = $response['Status'];
|
|
|
|
if ($statusCode == 200) {
|
|
$shouldRetry = false;
|
|
$this->success = true;
|
|
} elseif ($statusCode == 500 || $statusCode == 503) {
|
|
|
|
$shouldRetry = true;
|
|
if ($shouldRetry && strtolower($this->config['handle_throttle'])) {
|
|
$this->pauseOnRetry(++$retries, $statusCode);
|
|
}
|
|
} else {
|
|
$shouldRetry = false;
|
|
}
|
|
} catch (\Exception $e) {
|
|
throw $e;
|
|
}
|
|
} while ($shouldRetry);
|
|
} catch (\Exception $se) {
|
|
throw $se;
|
|
}
|
|
|
|
return $response;
|
|
}
|
|
|
|
/* Exponential sleep on failed request
|
|
* @param retries current retry
|
|
* @throws Exception if maximum number of retries has been reached
|
|
*/
|
|
|
|
private function pauseOnRetry($retries, $status)
|
|
{
|
|
if ($retries <= self::MAX_ERROR_RETRY) {
|
|
$delay = (int) (pow(4, $retries) * 100000);
|
|
usleep($delay);
|
|
} else {
|
|
throw new \Exception('Error Code: '. $status.PHP_EOL.'Maximum number of retry attempts - '. $retries .' reached');
|
|
}
|
|
}
|
|
|
|
/* Create MWS service URL and the Endpoint path */
|
|
|
|
private function createServiceUrl()
|
|
{
|
|
$this->modePath = strtolower($this->config['sandbox']) ? 'OffAmazonPayments_Sandbox' : 'OffAmazonPayments';
|
|
|
|
if (!empty($this->config['region'])) {
|
|
$region = strtolower($this->config['region']);
|
|
if (array_key_exists($region, $this->regionMappings)) {
|
|
$this->mwsEndpointUrl = $this->mwsServiceUrls[$this->regionMappings[$region]];
|
|
$this->mwsServiceUrl = 'https://' . $this->mwsEndpointUrl . '/' . $this->modePath . '/' . self::SERVICE_VERSION;
|
|
$this->mwsEndpointPath = '/' . $this->modePath . '/' . self::SERVICE_VERSION;
|
|
} else {
|
|
throw new \Exception($region . ' is not a valid region');
|
|
}
|
|
} else {
|
|
throw new \Exception("config['region'] is a required parameter and is not set");
|
|
}
|
|
}
|
|
|
|
/* Based on the config['region'] and config['sandbox'] values get the user profile URL */
|
|
|
|
private function profileEndpointUrl()
|
|
{
|
|
if (!empty($this->config['region'])) {
|
|
$region = strtolower($this->config['region']);
|
|
|
|
if (array_key_exists($region, $this->sandboxProfileEndpoint) && $this->config['sandbox'] ) {
|
|
$this->profileEndpoint = $this->sandboxProfileEndpoint[$region];
|
|
} elseif (array_key_exists($region, $this->liveProfileEndpoint)) {
|
|
$this->profileEndpoint = $this->liveProfileEndpoint[$region];
|
|
} else{
|
|
throw new \Exception($region . ' is not a valid region');
|
|
}
|
|
} else {
|
|
throw new \Exception("config['region'] is a required parameter and is not set");
|
|
}
|
|
}
|
|
|
|
/* Create the User Agent Header sent with the POST request */
|
|
|
|
private function constructUserAgentHeader()
|
|
{
|
|
$this->userAgent = $this->quoteApplicationName($this->config['application_name']) . '/' . $this->quoteApplicationVersion($this->config['application_version']);
|
|
$this->userAgent .= ' (';
|
|
$this->userAgent .= 'Language=PHP/' . phpversion();
|
|
$this->userAgent .= '; ';
|
|
$this->userAgent .= 'Platform=' . php_uname('s') . '/' . php_uname('m') . '/' . php_uname('r');
|
|
$this->userAgent .= '; ';
|
|
$this->userAgent .= 'MWSClientVersion=' . self::MWS_CLIENT_VERSION;
|
|
$this->userAgent .= ')';
|
|
}
|
|
|
|
/* Collapse multiple whitespace characters into a single ' ' and backslash escape '\',
|
|
* and '/' characters from a string.
|
|
* @param $s
|
|
* @return string
|
|
*/
|
|
|
|
private function quoteApplicationName($s)
|
|
{
|
|
$quotedString = preg_replace('/ {2,}|\s/', ' ', $s);
|
|
$quotedString = preg_replace('/\\\\/', '\\\\\\\\', $quotedString);
|
|
$quotedString = preg_replace('/\//', '\\/', $quotedString);
|
|
return $quotedString;
|
|
}
|
|
|
|
/* Collapse multiple whitespace characters into a single ' ' and backslash escape '\',
|
|
* and '(' characters from a string.
|
|
*
|
|
* @param $s
|
|
* @return string
|
|
*/
|
|
|
|
private function quoteApplicationVersion($s)
|
|
{
|
|
$quotedString = preg_replace('/ {2,}|\s/', ' ', $s);
|
|
$quotedString = preg_replace('/\\\\/', '\\\\\\\\', $quotedString);
|
|
$quotedString = preg_replace('/\\(/', '\\(', $quotedString);
|
|
return $quotedString;
|
|
}
|
|
}
|