Мой код создает массив токенов в порядке, необходимом для jwt, однако, когда я запускаю скрипт кодирования, он повторно упорядочивается в алфавитном порядке. Это приводит к ошибке при отправке в Google. Похоже, что последовательность переупорядочена с помощью функции сортировки, но это не так. Я ожидаю, что функции взрыва взрыва вызывают это, но я не могу найти способ исправить!
Повторяющийся массив «$ Token»:
Array ( [iss] => 12345605871924644272
[aud] => Google
[typ] => google/payments/inapp/subscription/v1
[exp] => 1414875564
[iat] => 1414871964
[request] => array ( [name] => Invoice Number: 106599
[description] => Supported Service
[sellerData] =>user_id:1224245,
offer_code:3098576987,affiliate:aksdfbovu9j
[initialPayment] => Array( [price] => 100
[currencyCode] => GBP
[paymentType] => prorated )
[recurrence] => Array ( [price] => 30
[currencyCode] => GBP
[startTime] => 3600 [frequency] => Monthly
[numRecurrences] => 24
)
)
)
функция кодирования JWT затем вызывается с
$jwtToken = JWT::encode($Token, $sellerSecretKey);
функция скрипта называется
public static function encode($payload, $key, $algo = 'HS256')
{
$header = array('typ' => 'JWT', 'alg' => $algo);
$segments = array();
$segments[] = JWT::urlsafeB64Encode(JWT::jsonEncode($header));
$segments[] = JWT::urlsafeB64Encode(JWT::jsonEncode($payload));
$signing_input = implode('.', $segments);
$signature = JWT::sign($signing_input, $key, $algo);
$segments[] = JWT::urlsafeB64Encode($signature);
return implode('.', $segments);
}
/**
* @param string $msg The message to sign
* @param string $key The secret key
* @param string $method The signing algorithm
*
* @return string An encrypted message
*/
public static function sign($msg, $key, $method = 'HS256')
{
$methods = array(
'HS256' => 'sha256',
'HS384' => 'sha384',
'HS512' => 'sha512',
);
if (empty($methods[$method])) {
throw new DomainException('Algorithm not supported');
}
return hash_hmac($methods[$method], $msg, $key, true);
}
Возвращенный jwt имеет правильные элементы, но в неправильной последовательности. желаемая последовательность показывается первой, а моя — после
{
"iss" : "1337133713371337",
"aud" : "Google",
"typ" : "google/payments/inapp/subscription/v1",
"exp" : "1309988959",
"iat" : "1409988959",
"request" :{
"name" : "Weekly Cake",
"description" : "Virtual chocolate cake to fill your virtual tummy every week",
"sellerData" : "user_id:1224245,offer_code:3098576987,affiliate:aksdfbovu9j",
"initialPayment" : {
"price" : "1.49",
"currencyCode" : "USD",
"paymentType" : "prorated",
},
"recurrence" : {
"price" : "4.99",
"currencyCode" : "USD",
"startTime" : "1309989638",
"frequency" : "monthly",
"numRecurrences" : "12",
}
}
}
мой
{
"aud": "Google",
"iss": "12345605871924644272",
"request": {
"initialPayment": {
"paymentType": "prorated",
"price": "100",
"currencyCode": "GBP"},
"recurrence": {
"numRecurrences": "24",
"price": "30",
"frequency": "Monthly",
"currencyCode": "GBP",
"startTime": "3600"},
"sellerData": "user_id:1224245,offer_code:3098576987,affiliate:aksdfbovu9j",
"name": "Invoice Number: 106599",
"description": "Supported Service"},
"exp": 1414873724,
"iat": 1414870124,
"typ": "google/payments/inapp/subscription/v1"}
Заказ не должен иметь значения. Загляни в свой startTime
значение (3600
).
startTime: номер.
Необязательный. Время в секундах от эпохи, чтобы начать повторять заряд. Первое повторение произойдет во время, указанное в этом поле.
Hth …
Других решений пока нет …