lokielse / omnipay-wechatpay

(微信支付)WeChatPay driver for the Omnipay PHP payment processing library
MIT License
316 stars 103 forks source link

fixed CreateOrderRequest中的openid参数错误 #56

Closed successgo closed 6 years ago

successgo commented 6 years ago

公众号支付-统一下单接口文档说明结合本地代码测试,此字段应为openid而不是open_id,与企业付款接口中的openid一致。

另外,为了代码风格一致,将参数变量由openId改为open_id。

ps. 怪微信接口的文档不够规范,感觉像是多个部门分开弄的,像商户号在统一下单是叫mch_id,而在企业付款接口中却是mchid。

codecov-io commented 6 years ago

Codecov Report

:exclamation: No coverage uploaded for pull request base (master@afe90ab). Click here to learn what that means. The diff coverage is 0%.

Impacted file tree graph

@@           Coverage Diff            @@
##             master     #56   +/-   ##
========================================
  Coverage          ?   4.85%           
========================================
  Files             ?      27           
  Lines             ?     845           
  Branches          ?       0           
========================================
  Hits              ?      41           
  Misses            ?     804           
  Partials          ?       0
Impacted Files Coverage Δ
src/Message/CreateOrderRequest.php 5.12% <0%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more Δ = absolute <relative> (impact), ø = not affected, ? = missing data Powered by Codecov. Last update afe90ab...4036b1c. Read the comment docs.

lokielse commented 6 years ago

@gdc5percent 既然参数名称存在争议,项目内部尽量采取更通用的命名方式,即:

  1. 不同的单词尽量分开

    如 openid是由 open 和 id 组成, 下划线的写法为 open_id,驼峰法为 openId
  2. PHP类方法的参数命名本项目尽量统一使用驼峰法。以下改法有欠妥当

    - public function setOpenId($openId)
    + public function setOpenId($open_id)
  3. Omnipay对于参数的下划线问题已经有解决方案,拿out_trade_no举例

以下的代码片段out_trade_no参数写成outtradenoout_tradenoouttrade_nooutTradeNooutTrade_No等形式都是可以的 具体实现请见:omnipay-common 的 Helper::initialize方法

$order = array(
     'out_trade_no'  => date('YmdHis')
     'totalfee' => '0.01', 
     'body' => 'test',
     'spbill_create_ip' => '114.119.110.120', 
);
$response = $gateway->purchase($order)->send();
successgo commented 6 years ago

@lokielse 你提到的omnipay-common的Helper::initialize方法我昨晚也是看到这个,才发现此问题的。

这个commit 不关语法不关风格,关于提交到微信接口的参数问题。

应当如何去修复 ?

lokielse commented 6 years ago

@gdc5percent

CreateOrderRequest.php#L62

在http请求的时候使用的是openid

successgo commented 6 years ago

@lokielse sorry about wasting you a lot of time. 是CreateOrderRequest.php#L42 让我有些迷惑。

Ok then, 我会按照这种用法,用在企业退款里。

Thanks for your instantly reply. Have a nice day.

lokielse commented 6 years ago

@gdc5percent CreateOrderRequest.php#L42 validate传的open_idsetOpenId方法里面的$this->setParameter('open_id', $openId)中的open_id是一致的

这里的原理是这样的:

  1. 用户传入的外部参数会调用 setOpenId 方法
  2. setOpenId 方法会将值赋值到 parameters 对象中
  3. 所以无论用户传的是openid还是open_id,都将成功调用setOpenId方法并设置一个以open_id为键值的键值对到parameters中,因此validate验证的时候需要通过open_id来验证
successgo commented 6 years ago

@lokielse Thanks for your precise and great expression.

So, 接下来在通过getOpenId方法取出open_id的的值,提交到openid字段中,再发送微信请求。

ps: IMO,总感觉怪怪得。