XmlPacker.php 1015 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. <?php
  2. declare(strict_types=1);
  3. namespace Yansongda\Pay\Packer;
  4. use Yansongda\Pay\Contract\PackerInterface;
  5. class XmlPacker implements PackerInterface
  6. {
  7. public function pack(array $payload): string
  8. {
  9. $xml = '<xml>';
  10. foreach ($payload as $key => $val) {
  11. $xml .= is_numeric($val) ? '<'.$key.'>'.$val.'</'.$key.'>' :
  12. '<'.$key.'><![CDATA['.$val.']]></'.$key.'>';
  13. }
  14. $xml .= '</xml>';
  15. return $xml;
  16. }
  17. public function unpack(string $payload): ?array
  18. {
  19. if (empty($payload)) {
  20. return [];
  21. }
  22. if (PHP_VERSION_ID < 80000) {
  23. libxml_disable_entity_loader();
  24. }
  25. $data = json_decode(json_encode(
  26. simplexml_load_string($payload, 'SimpleXMLElement', LIBXML_NOCDATA),
  27. JSON_UNESCAPED_UNICODE
  28. ), true);
  29. if (JSON_ERROR_NONE === json_last_error()) {
  30. return $data;
  31. }
  32. return null;
  33. }
  34. }