linux — Платежный шлюз ICBC — PHP infosec.so Динамические общие библиотеки

Платежный шлюз ICBC — PHP infosec.so Динамические общие библиотеки

начало

Я собираюсь выписать весь свой процесс в надежде, что это поможет несчастной душе решить его / ее / их проблему так как Я не мог найти много, если что-нибудь! на этой интеграции платежей ICBC.

ICBC является вторым по величине банком в мире (на момент написания этой статьи), и поэтому я подумал, что было бы довольно легко добавить интеграцию шлюза платежей b2c, соединяющую их систему.

Получение документации и активов

После получения (по электронной почте) 电子商务 商户 开发 指南 .zip (перевод: e-commerce_business_development_guide.zip) Проблема была, она была неполной и не включала динамические библиотеки (.so) для загрузки PHP.

«Неудача не вариант» — Эл Рейнарт и Билл Бройлс

После полета в Шанхай, чтобы встретиться с вице-президентом ICBC по электронной коммерции (e-b2c), я получил на USB-накопителе другой комплект документации (V1.0.0.6).

Примечание по извлечению .zip с китайскими именами файлов

Ubuntu / Linux не нравится это! Простое использование $ unzip 电子商务 商户 开发 指南 .zip отображает папки с китайскими именами, всевозможные испорченные и «непатентованные» имена папок: å·¥è¡b2cç­¾åæ¥å£_v2.0.0.1_phpapi_RedHat AES V5_64

После попытки определить кодировку и кучу других глупостей 7z волшебным образом сработал:

$ 7z x 电子商务 商户 开发 指南 .zip

Попробуйте все сначала

После найма технического переводчика мы в основном узнали, что это был тот же набор, который я получил раньше, но на этот раз с .so файлы!

содержимое 电子商务 商户 开发 指南 .zip

У нас есть серверы EC2 AMI AWS в США и серверы Aliyun Ubuntu в Китае:

Убунту — Алюне

$ cat /proc/version
Linux version 3.13.0-65-generic (buildd@lgw01-26) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #106-Ubuntu SMP Fri Oct 2 22:08:27 UTC 2015

$ php -v
PHP 5.6.18-1+deb.sury.org~trusty+1 (cli)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Xdebug v2.3.2, Copyright (c) 2002-2015, by Derick Rethans
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

AMI — AWS

$ cat /proc/version
Linux version 3.14.48-33.39.amzn1.x86_64 (mockbuild@gobi-build-60007) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Tue Jul 14 23:43:07 UTC 2015

$ php -v
PHP 5.6.19 (cli) (built: Apr  1 2016 22:29:27)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

«Amazon Linux AMI основан на RHEL 5.x и частях RHEL6. Один из
Нашей целью является двоичная совместимость с RHEL 5.x, и поэтому
CentOS5.x. Проницательные пользователи заметят, что наше ядро ​​основано на
2.6.34 … «-Amazon для разработчиков

Убунту — Алюне

$ php -v
PHP 5.6.19-1+deb.sury.org~trusty+1 (cli)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Xdebug v2.3.2, Copyright (c) 2002-2015, by Derick Rethans
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

$ cat /proc/version
Linux version 3.13.0-65-generic (buildd@lgw01-26) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #106-Ubuntu SMP Fri Oct 2 22:08:27 UTC 2015

Macbook Pro — среда разработки

$ sw_vers
ProductName:  Mac OS X
ProductVersion:   10.11.4
BuildVersion: 15E65

Xcode
Version: 7.3
Obtained from: Mac App Store
Last Modified: 3/23/16, 2:41 PM
Kind: Intel
64-Bit (Intel): Yes
Developer Tools: Version: 7.3 (7D175)

$ php -v
PHP 5.6.19 (cli) (built: Mar 30 2016 22:34:49)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

После попытки загрузить все .so
Я написал хороший маленький скрипт, чтобы просто проверить их все:

#!/bin/bash

INI='/abs/path/to/php/conf.d/ext-icbc_infosec.ini'

find . -name '*.so*' | while IFS= read -r FILE; do
SO_NAME="$(cd "$(dirname "$FILE")" && pwd)/$(basename "$FILE")"
# nm -D $FILE > "$(cd "$(dirname "$FILE")" && pwd)/nm-D.$(basename "$FILE")"
echo "[-- $SO_NAME --]" >> $LOG
> $INI
echo "extension=\"$SO_NAME\""echo "extension=\"$SO_NAME\"" >> $INI

echo "$(php -v | grep "Warning")"
echo $OUTPUT

echo ""done

exit 0

И захватил вывод, запустив скрипт в корне каталога LIB следующим образом:

$ sudo ./test_api_so.sh >& aliyun.ubuntu-script_log.txt
Обратите внимание >& pipe — должен был захватить вывод stderr

Который отображал вывод на сервере AMI EC2 AWS, а также на моем локальном Macbook:

