diff --git a/README.md b/README.md index 70fde18..30d6fd3 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,79 @@ # wxwork_finance_sdk_wrapper -企业微信获取会话内容 PHP 扩展 + +企业微信-获取会话内容PHP扩展 + + +## 依赖 +企业微信提供的sdk; + +PHP VERSION >= 7.0 + +## 安装步骤及要求 + ``` + $INSATLL_PATH_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 + array WxworkFinanceSdk::getMediaData(string $fileId, string $indexBuf = '') + * 拉取媒体消息 + $filedId 从GetChatData返回的聊天消息中,媒体消息包括的sdkfileid + $indexBuf 下一次拉取记录 + + 返回结构: + [ + 'data' => '媒体内容', + 'nextIndex' => '下一次拉取记录', + 'isFininshed' => bool // true 数据已全部拉取完毕 + ] + +``` + + ## 示例 + + ```php + $sdk = new WxworkFinanceSdk("wwd08coe7d775abaaa", "zJ6k0naVVQ--gt9PUSSEvs03zW_nlDVmjAkPOTAfrew", [ + "proxy_host" => "hello", // 代理地址 + "proxy_password" => "world", // 代理密码 + "timeout" => 100, // 超时时间 + ]); + + var_dump(json_decode($sdk->getChatData(0, 100))); + /** + return [ + 'data' => string // 返回的数据, + 'nextIndex' => string // 下一个指针, + 'isFinished' => bool // 是否继续获取 下一条数据标识 + ]; + */ + var_dump($sdk->getMediaData("dddd")); + ``` + diff --git a/wxwork_finance_sdk.c b/wxwork_finance_sdk.c index 0668b43..de85618 100644 --- a/wxwork_finance_sdk.c +++ b/wxwork_finance_sdk.c @@ -48,41 +48,38 @@ static WeWorkFinanceSdk_t *sdk; */ PHP_METHOD(WxworkFinanceSdk, __construct) { - zend_string *corp_id, *secret = NULL; + char *corp_id, *secret; + size_t corp_id_len, secret_len; zval *option_zval = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "SS|a", &corp_id, &secret, &option_zval) == FAILURE) { + 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 (ZSTR_LEN(corp_id) == 0 || ZSTR_LEN(secret) == 0) { + if (corp_id_len == 0 || secret_len == 0) { zend_throw_exception(spl_ce_InvalidArgumentException, "corpId and secret cannot be bull", 0); return; } - TRACE("corp_id value=%s secret = %s", ZSTR_VAL(corp_id), ZSTR_VAL(secret)); - - int ret = Init(sdk, ZSTR_VAL(corp_id), ZSTR_VAL(secret)); + int ret = Init(sdk, corp_id, secret); if (ret != 0) { zend_throw_exception(wxwork_finance_sdk_exception_ce, "Call WeWorkFinanceSdk_t Init error", ret); return; } - zval *this = getThis(); zend_class_entry *ce = Z_OBJCE_P(this); - zend_declare_property_string(ce, "_corpId", sizeof("_corpId") - 1, ZSTR_VAL(corp_id), ZEND_ACC_PRIVATE); - zend_declare_property_string(ce, "_secret", sizeof("_secret") - 1, ZSTR_VAL(secret), ZEND_ACC_PRIVATE); + zend_update_property_string(ce, this, "_corpId", sizeof("_corpId") - 1, corp_id); + zend_update_property_string(ce, this, "_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)); - TRACE("option proxy_host=%s proxy_password=%s", Z_STRVAL_P(proxy_host_zval), Z_STRVAL_P(proxy_password_zval)); - zval_ptr_dtor(proxy_host_zval); zend_update_property_string(ce, this, "proxy_host", sizeof("proxy_host") - 1, Z_STRVAL_P(proxy_host_zval)); if (proxy_password_zval != NULL) { @@ -90,10 +87,19 @@ PHP_METHOD(WxworkFinanceSdk, __construct) zval_ptr_dtor(proxy_password_zval); } + zval_ptr_dtor(proxy_host_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(ce, this, "_timeout", sizeof("_timeout") - 1, zval_get_long(timeout_zval)); + zval_ptr_dtor(timeout_zval); } } } - +/** + {{{ proto public WxworkFinanceSdk::getChatData(int $seq, int $limit) +*/ PHP_METHOD(WxworkFinanceSdk, getChatData) { @@ -103,6 +109,13 @@ PHP_METHOD(WxworkFinanceSdk, getChatData) return; } + Slice_t *chat_data = NewSlice(); + + if (NULL == chat_data) { + zend_error(E_ERROR, "There is not enough memory!"); + return; + } + zval *this = getThis(); zend_class_entry *ce = Z_OBJCE_P(this); @@ -110,30 +123,70 @@ PHP_METHOD(WxworkFinanceSdk, getChatData) zval *proxy_password_zval = zend_read_property(ce, this, "_proxy_password", sizeof("_proxy_password") - 1, 0, NULL); zval *timeout_zval = zend_read_property(ce, this, "_timeout", sizeof("_timeout") - 1, 0, NULL); - convert_to_long(timeout_zval); - - Slice_t *chatDatas = NewSlice(); - - int ret = GetChatData(sdk, (int)seq, (int)limit, Z_STRVAL_P(proxy_host_zval), Z_STRVAL_P(proxy_password_zval), Z_LVAL_P(timeout_zval), chatDatas); - if (ret != 0) { + int ret = GetChatData(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) { zend_throw_exception(wxwork_finance_sdk_exception_ce, "Call WeWorkFinanceSdk_t GetChatData error", ret); return; } - zend_string *s = zend_string_init(chatDatas->buf, chatDatas->len, 0); + zend_string *s = zend_string_init(GetContentFromSlice(chat_data), GetSliceLen(chat_data), 0); RETURN_STR(s); zend_string_release(s); - zval_ptr_dtor(proxy_host_zval); zval_ptr_dtor(proxy_password_zval); zval_ptr_dtor(timeout_zval); - FreeSlice(chatDatas); + FreeSlice(chat_data); } +/* }}} */ + + +/** + {{{ proto WxworkFinanceSdk->getMediaData(string $filedId, string $index='') +*/ +PHP_METHOD(WxworkFinanceSdk, getMediaData) { + char *sdk_filedid, *index_buf; + int sdk_filedid_len, index_buf_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", &sdk_filedid, &sdk_filedid_len, &index_buf, &index_buf_len) == FAILURE) { + zend_error(E_ERROR, "param error"); + return; + } + + MediaData_t *media_data = NewMediaData(); + if (NULL == media_data) { + zend_error(E_ERROR, "There is not enough memory!"); + return; + } + + zval *this = getThis(); + zend_class_entry *ce = Z_OBJCE_P(this); + + zval *proxy_host_zval = zend_read_property(ce, this, "_proxy_host", sizeof("_proxy_host") - 1, 0, NULL); + zval *proxy_password_zval = zend_read_property(ce, this, "_proxy_password", sizeof("_proxy_password") - 1, 0, NULL); + zval *timeout_zval = zend_read_property(ce, this, "_timeout", sizeof("_timeout") - 1, 0, NULL); + + int ret = GetMediaData(sdk, index_buf, 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, "Call WeWorkFinanceSdk_t GetMediaData error", ret); + return; + } + + array_init(return_value); + add_assoc_string(return_value, "data", GetData(media_data)); + add_assoc_string(return_value, "nextIndex", GetOutIndexBuf(media_data)); + add_assoc_bool(return_value, "isFinished", IsMediaDataFinish(media_data) == 1 ? 1 : 0); + + FreeMediaData(media_data); +} +/* }}} */ + static const zend_function_entry wxwork_finance_sdk_class_methods[] = { PHP_ME(WxworkFinanceSdk, __construct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) PHP_ME(WxworkFinanceSdk, getChatData, NULL, ZEND_ACC_PUBLIC) + PHP_ME(WxworkFinanceSdk, getMediaData, NULL, ZEND_ACC_PUBLIC) PHP_FE_END }; diff --git a/wxwork_finance_sdk.php b/wxwork_finance_sdk.php index ffb7f45..5194bff 100644 --- a/wxwork_finance_sdk.php +++ b/wxwork_finance_sdk.php @@ -3,7 +3,7 @@ echo "version=", WxworkFinanceSdk::VERSION, PHP_EOL; try { -$obj = new WxworkFinanceSdk("d", "d", [ +$obj = new WxworkFinanceSdk("wwd08coe7d775abaaa", "zJ6k0naVVQ--gt9PUSSEvs03zW_nlDVmjAkPOTAfrew", [ "proxy_host" => "hello", "proxy_password" => "world", "timeout" => -2, @@ -11,6 +11,9 @@ $obj = new WxworkFinanceSdk("d", "d", [ var_dump($obj); var_dump(json_decode($obj->getChatData(0, 100))); +var_dump($obj->getMediaData("dddd")); + + }catch(\Exception $e) { var_dump($e->getMessage(), $e->getCode()); } \ No newline at end of file