Я хочу иметь возможность динамически добавлять addOns в списки заказов Braintree. Если у определенного заказа есть один addOn, он добавил бы один, если он имеет два, он добавит два и т. Д.
Кажется, я уже близко, но получаю ошибки.
У меня есть функция, которая, кажется, работает хорошо, и несколько вариантов дали разные результаты. Глобальные переменные содержат ранее установленную информацию из массива 'create customer' и другие данные из нашей базы данных клиентов.
function dynamicAddOn($plan) {
global $planId;
global $pymtToken;
global $giftlists;
global $countgifts;
global $result;
global $gateway;
$myArray = array([
'paymentMethodToken' => $pymtToken,
'planId' => $planId,
]);
if ($countgifts>0) {
// Get our previously created addOns from Braintree, extract what we need with array_column():
$addOns_arrs = $gateway->addOn()->all();
$addOncols = array_column($addOns_arrs, 'id', 'amount');
$giftdisc='';
$i=0;
// giftlists is an array that holds the gifts subs the user has ordered
foreach ($giftlists as $giftlist) {
$giftid[$i]=$giftlist['id'];
$giftcl[$i]=$giftlist['class'];
$giftdisc=$giftlist['discount'];
$a=0;
// match the gift sub type our customer wants with the addOn type from Braintree:
foreach ($addOncols as $addOncol) {
if ($giftcl[$i] == substr($addOncol,-1)) { // last character of BT class ID
$addOnid[$a]=$addOncol;
$addOngiftid[$a]=$giftid[$i];
// add them to the array
$myArray[0]['addOns']['add'][] = ['inheritedFromId' => $addOnid[$a]];
}
$a++;
}
$i++;
}
if ($giftdisc>'') {
// add discount
$myArray[] = ['discounts' => ['add' => ['inheritedFromId' => $giftdisc]]];
}
// a couple ways to get the array:
return $myArray;
//return call_user_func_array('array_merge', $myArray);
}
}
$myArray=dynamicAddOn($planId);
// Insert the created array into the Braintree subscription order:
$result = $gateway->subscription()->create($myArray);
Если я просто использую return $myArray;
, это будет работать, если я не попытаюсь добавить скидку. В этом случае я получаю сообщение об ошибке: «Неустранимая ошибка: Uncaught InvalidArgumentException: неверные ключи.»
Если я просто использую return call_user_func_array('array_merge', $myArray);
, чтобы немного сгладить массив (убирает верхний уровень [0] => Array
и т. Д.), Я получаю ошибку "Неверный формат запроса".
Созданный массив ($ myArray) выглядит следующим образом:
Array
(
[0] => Array
(
[paymentMethodToken] =>
[planId] => cl1
[addOns] => Array
(
[add] => Array
(
[0] => Array
(
[inheritedFromId] => gcl2
)
[1] => Array
(
[inheritedFromId] => gcl1
)
)
)
)
[1] => Array
(
[discounts] => Array
(
[add] => Array
(
[inheritedFromId] => htspecial
)
)
)
)
Я думаю, что строки [1] => Array
создают проблему для Брэйнтри, поэтому я использовал call_user_func_array('array_merge', $myArray);
, который удаляет их (за исключением тех, которые находятся вокруг [inheritedFromId] => gcl1
записей, но Брейнтри, кажется, справляется с этими проблемами). 1021 *
Как я уже сказал, использование массива как есть, если только массив скидок не добавлен, хотя он выдает предупреждение: «Предупреждение: XMLWriter :: startElement (): недопустимое имя элемента в C: \ xampp \ apps \ wordpress \ subs.ht.new \ vendor \ braintree \ braintree_php \ lib \ Braintree \ Xml \ Generator.php в строке 73 ".
Спасибо за любые идеи, как это исправить.