如何创建Braintree订阅数组,动态添加插件和结帐折扣

时间:2019-04-08 06:24:03

标签: multidimensional-array dynamic braintree-sandbox

我希望能够将'addOns'动态添加到Braintree订阅订单数组中。如果特定订单有一个addOn,它将添加一个,如果有两个,则将添加两个,等等。

我似乎越来越近了,但是遇到了错误。

我有一个似乎运行良好的功能,并且进行了一些改动产生了不同的结果。全局变量从“创建客户”数组中引入先前建立的信息,并从我们的客户数据库中引入东西。

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;,它会起作用,除非我尝试增加折扣。在那种情况下,我得到错误:“致命错误:未捕获的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行对Braintree造成了问题,这就是为什么我使用call_user_func_array('array_merge', $myArray);来删除它们(除了[inheritedFromId] => gcl1条目周围的那些,但是Braintree似乎应付那些还可以。

正如我所说,除非添加折扣数组,否则按原样使用该数组是可行的,尽管它确实会发出警告:“警告:XMLWriter :: startElement():C:\ xampp \ apps \ wordpress中的无效元素名称\ subs.ht.new \ vendor \ braintree \ braintree_php \ lib \ Braintree \ Xml \ Generator.php行73“。

感谢您提供有关解决此问题的任何想法。

0 个答案:

没有答案