Compare commits
59 Commits
1d7459e7de
...
933bfbcfef
| Author | SHA1 | Date | |
|---|---|---|---|
| 933bfbcfef | |||
|
|
34f12c8a33 | ||
|
|
c537d7a4db | ||
|
|
66d86c5058 | ||
|
|
9d48ce9f07 | ||
|
|
e3bcca6415 | ||
|
|
140fb486f6 | ||
|
|
9d13324545 | ||
|
|
ffabfd41ea | ||
|
|
7771b8341c | ||
|
|
a5de3fa43a | ||
|
|
0c5291c1b7 | ||
|
|
2358cd9ed5 | ||
|
|
96af01dc68 | ||
|
|
8be0ff8a97 | ||
|
|
0b249f3748 | ||
|
|
9b1c5e77e6 | ||
|
|
7207840314 | ||
|
|
e07f95b4e4 | ||
|
|
51ed0b64ca | ||
|
|
d14cc52908 | ||
|
|
8d46b53462 | ||
|
|
f801fcc78a | ||
|
|
41a43dfe34 | ||
|
|
f896e067bf | ||
|
|
dc027fb324 | ||
|
|
e0622a0b35 | ||
|
|
817a8fe4ce | ||
|
|
fe8171cfd0 | ||
|
|
bedd9f1d8a | ||
|
|
e31bddb23d | ||
|
|
5ebc39762d | ||
|
|
cef9717212 | ||
|
|
4e7b385439 | ||
|
|
e981e07d85 | ||
|
|
e4b2bdbcc2 | ||
|
|
7f9354782c | ||
|
|
d08c0c3e55 | ||
|
|
d6cef37802 | ||
|
|
6fd962b58d | ||
|
|
02d3fbb561 | ||
|
|
f2625b99f2 | ||
|
|
6230dce92e | ||
|
|
cc26d5bff3 | ||
|
|
ff395f5338 | ||
|
|
058675e81c | ||
|
|
5048b5daac | ||
|
|
d5e0a1225f | ||
|
|
3ffa66bbc9 | ||
|
|
40ff9778b5 | ||
|
|
88ba48a324 | ||
|
|
3100c27f6e | ||
|
|
331e20ad2e | ||
|
|
b9c7603c36 | ||
|
|
6e9af70b06 | ||
|
|
1970aed910 | ||
|
|
e16af1ec19 | ||
|
|
f40dff7324 | ||
|
|
8d8aeae2c1 |
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
sync.sh
|
||||
build.sh
|
||||
.idea/
|
||||
0
EXPERIMENTAL
Normal file
0
EXPERIMENTAL
Normal file
201
LICENSE
Normal file
201
LICENSE
Normal file
@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
93
README.md
93
README.md
@ -0,0 +1,93 @@
|
||||
# wxwork_finance_sdk_wrapper
|
||||
|
||||
企业微信-会话内容存档PHP扩展
|
||||
|
||||
|
||||
## 依赖
|
||||
企业微信提供的sdk;
|
||||
|
||||
PHP VERSION >= 7.0
|
||||
* 已支持 php8 感谢 @singee77 pr
|
||||
|
||||
openssl扩展
|
||||
|
||||
## 安装步骤及要求
|
||||
```
|
||||
$INSATLL_PHP_PATH/bin/phpize
|
||||
|
||||
./configure --with-php-config=$INSTALL_PHP_PATH/php-config --with-wxwork-finance-sdk=$WXWORK_FINANCE_C_SDK_PATH
|
||||
|
||||
make && make install
|
||||
```
|
||||
php.ini 增加 extension=wxwork_finance_sdk.so
|
||||
|
||||
## API
|
||||
```php
|
||||
WxworkFinanceSdkExcption::__construct();
|
||||
```
|
||||
|
||||
```php
|
||||
WxworkFinanceSdk::__construct(string $corpId, string $secret, array $options);
|
||||
string $corpId 企业号
|
||||
|
||||
string $secret 秘钥
|
||||
|
||||
array $options = [ // 可选参数
|
||||
'proxy_host' => string,
|
||||
'proxy_password' => string,
|
||||
'timeout' => 10, // 默认超时时间为10s
|
||||
]
|
||||
```
|
||||
|
||||
```php
|
||||
string WxworkFinanceSdk::getChatData(int $seq, int $limit);
|
||||
* 拉取聊天数据
|
||||
$seq 起始位置
|
||||
$limit 获取条数
|
||||
```
|
||||
|
||||
```php
|
||||
bool WxworkFinanceSdk::downloadMedia(string $sdkfileid, string $saveTo)
|
||||
* 下载资源
|
||||
$sdkfileid 资源id。来自chat 中的数据sdkfileid
|
||||
$saveTo 本地保存的路径
|
||||
```
|
||||
|
||||
```php
|
||||
array WxworkFinanceSdk::getMediaData(string $sdkfileid, string $indexBuf='');
|
||||
* 拉取静态资源数据,用于可以支持追加模式的三方存储平台
|
||||
返回的数据结构体
|
||||
$ret = [
|
||||
'data' => '' // string 返回的数据
|
||||
'nextIndex' => 'ddd' // string 获取下一段数据的句柄
|
||||
'isFinished' => int // 1 数据已拉取完毕
|
||||
];
|
||||
|
||||
|
||||
```
|
||||
* 感谢 @zhanzhaopeng1 PR
|
||||
|
||||
|
||||
```php
|
||||
string WxworkFinanceSdk::decryptData(string $randomKey, string $encryptStr);
|
||||
* 解密数据
|
||||
$randomKey 通过openssl解密后的key
|
||||
$encryptStr chats 的加密数据
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 已知问题
|
||||
1. free(): invalid pointer
|
||||
* 定位intl扩展的冲突问题. php -m |grep intl 建议重新编译php 取消intl扩展
|
||||
|
||||
2. 与swoole的扩展冲突
|
||||
* 优先加载wxwork_finance_sdk.so 后加载swoole 【@tisswb】
|
||||
|
||||
## 示例
|
||||
|
||||
wxwork_finance_sdk.php
|
||||
|
||||
Alipay
|
||||
|
||||
<img src="https://github.com/pangdahua/php7-wxwork-finance-sdk/blob/sponsor/imgs/Alipay.png" width="230" height="230" />
|
||||
92
config.m4
Normal file
92
config.m4
Normal file
@ -0,0 +1,92 @@
|
||||
dnl $Id$
|
||||
dnl config.m4 for extension wxwork_finance_sdk
|
||||
|
||||
dnl Comments in this file start with the string 'dnl'.
|
||||
dnl Remove where necessary. This file will not work
|
||||
dnl without editing.
|
||||
|
||||
dnl If your extension references something external, use with:
|
||||
|
||||
PHP_ARG_WITH(wxwork-finance-sdk, for wxwork_finance_sdk support,
|
||||
dnl Make sure that the comment is aligned:
|
||||
[ --with-wxwork-finance-sdk=DIR Include wxwork_finance_sdk support])
|
||||
|
||||
dnl Otherwise use enable:
|
||||
|
||||
|
||||
if test "$PHP_WXWORK_FINANCE_SDK" != "no"; then
|
||||
dnl check wxwork finance sdk is valid
|
||||
|
||||
|
||||
AC_MSG_CHECKING($PHP_WXWORK_FINANCE_SDK)
|
||||
if test -f "${PHP_WXWORK_FINANCE_SDK}/WeWorkFinanceSdk_C.h" && test -f "${PHP_WXWORK_FINANCE_SDK}/libWeWorkFinanceSdk_C.so"; then
|
||||
AC_MSG_RESULT(yes)
|
||||
else
|
||||
AC_MSG_ERROR(cannot find WeWorkFinanceSdk_C.h in path ${PHP_WXWORK_FINANCE_SDK})
|
||||
fi
|
||||
|
||||
PHP_ADD_INCLUDE($PHP_WXWORK_FINANCE_SDK)
|
||||
PHP_ADD_LIBRARY_WITH_PATH(WeWorkFinanceSdk_C, $PHP_WXWORK_FINANCE_SDK, WXWORK_FINANCE_SDK_SHARED_LIBADD)
|
||||
|
||||
dnl Write more examples of tests here...
|
||||
|
||||
dnl # get library FOO build options from pkg-config output
|
||||
dnl AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
|
||||
dnl AC_MSG_CHECKING(for libfoo)
|
||||
dnl if test -x "$PKG_CONFIG" && $PKG_CONFIG --exists foo; then
|
||||
dnl if $PKG_CONFIG foo --atleast-version 1.2.3; then
|
||||
dnl LIBFOO_CFLAGS=`$PKG_CONFIG foo --cflags`
|
||||
dnl LIBFOO_LIBDIR=`$PKG_CONFIG foo --libs`
|
||||
dnl LIBFOO_VERSON=`$PKG_CONFIG foo --modversion`
|
||||
dnl AC_MSG_RESULT(from pkgconfig: version $LIBFOO_VERSON)
|
||||
dnl else
|
||||
dnl AC_MSG_ERROR(system libfoo is too old: version 1.2.3 required)
|
||||
dnl fi
|
||||
dnl else
|
||||
dnl AC_MSG_ERROR(pkg-config not found)
|
||||
dnl fi
|
||||
dnl PHP_EVAL_LIBLINE($LIBFOO_LIBDIR, WXWORK_FINANCE_SDK_SHARED_LIBADD)
|
||||
dnl PHP_EVAL_INCLINE($LIBFOO_CFLAGS)
|
||||
|
||||
dnl # --with-wxwork_finance_sdk -> check with-path
|
||||
dnl SEARCH_PATH="/usr/local /usr" # you might want to change this
|
||||
dnl SEARCH_FOR="/include/wxwork_finance_sdk.h" # you most likely want to change this
|
||||
dnl if test -r $PHP_WXWORK_FINANCE_SDK/$SEARCH_FOR; then # path given as parameter
|
||||
dnl WXWORK_FINANCE_SDK_DIR=$PHP_WXWORK_FINANCE_SDK
|
||||
dnl else # search default path list
|
||||
dnl AC_MSG_CHECKING([for wxwork_finance_sdk files in default path])
|
||||
dnl for i in $SEARCH_PATH ; do
|
||||
dnl if test -r $i/$SEARCH_FOR; then
|
||||
dnl WXWORK_FINANCE_SDK_DIR=$i
|
||||
dnl AC_MSG_RESULT(found in $i)
|
||||
dnl fi
|
||||
dnl done
|
||||
dnl fi
|
||||
dnl
|
||||
dnl if test -z "$WXWORK_FINANCE_SDK_DIR"; then
|
||||
dnl AC_MSG_RESULT([not found])
|
||||
dnl AC_MSG_ERROR([Please reinstall the wxwork_finance_sdk distribution])
|
||||
dnl fi
|
||||
|
||||
dnl # --with-wxwork_finance_sdk -> add include path
|
||||
dnl PHP_ADD_INCLUDE($WXWORK_FINANCE_SDK_DIR/include)
|
||||
|
||||
dnl # --with-wxwork_finance_sdk -> check for lib and symbol presence
|
||||
dnl LIBNAME=wxwork_finance_sdk # you may want to change this
|
||||
dnl LIBSYMBOL=wxwork_finance_sdk # you most likely want to change this
|
||||
|
||||
dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
|
||||
dnl [
|
||||
dnl PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $WXWORK_FINANCE_SDK_DIR/$PHP_LIBDIR, WXWORK_FINANCE_SDK_SHARED_LIBADD)
|
||||
dnl AC_DEFINE(HAVE_WXWORK_FINANCE_SDKLIB,1,[ ])
|
||||
dnl ],[
|
||||
dnl AC_MSG_ERROR([wrong wxwork_finance_sdk lib version or lib not found])
|
||||
dnl ],[
|
||||
dnl -L$WXWORK_FINANCE_SDK_DIR/$PHP_LIBDIR -lm
|
||||
dnl ])
|
||||
dnl
|
||||
dnl PHP_SUBST(WXWORK_FINANCE_SDK_SHARED_LIBADD)
|
||||
|
||||
PHP_NEW_EXTENSION(wxwork_finance_sdk, wxwork_finance_sdk.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
|
||||
PHP_SUBST(WXWORK_FINANCE_SDK_SHARED_LIBADD)
|
||||
fi
|
||||
13
config.w32
Normal file
13
config.w32
Normal file
@ -0,0 +1,13 @@
|
||||
// $Id$
|
||||
// vim:ft=javascript
|
||||
|
||||
// If your extension references something external, use ARG_WITH
|
||||
// ARG_WITH("wxwork_finance_sdk", "for wxwork_finance_sdk support", "no");
|
||||
|
||||
// Otherwise, use ARG_ENABLE
|
||||
ARG_ENABLE("wxwork_finance_sdk", "enable wxwork_finance_sdk support", "no");
|
||||
|
||||
if (PHP_WXWORK_FINANCE_SDK != "no") {
|
||||
EXTENSION("wxwork_finance_sdk", "wxwork_finance_sdk.c", PHP_EXTNAME_SHARED, "/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
|
||||
}
|
||||
|
||||
90
php_wxwork_finance_sdk.h
Normal file
90
php_wxwork_finance_sdk.h
Normal file
@ -0,0 +1,90 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 7 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2018 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.01 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_01.txt |
|
||||
| If you did not receive a copy of the PHP license and are unable to |
|
||||
| obtain it through the world-wide-web, please send a note to |
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
+----------------------------------------------------------------------+
|
||||
| Author: |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
#ifndef PHP_WXWORK_FINANCE_SDK_H
|
||||
#define PHP_WXWORK_FINANCE_SDK_H
|
||||
|
||||
extern zend_module_entry wxwork_finance_sdk_module_entry;
|
||||
#define phpext_wxwork_finance_sdk_ptr &wxwork_finance_sdk_module_entry
|
||||
|
||||
#define PHP_WXWORK_FINANCE_SDK_VERSION "0.1.0" /* Replace with version number for your extension */
|
||||
|
||||
#ifdef PHP_WIN32
|
||||
# define PHP_WXWORK_FINANCE_SDK_API __declspec(dllexport)
|
||||
#elif defined(__GNUC__) && __GNUC__ >= 4
|
||||
# define PHP_WXWORK_FINANCE_SDK_API __attribute__ ((visibility("default")))
|
||||
#else
|
||||
# define PHP_WXWORK_FINANCE_SDK_API
|
||||
#endif
|
||||
|
||||
#ifdef ZTS
|
||||
#include "TSRM.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
Declare any global variables you may need between the BEGIN
|
||||
and END macros here:
|
||||
|
||||
ZEND_BEGIN_MODULE_GLOBALS(wxwork_finance_sdk)
|
||||
zend_long global_value;
|
||||
char *global_string;
|
||||
ZEND_END_MODULE_GLOBALS(wxwork_finance_sdk)
|
||||
*/
|
||||
|
||||
/* Always refer to the globals in your function as WXWORK_FINANCE_SDK_G(variable).
|
||||
You are encouraged to rename these macros something shorter, see
|
||||
examples in any other php module directory.
|
||||
*/
|
||||
#define WXWORK_FINANCE_SDK_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(wxwork_finance_sdk, v)
|
||||
|
||||
#if defined(ZTS) && defined(COMPILE_DL_WXWORK_FINANCE_SDK)
|
||||
ZEND_TSRMLS_CACHE_EXTERN()
|
||||
#endif
|
||||
|
||||
#include "zend_exceptions.h"
|
||||
#include "ext/spl/spl_exceptions.h"
|
||||
#include "WeWorkFinanceSdk_C.h"
|
||||
|
||||
#define TRACE(fmt, ...) do { trace(__FILE__, __LINE__, __FUNCTION__, fmt, ##__VA_ARGS__); } while (0)
|
||||
|
||||
static inline void trace(const char *file, int line, const char* function, const char *fmt, ...) {
|
||||
fprintf(stderr, "%s(%s:%d) - ", function, file, line);
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
vfprintf(stderr, fmt, args);
|
||||
fprintf(stderr, "\n");
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
#define WXWORK_SDK_G_NAME "_wecomSDK"
|
||||
#define WXWORK_SDK_G_NAME_SIZE sizeof(WXWORK_SDK_G_NAME) - 1
|
||||
// 默认超时时间
|
||||
#define WXWORK_SDK_DEFAULT_TIMEOUT 30
|
||||
|
||||
#endif /* PHP_WXWORK_FINANCE_SDK_H */
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: noet sw=4 ts=4 fdm=marker
|
||||
* vim<600: noet sw=4 ts=4
|
||||
*/
|
||||
474
wxwork_finance_sdk.c
Normal file
474
wxwork_finance_sdk.c
Normal file
@ -0,0 +1,474 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 7 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2018 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.01 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_01.txt |
|
||||
| If you did not receive a copy of the PHP license and are unable to |
|
||||
| obtain it through the world-wide-web, please send a note to |
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
+----------------------------------------------------------------------+
|
||||
| Author: |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "php.h"
|
||||
#include "php_ini.h"
|
||||
#include "ext/standard/info.h"
|
||||
#include "php_wxwork_finance_sdk.h"
|
||||
#include <errno.h>
|
||||
/* If you declare any globals in php_wxwork_finance_sdk.h uncomment this:
|
||||
ZEND_DECLARE_MODULE_GLOBALS(wxwork_finance_sdk)
|
||||
*/
|
||||
|
||||
/** {{{ ARG_INFO
|
||||
*/
|
||||
ZEND_BEGIN_ARG_INFO_EX(wxwork_void_arginfo, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
/* }}} */
|
||||
|
||||
/* True global resources - no need for thread safety here */
|
||||
static int le_wxwork_finance_sdk;
|
||||
|
||||
static zend_class_entry *wxwork_finance_sdk_ce;
|
||||
static zend_class_entry *wxwork_finance_sdk_exception_ce;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static WeWorkFinanceSdk_t* wxwork_finance_internal_get_sdk(zval *wxwork_class_this)
|
||||
{
|
||||
zend_object *object = Z_OBJ_P(wxwork_class_this);
|
||||
zval *wecom_sdk_zval = zend_read_property(object->ce, object, WXWORK_SDK_G_NAME, WXWORK_SDK_G_NAME_SIZE, 0, NULL);
|
||||
WeWorkFinanceSdk_t *wecom_sdk = (WeWorkFinanceSdk_t *)Z_PTR_P(wecom_sdk_zval);
|
||||
|
||||
return wecom_sdk;
|
||||
}
|
||||
|
||||
/**
|
||||
options = [
|
||||
'proxy_host' => 'http://www.baidu.com',
|
||||
'proxy_password' => 'helloworld'
|
||||
]
|
||||
*/
|
||||
PHP_METHOD(WxworkFinanceSdk, __construct)
|
||||
{
|
||||
char *corp_id, *secret;
|
||||
size_t corp_id_len, secret_len;
|
||||
zval *option_zval = NULL;
|
||||
zval wecom_sdk_zval;
|
||||
WeWorkFinanceSdk_t *wecom_sdk;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|a", &corp_id, &corp_id_len, &secret, &secret_len, &option_zval) == FAILURE) {
|
||||
zend_error(E_ERROR, "param error");
|
||||
return;
|
||||
}
|
||||
|
||||
if (corp_id_len == 0 || secret_len == 0) {
|
||||
zend_throw_exception(spl_ce_InvalidArgumentException, "corpId and secret cannot be bull", 0);
|
||||
return;
|
||||
}
|
||||
|
||||
zval *this = getThis();
|
||||
zend_object *object = Z_OBJ_P(this);
|
||||
|
||||
// init wecom finance sdk
|
||||
wecom_sdk = NewSdk();
|
||||
int ret = Init(wecom_sdk, corp_id, secret);
|
||||
|
||||
if (ret != 0) {
|
||||
zend_throw_exception(wxwork_finance_sdk_exception_ce, "Call WeWorkFinanceSdk_t Init error", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
ZVAL_PTR(&wecom_sdk_zval, wecom_sdk);
|
||||
zend_update_property(object->ce, object, WXWORK_SDK_G_NAME, WXWORK_SDK_G_NAME_SIZE, &wecom_sdk_zval);
|
||||
|
||||
zend_update_property_string(object->ce, object, "_corpId", sizeof("_corpId") - 1, corp_id);
|
||||
zend_update_property_string(object->ce, object, "_secret", sizeof("_secret") - 1, secret);
|
||||
|
||||
if (option_zval) {
|
||||
zval *proxy_host_zval = zend_hash_find(Z_ARR_P(option_zval), zend_string_init("proxy_host", sizeof("proxy_host") - 1, 0));
|
||||
|
||||
if (proxy_host_zval != NULL) {
|
||||
zval *proxy_password_zval = zend_hash_find(Z_ARR_P(option_zval), zend_string_init("proxy_password", sizeof("proxy_password") - 1, 0));
|
||||
|
||||
zend_update_property_string(object->ce, object, "_proxy_host", sizeof("_proxy_host") - 1, Z_STRVAL_P(proxy_host_zval));
|
||||
if (proxy_password_zval != NULL) {
|
||||
zend_update_property_string(object->ce, object, "_proxy_password", sizeof("_proxy_password") - 1, Z_STRVAL_P(proxy_password_zval));
|
||||
}
|
||||
}
|
||||
|
||||
zval *timeout_zval = zend_hash_find(Z_ARR_P(option_zval), zend_string_init("timeout", sizeof("timeout") - 1, 0));
|
||||
if (timeout_zval != NULL) {
|
||||
zend_update_property_long(object->ce, object, "_timeout", sizeof("_timeout") - 1, zval_get_long(timeout_zval));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PHP_METHOD(WxworkFinanceSdk, __destruct)
|
||||
{
|
||||
zval *this = getThis();
|
||||
WeWorkFinanceSdk_t *wecom_sdk = wxwork_finance_internal_get_sdk(this);
|
||||
DestroySdk(wecom_sdk);
|
||||
//TRACE("release wecom_sdk");
|
||||
}
|
||||
|
||||
/**
|
||||
{{{ proto public WxworkFinanceSdk::getChatData(int $seq, int $limit)
|
||||
*/
|
||||
|
||||
PHP_METHOD(WxworkFinanceSdk, getChatData)
|
||||
{
|
||||
zend_long seq, limit = 0;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll", &seq, &limit) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
Slice_t *chat_data = NewSlice();
|
||||
|
||||
if (NULL == chat_data) {
|
||||
FreeSlice(chat_data);
|
||||
zend_error(E_ERROR, "There is not enough memory!");
|
||||
return;
|
||||
}
|
||||
|
||||
zval *this = getThis();
|
||||
zend_object *object = Z_OBJ_P(this);
|
||||
|
||||
WeWorkFinanceSdk_t *wecom_sdk = wxwork_finance_internal_get_sdk(this);
|
||||
|
||||
zval *proxy_host_zval = zend_read_property(object->ce, object, "_proxy_host", sizeof("_proxy_host") - 1, 0, NULL);
|
||||
zval *proxy_password_zval = zend_read_property(object->ce, object, "_proxy_password", sizeof("_proxy_password") - 1, 0, NULL);
|
||||
zval *timeout_zval = zend_read_property(object->ce, object, "_timeout", sizeof("_timeout") - 1, 0, NULL);
|
||||
|
||||
int ret = GetChatData(wecom_sdk, (int)seq, (int)limit, Z_STRVAL_P(proxy_host_zval), Z_STRVAL_P(proxy_password_zval), zval_get_long(timeout_zval), chat_data);
|
||||
if (0 != ret) {
|
||||
FreeSlice(chat_data);
|
||||
zend_throw_exception(wxwork_finance_sdk_exception_ce, "Call WeWorkFinanceSdk_t GetChatData error", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
zend_string *s = zend_string_init(GetContentFromSlice(chat_data), GetSliceLen(chat_data), 0);
|
||||
RETURN_STR(s);
|
||||
|
||||
zval_ptr_dtor(proxy_host_zval);
|
||||
zval_ptr_dtor(proxy_password_zval);
|
||||
zval_ptr_dtor(timeout_zval);
|
||||
FreeSlice(chat_data);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/**
|
||||
{{{ proto WxworkFinanceSdk->decryptData(string $encryptRandomKey, string $encryptData)
|
||||
*/
|
||||
PHP_METHOD(WxworkFinanceSdk, decryptData)
|
||||
{
|
||||
zend_string *encrypt_random_key, *encrypt_data;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS(), "SS", &encrypt_random_key, &encrypt_data) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
Slice_t *msg = NewSlice();
|
||||
|
||||
int ret = DecryptData(ZSTR_VAL(encrypt_random_key), ZSTR_VAL(encrypt_data), msg);
|
||||
if (ret != 0) {
|
||||
zend_throw_exception(spl_ce_InvalidArgumentException, "DecryptData data error", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
zend_string *return_msg = zend_string_init(GetContentFromSlice(msg), GetSliceLen(msg), 0);
|
||||
|
||||
RETURN_STR(return_msg);
|
||||
FreeSlice(msg);
|
||||
}
|
||||
|
||||
/**
|
||||
{{{ proto WxworkFinanceSdk->downloadMedia(string $filedId, string $saveTo)
|
||||
*/
|
||||
|
||||
PHP_METHOD(WxworkFinanceSdk, downloadMedia)
|
||||
{
|
||||
zend_string *sdk_filedid, *file_saveto;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS(), "SS", &sdk_filedid, &file_saveto) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
zval *this = getThis();
|
||||
zend_object *object = Z_OBJ_P(this);
|
||||
|
||||
zval *proxy_host_zval = zend_read_property(object->ce, object, "_proxy_host", sizeof("_proxy_host") - 1, 0, NULL);
|
||||
zval *proxy_password_zval = zend_read_property(object->ce, object, "_proxy_password", sizeof("_proxy_password") - 1, 0, NULL);
|
||||
zval *timeout_zval = zend_read_property(object->ce, object, "_timeout", sizeof("_timeout") - 1, 0, NULL);
|
||||
|
||||
FILE *fp = fopen(ZSTR_VAL(file_saveto), "wb");
|
||||
if (NULL == fp) {
|
||||
zend_throw_exception_ex(wxwork_finance_sdk_exception_ce, errno, "cannot write file: %s error %s", ZSTR_VAL(file_saveto), strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
MediaData_t *media_data = NewMediaData();
|
||||
if (NULL == media_data) {
|
||||
zend_error(E_ERROR, "There is not enough memory!");
|
||||
return;
|
||||
}
|
||||
|
||||
WeWorkFinanceSdk_t *wecom_sdk = wxwork_finance_internal_get_sdk(this);
|
||||
|
||||
do {
|
||||
int ret = GetMediaData(wecom_sdk, GetOutIndexBuf(media_data), ZSTR_VAL(sdk_filedid), Z_STRVAL_P(proxy_host_zval), Z_STRVAL_P(proxy_password_zval), zval_get_long(timeout_zval), media_data);
|
||||
|
||||
if (0 != ret) {
|
||||
FreeMediaData(media_data);
|
||||
fclose(fp);
|
||||
zend_throw_exception(wxwork_finance_sdk_exception_ce, "GetMediaData error", ret);
|
||||
return;
|
||||
}
|
||||
fwrite(GetData(media_data), GetDataLen(media_data), 1, fp);
|
||||
}while(IsMediaDataFinish(media_data) != 1);
|
||||
|
||||
fclose(fp);
|
||||
FreeMediaData(media_data);
|
||||
|
||||
RETURN_TRUE;
|
||||
}
|
||||
|
||||
PHP_METHOD(WxworkFinanceSdk, getMediaData)
|
||||
{
|
||||
zend_string *sdk_filedid, *index_buf;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS(), "SS", &sdk_filedid, &index_buf) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
zval *this = getThis();
|
||||
zend_object *object = Z_OBJ_P(this);
|
||||
|
||||
zval *proxy_host_zval = zend_read_property(object->ce, object, "_proxy_host", sizeof("_proxy_host") - 1, 0, NULL);
|
||||
zval *proxy_password_zval = zend_read_property(object->ce, object, "_proxy_password", sizeof("_proxy_password") - 1, 0, NULL);
|
||||
zval *timeout_zval = zend_read_property(object->ce, object, "_timeout", sizeof("_timeout") - 1, 0, NULL);
|
||||
|
||||
MediaData_t *media_data = NewMediaData();
|
||||
if (NULL == media_data) {
|
||||
zend_error(E_ERROR, "There is not enough memory!");
|
||||
return;
|
||||
}
|
||||
|
||||
WeWorkFinanceSdk_t *wecom_sdk = wxwork_finance_internal_get_sdk(this);
|
||||
int ret = GetMediaData(wecom_sdk, ZSTR_VAL(index_buf), ZSTR_VAL(sdk_filedid), Z_STRVAL_P(proxy_host_zval), Z_STRVAL_P(proxy_password_zval), zval_get_long(timeout_zval), media_data);
|
||||
if (0 != ret) {
|
||||
zend_throw_exception(wxwork_finance_sdk_exception_ce, "GetMediaData error", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
array_init(return_value);
|
||||
add_assoc_stringl(return_value, "data", GetData(media_data), GetDataLen(media_data));
|
||||
add_assoc_string(return_value, "nextIndex", GetOutIndexBuf(media_data));
|
||||
add_assoc_bool(return_value, "isFinished", IsMediaDataFinish(media_data) == 1 ? 1 : 0);
|
||||
|
||||
//RETURN_STRINGL(GetData(media_data), GetDataLen(media_data));
|
||||
FreeMediaData(media_data);
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
|
||||
static const zend_function_entry wxwork_finance_sdk_class_methods[] = {
|
||||
PHP_ME(WxworkFinanceSdk, __construct, wxwork_void_arginfo, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
|
||||
PHP_ME(WxworkFinanceSdk, getChatData, wxwork_void_arginfo, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(WxworkFinanceSdk, decryptData, wxwork_void_arginfo, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(WxworkFinanceSdk, downloadMedia, wxwork_void_arginfo, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(WxworkFinanceSdk, getMediaData, wxwork_void_arginfo, ZEND_ACC_PUBLIC)
|
||||
PHP_FE_END
|
||||
};
|
||||
|
||||
static const zend_function_entry wxwork_finance_sdk_exception_methods[] = {
|
||||
PHP_FE_END
|
||||
};
|
||||
|
||||
|
||||
/* {{{ PHP_INI
|
||||
*/
|
||||
/* Remove comments and fill if you need to have entries in php.ini
|
||||
PHP_INI_BEGIN()
|
||||
STD_PHP_INI_ENTRY("wxwork_finance_sdk.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_wxwork_finance_sdk_globals, wxwork_finance_sdk_globals)
|
||||
STD_PHP_INI_ENTRY("wxwork_finance_sdk.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_wxwork_finance_sdk_globals, wxwork_finance_sdk_globals)
|
||||
PHP_INI_END()
|
||||
*/
|
||||
/* }}} */
|
||||
|
||||
/* Remove the following function when you have successfully modified config.m4
|
||||
so that your module can be compiled into PHP, it exists only for testing
|
||||
purposes. */
|
||||
|
||||
/* Every user-visible function in PHP should document itself in the source */
|
||||
/* {{{ proto string confirm_wxwork_finance_sdk_compiled(string arg)
|
||||
Return a string to confirm that the module is compiled in */
|
||||
PHP_FUNCTION(confirm_wxwork_finance_sdk_compiled)
|
||||
{
|
||||
char *arg = NULL;
|
||||
size_t arg_len, len;
|
||||
zend_string *strg;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
strg = strpprintf(0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "wxwork_finance_sdk", arg);
|
||||
|
||||
RETURN_STR(strg);
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
/* The previous line is meant for vim and emacs, so it can correctly fold and
|
||||
unfold functions in source code. See the corresponding marks just before
|
||||
function definition, where the functions purpose is also documented. Please
|
||||
follow this convention for the convenience of others editing your code.
|
||||
*/
|
||||
|
||||
|
||||
/* {{{ php_wxwork_finance_sdk_init_globals
|
||||
*/
|
||||
/* Uncomment this function if you have INI entries
|
||||
static void php_wxwork_finance_sdk_init_globals(zend_wxwork_finance_sdk_globals *wxwork_finance_sdk_globals)
|
||||
{
|
||||
wxwork_finance_sdk_globals->global_value = 0;
|
||||
wxwork_finance_sdk_globals->global_string = NULL;
|
||||
}
|
||||
*/
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_MINIT_FUNCTION
|
||||
*/
|
||||
PHP_MINIT_FUNCTION(wxwork_finance_sdk)
|
||||
{
|
||||
/* If you have INI entries, uncomment these lines
|
||||
REGISTER_INI_ENTRIES();
|
||||
*/
|
||||
|
||||
// define WxworkFinanceSdkException
|
||||
zend_class_entry wxwork_finance_sdk_exception_def;
|
||||
INIT_CLASS_ENTRY(wxwork_finance_sdk_exception_def, "WxworkFinanceSdkException", wxwork_finance_sdk_exception_methods);
|
||||
wxwork_finance_sdk_exception_ce = zend_register_internal_class_ex(&wxwork_finance_sdk_exception_def, zend_ce_exception);
|
||||
|
||||
zend_class_entry wxwork_finance_sdk_def;
|
||||
INIT_CLASS_ENTRY(wxwork_finance_sdk_def, "WxworkFinanceSdk", wxwork_finance_sdk_class_methods);
|
||||
wxwork_finance_sdk_ce = zend_register_internal_class(&wxwork_finance_sdk_def);
|
||||
|
||||
zend_declare_property_string(wxwork_finance_sdk_ce, "_corpId", sizeof("_corpId") - 1, "", ZEND_ACC_PRIVATE);
|
||||
zend_declare_property_string(wxwork_finance_sdk_ce, "_secret", sizeof("_secret") - 1, "", ZEND_ACC_PRIVATE);
|
||||
// http proxy
|
||||
zend_declare_property_string(wxwork_finance_sdk_ce, "_proxy_host", sizeof("_proxy_host") - 1, "", ZEND_ACC_PRIVATE);
|
||||
zend_declare_property_string(wxwork_finance_sdk_ce, "_proxy_password", sizeof("_proxy_password") - 1, "", ZEND_ACC_PRIVATE);
|
||||
// request timeout
|
||||
zend_declare_property_long(wxwork_finance_sdk_ce, "_timeout", sizeof("_timeout") - 1, WXWORK_SDK_DEFAULT_TIMEOUT, ZEND_ACC_PRIVATE);
|
||||
// declare wecom finance sdk
|
||||
zend_declare_property_null(wxwork_finance_sdk_ce, WXWORK_SDK_G_NAME, WXWORK_SDK_G_NAME_SIZE, ZEND_ACC_PRIVATE);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_MSHUTDOWN_FUNCTION
|
||||
*/
|
||||
PHP_MSHUTDOWN_FUNCTION(wxwork_finance_sdk)
|
||||
{
|
||||
/* uncomment this line if you have INI entries
|
||||
UNREGISTER_INI_ENTRIES();
|
||||
*/
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* Remove if there's nothing to do at request start */
|
||||
/* {{{ PHP_RINIT_FUNCTION
|
||||
*/
|
||||
PHP_RINIT_FUNCTION(wxwork_finance_sdk)
|
||||
{
|
||||
#if defined(COMPILE_DL_WXWORK_FINANCE_SDK) && defined(ZTS)
|
||||
ZEND_TSRMLS_CACHE_UPDATE();
|
||||
#endif
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* Remove if there's nothing to do at request end */
|
||||
/* {{{ PHP_RSHUTDOWN_FUNCTION
|
||||
*/
|
||||
PHP_RSHUTDOWN_FUNCTION(wxwork_finance_sdk)
|
||||
{
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_MINFO_FUNCTION
|
||||
*/
|
||||
PHP_MINFO_FUNCTION(wxwork_finance_sdk)
|
||||
{
|
||||
php_info_print_table_start();
|
||||
php_info_print_table_header(2, "wxwork_finance_sdk support", "enabled");
|
||||
php_info_print_table_end();
|
||||
|
||||
/* Remove comments if you have entries in php.ini
|
||||
DISPLAY_INI_ENTRIES();
|
||||
*/
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
|
||||
/* {{{ wxwork_finance_sdk_functions[]
|
||||
*
|
||||
* Every user visible function must have an entry in wxwork_finance_sdk_functions[].
|
||||
*/
|
||||
const zend_function_entry wxwork_finance_sdk_functions[] = {
|
||||
PHP_FE(confirm_wxwork_finance_sdk_compiled, wxwork_void_arginfo) /* For testing, remove later. */
|
||||
PHP_FE_END /* Must be the last line in wxwork_finance_sdk_functions[] */
|
||||
};
|
||||
/* }}} */
|
||||
|
||||
/* {{{ wxwork_finance_sdk_module_entry
|
||||
*/
|
||||
zend_module_entry wxwork_finance_sdk_module_entry = {
|
||||
STANDARD_MODULE_HEADER,
|
||||
"wxwork_finance_sdk",
|
||||
wxwork_finance_sdk_functions,
|
||||
PHP_MINIT(wxwork_finance_sdk),
|
||||
PHP_MSHUTDOWN(wxwork_finance_sdk),
|
||||
PHP_RINIT(wxwork_finance_sdk), /* Replace with NULL if there's nothing to do at request start */
|
||||
PHP_RSHUTDOWN(wxwork_finance_sdk), /* Replace with NULL if there's nothing to do at request end */
|
||||
PHP_MINFO(wxwork_finance_sdk),
|
||||
PHP_WXWORK_FINANCE_SDK_VERSION,
|
||||
STANDARD_MODULE_PROPERTIES
|
||||
};
|
||||
/* }}} */
|
||||
|
||||
#ifdef COMPILE_DL_WXWORK_FINANCE_SDK
|
||||
#ifdef ZTS
|
||||
ZEND_TSRMLS_CACHE_DEFINE()
|
||||
#endif
|
||||
ZEND_GET_MODULE(wxwork_finance_sdk)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: noet sw=4 ts=4 fdm=marker
|
||||
* vim<600: noet sw=4 ts=4
|
||||
*/
|
||||
50
wxwork_finance_sdk.php
Normal file
50
wxwork_finance_sdk.php
Normal file
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
gc_enable();
|
||||
$startMemUsed = memory_get_usage();
|
||||
function cal_mem()
|
||||
{
|
||||
global $startMemUsed;
|
||||
echo "memory,", ceil((memory_get_usage() - $startMemUsed) / 1024), 'KB', PHP_EOL;
|
||||
}
|
||||
echo "start mypid=", getmypid(), PHP_EOL;
|
||||
sleep(2);
|
||||
$sdk = new WxworkFinanceSdk("1", "2");
|
||||
$privateKey = <<<EOF
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
|
||||
-----END RSA PRIVATE KEY-----
|
||||
EOF;
|
||||
$seq = 0;
|
||||
$str = str_repeat('X', 1024 * 1024);
|
||||
|
||||
do{
|
||||
|
||||
echo "sync seq={$seq} ==>", cal_mem(), PHP_EOL;
|
||||
gc_mem_caches();
|
||||
gc_collect_cycles();
|
||||
$wxChat = $sdk->getChatData($seq, 100);
|
||||
$chats = json_decode($wxChat, true);
|
||||
$chatRows = $chats['chatdata'];
|
||||
foreach ($chatRows as $val) {
|
||||
$decryptRandKey = null;
|
||||
$decryptData = openssl_private_decrypt(base64_decode($val['encrypt_random_key']), $decryptRandKey, $privateKey, OPENSSL_PKCS1_PADDING);
|
||||
$decryptChatRawContent = $sdk->decryptData($decryptRandKey, $val['encrypt_chat_msg']);
|
||||
$j2 = json_decode($decryptChatRawContent, true);
|
||||
$msgType = $j2['msgtype'];
|
||||
if (in_array($msgType, ['image', 'video'])) {
|
||||
try {
|
||||
$sdk->downloadMedia($j2[$msgType]['sdkfileid'], "/tmp/download/{$j2[$msgType]['md5sum']}");
|
||||
}catch(\Exception $e) {
|
||||
var_dump($e);
|
||||
var_dump($e->getMessage(), $e->getCode());
|
||||
sleep(1);
|
||||
}
|
||||
}
|
||||
unset($decryptRandKey);
|
||||
}
|
||||
echo "loop done ===>", cal_mem();
|
||||
unset($chatRows, $wxChat, $chats);
|
||||
gc_collect_cycles();gc_collect_cycles();
|
||||
$seq = $val['seq'];
|
||||
}while(true);
|
||||
cal_mem();
|
||||
Loading…
x
Reference in New Issue
Block a user