wechatpay-apiv3/wechatpay-php

BuilderChainable chain 会把大写转化成小写的问题

zhlhuang opened this issue · 5 comments

调用 BuilderChainable chain 会把大写转化成小写,例如查询订单需要拼上订单号,单订单号有大写的时候,会被转成小写
例如 N123123 会被转成功 -n123123
image

使用链式的凡事也会被转化
$resp = $this->instance->v3->pay->partner->transactions->outTradeNo->{$out_trade_no}

输出的是 n123123 不存在

类库自v1.0起就是URI大小写敏感的,所以自己组装的URI默认情况下就会被替换成小写,相关问题见#56, #69URI.pathname上若有变量需要传递时,需要以 URI Template 的模版变量方式书写,比如:

  • ->v3->marketing->favor->users->_openid_->coupons->post(['openid' => 'AbcdEF12345']),推荐写法
  • ->v3->marketing->favor->users->{'{openid}'}->coupons->post(['openid' => 'AbcdEF12345'])
  • ->chain('{+myurl}')->post(['myurl' => 'v3/marketing/favor/users/AbcdEF12345/coupons'])
  • ->{'{+myurl}'}->post(['myurl' => 'v3/marketing/favor/users/AbcdEF12345/coupons'])

你的请求,需要按照规范写法这么调整,

$resp = $this->instance
->v3->pay->partner->transactions->outTradeNo->_out_trade_no_
->get(['out_trade_no' => 'N123123']);
$resp = $this->instance
->v3->pay->partner->transactions->outTradeNo->{'{out_trade_no}'}
->get(['out_trade_no' => 'N123123']);
$resp = $this->instance
->chain('v3/pay/partner/transactions/out-trade-no/{out_trade_no}')
->get(['out_trade_no' => 'N123123']);

就没有问题了。

你的请求,需要按照规范写法这么调整,

$resp = $this->instance
->v3->pay->partner->transactions->outTradeNo->_out_trade_no_
->get(['out_trade_no' => 'N123123']);
$resp = $this->instance
->v3->pay->partner->transactions->outTradeNo->{'{out_trade_no}'}
->get(['out_trade_no' => 'N123123']);
$resp = $this->instance
->chain('v3/pay/partner/transactions/out-trade-no/{out_trade_no}')
->get(['out_trade_no' => 'N123123']);

就没有问题了。

了解,谢谢!

@TheNorthMemory 有点奇怪为什么要选择这样的调用方式呢? 感觉太容易采坑,
直接支持 api($url, $params) 的 统一调用不好吗?简单明了感觉更重要。
chain 还会把大写字母转化了,潜规则有点多(这里感觉无数人会采坑)。
多种调用方式 + 潜规则 ,提高使用者出错的情况 。

@TheNorthMemory 有点奇怪为什么要选择这样的调用方式呢? 感觉太容易采坑, 直接支持 api($url, $params) 的 统一调用不好吗?简单明了感觉更重要。 chain 还会把大写字母转化了,潜规则有点多(这里感觉无数人会采坑)。 多种调用方式 + 潜规则 ,提高使用者出错的情况 。

api($url, $params) 这种方法是支持的,而且在其中一个接口上,只能这么用,可见

$apiv3Client = $endpoint->getDriver()->select();
self::assertInstanceOf(ClientInterface::class, $apiv3Client);
$this->mock->reset();
$this->mock->append($respondor);
$response = $apiv3Client->request('GET', $relativeUrl);
self::responseAssertion($response);
$this->mock->append($respondor);
$response = $apiv3Client->request('GET', $relativeUrl, ['handler' => $stack]);
self::responseAssertion($response);

动态链式书写代码,建议装一下 composer require --dev iwechatpay/openapi,400+ API就都有代码提示了,撸代码就不用猜了,源码及事例可见这里