Платежный шлюз 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
файлы!
У нас есть серверы 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
Сначала я догадался, что это может иметь какое-то отношение к 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
Это ошибка, которая существует всегда! Таким образом, реальная проблема заключалась не в том, что документы были на иностранном языке, или в том, что у 2-го по величине банка в мире есть неполная документация (но на самом деле, не хватает того, что ваш модуль зависит от другого пользовательского модуля … правда? Работало ли это когда-либо? до этого?) но пользовательский модуль был скомпилирован для другой версии PHP.
Подходящий мем:
// #micdrop
Других решений пока нет …