wechatpay-apiv3 / wechatpay-guzzle-middleware

微信支付 APIv3 Guzzle HTTP Client中间件(middleware)
Apache License 2.0
209 stars 46 forks source link

提案: 以guzzle7为底版,升级代码结构及驱动方式,并最低支持PHP7.2 #51

Closed TheNorthMemory closed 3 years ago

TheNorthMemory commented 3 years ago

目标

xy-peng commented 3 years ago

对于异步请求和链式请求,能先给出一些代码片段,展示下开发者是如何使用它的吗?在贡献代码之前可以充分讨论讨论。

最好实现上使用的关键技术也介绍下?

TheNorthMemory commented 3 years ago

异步请求

网络编程是异步的,guzzle在5+就已经支持类似 getAsync 这样的 PromiseA+ 实现,guzzle7 已经提权异步请求代码为 ClientTrait,可以像其他支持Promise/A+的开发语言一样,异步甚至协程式编程,请求的语法糖类似如下:

$client->getAsync('v3/certificates', [])
  .then(function(ResponseInterface $response) {})
  .otherwise(function(ResponseInterface $response) {})

或者

try {
  $response = $client->getAsync('v3/certificates', [])->wait();
} catch (Exception $e) {}

上述伪代码的核心思路是充分利用语法糖优势,把正常处理逻辑和异常处理逻辑区分开来,让语言自己解释自己。

链式调用

guzzle其实已经提供了链式型如 get($uri, [])语法糖,这里更进一步,就是把 $uri 也按照 slash 切分法,动态前置化,仅使HTTP Verbs保留 \GuzzleHttp\RequestOptions,工程化实践可见 wechatpay-axios-plugin 项目。

伪代码类似如下:

$wxpay = new Wechatpay();

$wxpay->v3->certificates->get([]).then(function(){}).otherwise(function(){});

$res = $wxpay->v3->pay->transactions->native([])->wait();//native默认为`POST`
TheNorthMemory commented 3 years ago

merged onto the new repo: https://github.com/wechatpay-apiv3/wechatpay-php