我希望能够将'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“。
感谢您提供有关解决此问题的任何想法。