Предупреждение: запуск PHP: недопустимая библиотека (возможно, не библиотека PHP)
‘/var/www/vhosts/scripts/LIB/Linux/v2.0.0.1_phpapi_RedHat AES
V5_64 / product / libcrypto.so ‘в Unknown в строке 0

0

Решение

Решение!

Сначала я догадался, что это может иметь какое-то отношение к mcrypt (этот ублюдок — это всегда вызывает у меня горе), но:

$ php -m | grep "mcrypt"mcrypt

$ grep -Hrv ";" /etc/php5 | grep -i "extension=" | grep "mcrypt"/etc/php5/mods-available/mcrypt.ini:extension=mcrypt.so

Тогда я заметил несоответствие вывод логов только на алиюне принимал Ubuntu:

[- /var/www/vhosts/scripts/LIB/Linux/v2.0.0.1_phpapi_RedHat AES
V5_64 / product / libinfosec_api.so -] Предупреждение PHP: Запуск PHP: неверный
библиотека (возможно, не библиотека PHP)
‘/var/www/vhosts/scripts/LIB/Linux/v2.0.0.1_phpapi_RedHat AES
V5_64 / product / libinfosec_api.so ‘в Unknown в строке 0

[- /var/www/vhosts/scripts/LIB/Linux/v2.0.0.1_phpapi_RedHat AES
V5_64 / product / infosec.so -] Предупреждение PHP: Запуск PHP: невозможно загрузить
динамическая библиотека
‘/var/www/vhosts/scripts/LIB/Linux/v2.0.0.1_phpapi_RedHat AES
V5_64 / product / infosec.so ‘- libinfosec_api.so: не может открыть общий доступ
объектный файл: нет такого файла или каталога в Неизвестно в строке 0

[- /var/www/vhosts/scripts/LIB/Linux/v2.0.0.1_phpapi_RedHat AES
V5_64 / product / libcrypto.so.1.0.0 -] Предупреждение PHP: Запуск PHP:
Неверная библиотека (возможно, не библиотека PHP)
‘/var/www/vhosts/scripts/LIB/Linux/v2.0.0.1_phpapi_RedHat AES
V5_64 / product / libcrypto.so.1.0.0 ‘в Unknown в строке 0

Я думал: это странно, поэтому я копался в этом. Это кайдзоу статья был чрезвычайно полезен при создании следующего вывода:

$ readelf -d infosec.so

Dynamic section at offset 0x3028 contains 22 entries:
Tag        Type                         Name/Value
0x0000000000000001 (NEEDED)             Shared library: [libinfosec_api.so]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
0x000000000000000e (SONAME)             Library soname: [infosec.so]

$ ldd infosec.so
linux-vdso.so.1 =>  (0x00007fffd5fc6000)
libinfosec_api.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f72ceb09000)
/lib64/ld-linux-x86-64.so.2 (0x00007f72ceece000)

$ ldd libinfosec_api.so
linux-vdso.so.1 =>  (0x00007ffed7f56000)
libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f48ecf77000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f48ecbb2000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f48ec9ae000)
/lib64/ld-linux-x86-64.so.2 (0x00007f48ed352000)

Кредит: IcePHP не может открыть общий объектный файл: нет такого файла или каталога в Неизвестно в строке 0

Ты видишь это! $ ldd infosec.so … libinfosec_api.so => ​​не найден. Я был на что-то.

Изучение включения во время выполнения динамических библиотек

$ sudo ldconfig -v
...
/usr/lib:

Кредит: https://unix.stackexchange.com/a/210521

Нашел проблему

Итак, проблема была не в том, что я не следовал инструкциям правильно, а в том, что ICBC неправильно связал их динамическую .so библиотеку! И не было никаких документов об этом!

Итак, я скопировал v2.0.0.1_phpapi_RedHat AES V5_64/product/libinfosec_api.so в /usr/lib/переместил ответ infosec.so в каталог модулей php (абсолютно не было проблем с разрешениями или другими серверными махинациями) и заново добавили расширение PHP:
расширение = «/ USR / Lib / php5 / 20131226 / infosec.so»

$ php -v

Warning: PHP Startup: infosec: Unable to initialize module
Module compiled with module API=20100525
PHP    compiled with module API=20131226
These options need to match
in Unknown on line 0
PHP 5.6.19-1+deb.sury.org~trusty+1 (cli)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Xdebug v2.3.2, Copyright (c) 2002-2015, by Derick Rethans
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

AHHAA !!! — Заключение

Это ошибка, которая существует всегда! Таким образом, реальная проблема заключалась не в том, что документы были на иностранном языке, или в том, что у 2-го по величине банка в мире есть неполная документация (но на самом деле, не хватает того, что ваш модуль зависит от другого пользовательского модуля … правда? Работало ли это когда-либо? до этого?) но пользовательский модуль был скомпилирован для другой версии PHP.

Подходящий мем:

введите описание изображения здесь

// #micdrop

-2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]