Как создать массив подписок Braintree, динамически добавлять дополнения и скидки на оформление заказа - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу иметь возможность динамически добавлять 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 ".

Спасибо за любые идеи, как это исправить.

...