0

我在使用我在 github 上找到的 Mercer-sdk-php 解决问题时遇到了麻烦。出于某种原因,它抛出了这个错误。我尝试查看代码,但我不理解它或看到问题。

致命错误:调用 /home/content/08/10639508/html/wp-content/plugins/donation-manager/library/vendor/paypal/paypal-sdk-core-php-bc7822a 中未定义的方法 stdClass::toXMLString() /lib/PPXmlMessage.php 第 89 行

    <?php

/** * @author */ 抽象类 PPXmlMessage {

/**
 * @return string
 */
public function toSOAP()
{
    return $this->toXMLString();
}



/**
 * @return string
 */
public function toXMLString()
{
    if (count($properties = get_object_vars($this)) >= 2 && array_key_exists('value', $properties)) {
        $attributes = array();
        foreach (array_keys($properties) as $property) {
            if ($property === 'value') continue;
            if (($annots = PPUtils::propertyAnnotations($this, $property)) && isset($annots['attribute'])) {
                if (($propertyValue = $this->{$property}) === NULL || $propertyValue == NULL) {
                    $attributes[] = NULL;
                    continue;
                }

                $attributes[] = $property . '="' . PPUtils::escapeInvalidXmlCharsRegex($propertyValue) . '"';
            }
        }

        if (count($attributes)) {
            return implode(' ', $attributes) . '>' . PPUtils::escapeInvalidXmlCharsRegex($this->value);
        }
    }

    $xml = array();
    foreach ($properties as $property => $defaultValue) {
        if (($propertyValue = $this->{$property}) === NULL || $propertyValue == NULL) {
            continue;
        }

        if (is_array($defaultValue) || is_array($propertyValue)) {
            foreach ($propertyValue as $item) {
                if (!is_object($item)) {
                    $xml[] = $this->buildProperty($property, $item);
                }else{
                    $xml[] = $this->buildProperty($property, $item);
                }
            }

        } else {
            $xml[] = $this->buildProperty($property, $propertyValue);
        }
    }

    return implode($xml);
}



/**
 * @param string $property
 * @param PPXmlMessage|string $value
 * @param string $namespace
 * @return string
 */
private function buildProperty($property, $value, $namespace = 'ebl')
{
    $annotations = PPUtils::propertyAnnotations($this, $property);
    if (!empty($annotations['namespace'])) {
        $namespace = $annotations['namespace'];
    }
    if (!empty($annotations['name'])) {
        $property = $annotations['name'];
    }

    $el = '<' . $namespace . ':' . $property;
    if (!is_object($value)) {
        $el .= '>' . PPUtils::escapeInvalidXmlCharsRegex($value);

    } else {
        if (substr($value = $value->toXMLString(), 0, 1) === '<' || $value=='') {
            $el .= '>' . $value;

        } else {
            $el .= ' ' . $value;
        }
    }

    return $el . '</' . $namespace . ':' . $property . '>';
}



/**
 * @param array $map
 * @param string $prefix
 */
public function init(array $map = array(), $prefix = '')
{
    if (empty($map)) {
        return;
    }

    if (($first = reset($map)) && !is_array($first) && !is_numeric(key($map))) {
        parent::init($map, $prefix);
        return;
    }

    $propertiesMap = PPUtils::objectProperties($this);
    $arrayCtr = array();        
    foreach ($map as $element) {

        if (empty($element) || empty($element['name'])) {
            continue;

        } elseif (!array_key_exists($property = strtolower($element['name']), $propertiesMap)) {
            if (!preg_match('~^(.+)[\[\(](\d+)[\]\)]$~', $property, $m)) {
                continue;
            }

            $element['name'] = $m[1];
            $element['num'] = $m[2];
        }
        $element['name'] = $propertiesMap[strtolower($element['name'])];
        if(PPUtils::isPropertyArray($this, $element['name'])) {             
            $arrayCtr[$element['name']] = isset($arrayCtr[$element['name']]) ? ($arrayCtr[$element['name']]+1) : 0;             
            $element['num'] = $arrayCtr[$element['name']];
        } 
        if (!empty($element["attributes"]) && is_array($element["attributes"])) {
            foreach ($element["attributes"] as $key => $val) {
                $element["children"][] = array(
                    'name' => $key,
                    'text' => $val,
                );
            }

            if (isset($element['text'])) {
                $element["children"][] = array(
                    'name' => 'value',
                    'text' => $element['text'],
                );
            }

            $this->fillRelation($element['name'], $element);

        } elseif (!empty($element['text'])) {
            $this->{$element['name']} = $element['text'];

        } elseif (!empty($element["children"]) && is_array($element["children"])) {
            $this->fillRelation($element['name'], $element);
        }
    }       
}



/**
 * @param string $property
 * @param array $element
 */
private function fillRelation($property, array $element)
{
    if (!class_exists($type = PPUtils::propertyType($this, $property))) {
        trigger_error("Class $type not found.", E_USER_NOTICE);
        return; // just ignore
    }

    if (isset($element['num'])) { // array of objects
        $this->{$property}[$element['num']] = $item = new $type();
        $item->init($element['children']);

    } else {
        $this->{$property} = new $type();
        $this->{$property}->init($element["children"]);
    }
}

}

4

2 回答 2

2

我有这个完全相同的错误(使用我的实时应用程序 - 它在我的测试代码中运行良好)。我最终意识到,当我将我的测试代码复制到实时环境中并将我的凭据和 URL 从沙盒更改为实时的时……我在调用 SetExpressCheckout 之前以某种方式删除了初始化 PaymentDetailsType 对象的代码行。所以这个错误看起来很不相关,但这只是在调用 PayPal 之前设置对象的问题。

于 2014-01-22T18:49:24.213 回答
0

您是否在 PaymentDetail 记录中使用了 json_encode/decode?看来 PayPal 对组件类很讲究;stdClass (由 json_decode 生成)不会削减它。序列化有效,但有关于使用它的警告。

于 2014-01-22T17:39:10.607 回答