ICBC 支付网关 – PHP infosec.so 动态共享库

ICBC Payment Gateway – PHP infosec.so Dynamic Shared Libraries

ICBC 支付网关 – PHP infosec.so 动态共享库

开始

我要写下我所有的过程,希望它能帮助一些不幸的灵魂解决his/her/their问题因为我找不到太多如果有什么!关于此 ICBC 支付集成。

ICBC 是世界第二大银行(截至撰写本文时),因此我认为添加连接到他们系统的 b2c 支付网关集成相当容易。


获取文档和资产

收到(通过电子邮件)电子业务商家开发指南.zip(翻译:e-commerce_business_development_guide.zip)问题是,它不完整,并且没有包含动态库(.so) PHP 加载。

"Failure Is Not An Option" –Al Reinart and Bill Broyles

在飞到上海会见中国工商银行电子商务银行 (e-b2c) 副总裁后,我在 USB 驱动器上得到了另一套文档 (V1.0.0.6)。

关于解压带有中文文件名的 .zip 文件的注意事项

Ubuntu/Linux不喜欢这样!简单地使用 $ unzip 电子商务商家开发指南.zip 呈现中文名称的文件夹各种混乱,和 'un-pathable' 文件夹名称: å·¥è¡b2cç­¾åæ¥å£_v2.0.0.1_phpapi_RedHat AES V5_64

在尝试确定编码和其他一堆废话之后,7z 神奇地起作用了:

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

先尝试一切

聘请了技术翻译后,我们基本上发现他们是我之前收到的同一套,但这次是 .so 文件!

我们有在美国托管的EC2 AMI AWS服务器和在中国内陆托管的阿里云Ubuntu服务器:

Ubuntu - Alyune

$ 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

"The Amazon Linux AMI is based on RHEL 5.x and parts of RHEL6. One of our goals is binary compatibility with RHEL 5.x, and therefore CentOS5.x. Astute users will note that our kernel is based on 2.6.34..." -Amazon developer forms

Ubuntu - Alyune

$ 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
注意 >& 管道 – 必须捕获 stderr 输出

在 AMI EC2 AWS 服务器和我的本地 Macbook 上呈现输出:

Warning: PHP Startup: Invalid library (maybe not a PHP library) '/var/www/vhosts/scripts/LIB/Linux/v2.0.0.1_phpapi_RedHat AES V5_64/product/libcrypto.so' in Unknown on line 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 Warning: PHP Startup: Invalid library (maybe not a PHP library) '/var/www/vhosts/scripts/LIB/Linux/v2.0.0.1_phpapi_RedHat AES V5_64/product/libinfosec_api.so' in Unknown on line 0

[-- /var/www/vhosts/scripts/LIB/Linux/v2.0.0.1_phpapi_RedHat AES V5_64/product/infosec.so --] PHP Warning: PHP Startup: Unable to load dynamic library '/var/www/vhosts/scripts/LIB/Linux/v2.0.0.1_phpapi_RedHat AES V5_64/product/infosec.so' - libinfosec_api.so: cannot open shared object file: No such file or directory in Unknown on line 0

[-- /var/www/vhosts/scripts/LIB/Linux/v2.0.0.1_phpapi_RedHat AES V5_64/product/libcrypto.so.1.0.0 --] PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) '/var/www/vhosts/scripts/LIB/Linux/v2.0.0.1_phpapi_RedHat AES V5_64/product/libcrypto.so.1.0.0' in Unknown on line 0

我想:这很奇怪,所以我深入研究了它。 This kaizou article 对生成以下输出非常有帮助:

$ 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 cannot open shared object file: No such file or directory in Unknown on line 0

你看到了吗! $ ldd infosec.so ... libinfosec_api.so => 未找到。我在做某事。

研究动态库的运行时包含

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

来源:https://unix.stackexchange.com/a/210521

找到问题

所以,问题不是我没有按照说明正确操作,而是 ICBC 将他们的 Dynamic .so 库链接错了!并且没有包含任何关于它的文档!

所以,我将 v2.0.0.1_phpapi_RedHat AES V5_64/product/libinfosec_api.so 复制到 /usr/lib/,将相应的 infosec.so 移动到 php 模块目录(绝对不会出现权限或其他问题服务器恶作剧)并重新添加 PHP 扩展名: extension="/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!!! — 结论

这是一个永远存在的错误!所以真正的问题不是文档是外语的,或者世界第二大银行的文档不完整(但实际上,缺少你的模块依赖于另一个自定义模块......真的吗?这曾经有效吗之前?)但是自定义模块是为不同的 PHP 版本编译的。

一个合适的模因:

// #micdrop