补坑筆記[1]——微信公众号支付

摘要:

此文主要为个人解决ThinkPHP3.2.3下微信支付所遇到的一些坑的解决方案,仅供参考,详情请参考原文。

问题补充:

1.weixinpay.class


    补充说明:
      今天,遇到微信支付被大牛(我尊重你,但不认同你)攻破的情况,损失80k,好在公司没太怪我,分析后,明白一点,尽全力不要使用前端的数据提交,需要进行后端的数据判断,我采用的根据关键id值进行数据库的重新获取,考虑尽量多的情况。
      其次,对于上图中的代码可以警惕一点:订单的金额不要使用前面的Get请求,虽然要求是get提交,但是,现在的解决方案只让提交订单号,而其对应的金额需要根据订单号从自己的系统数据库中重新获取(ThinkPHP框架是可以直接使用相应代码的)...

   补充2(2017-02-05)
   发现一种情况,如果打开微信支付密码的界面后,未支付而从待付款进行再支付,会有时候报错一个“total_fee”参数报错,找到一种解决方法,即将“out_trade_no”以时间戳来重新配置,个人猜测或许是因为一次支付未完成后因为某种原因限制再付款...
$total_fee = floatval($order_amount)*100;
$order=array(
    'body'=>'testMsg',// 商品描述(需要根据自己的业务修改)
    'total_fee'=>$total_fee,// 订单金额  以(分)为单位(需要根据自己的业务修改)
    'out_trade_no'=>$out_trade_no.'M'.time(),// 订单号(需要根据自己的业务修改)
    'product_id'=>'1',// 商品id(需要根据自己的业务修改)
    'trade_type'=>'JSAPI',// JSAPI公众号支付
    'openid'=>$openid// 获取到的openid
);

  补充3(2017-02-08)

   今天在做批量支付时发现,会有total_fee报错,个人的想法是将所有待支付的批量订单拼接state参数传入微信,然后再notify方法中进行分离整理,此时应为有参数长度的限制,不可以无限制的拼接,暂时的解决方案是进行新订单的创建,其中包含批量订单号的信息已完成需求。  

2.回调函数的编辑

    注意该路径必须要与配置文件中的回调路径一致,此回调函数,是根据微信是否真正完成支付后的数据更新,一般此处进行订单状态的修改,比如,我在此处异步执行的是将订单号的支付状态参数由0置为1.[个人测试发现,此处session和cookie的设置都失效,仅做参考]


    

   注意:先前发现,因为微信服务的设计,会多次回调notify()以判断是否真正的支付成功,而简单的update操作是无法检测的,为了同自己的平台相关联,同理需要进行状态的判断,否则不可避免的会多次执行notify()中的逻辑处理

   补录1.(2017-02-09)
    今天发现,当在微信完成支付后进行的回调中,针对于ThinkPHP框架里的D()方法是无法执行的,测试发现同样的代码不是这样微信回调就可以执行,毕竟之前记得是没有问题的。此时考虑的解决方法是使用model的实例化new进行优化。

   补录2.(2017-05-02)
    这两天再次进行代码的迭代,根据自己之前的印象继续折腾微信支付,发现这可真真是个坑,我认为刚开通微信支付的服务号很有可能不满足某些代码开发需求,配置完成的数据,半天都不能接收到正确的反馈,待到第二天再准备继续攻克是发现,未动的代码又实现的需求,举个例子(前一天回调的路径放在M模块下怎么都不执行,手贱参考以前的回到路径放到Home下就可以了,首先排除低级的个人代码问题,因为第二天无聊又改回去M,竟然又好了...)
   补充一部分测试的代码:
/**  * 微信支付监听接口 判断是否完成了微信支付操作  */ public function notify(){
    // ↓↓↓下面的file_put_contents是用来简单查看异步发过来的数据 测试完可以删除;↓↓↓
    // 获取xml
    /*$xml=file_get_contents('php://input', 'r');
    //转成php数组 禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    $data= json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA));
    file_put_contents('.notify.log', $data);*/
    // ↑↑↑上面的file_put_contents是用来简单查看异步发过来的数据 测试完可以删除;↑↑↑
    // 导入微信支付sdk
    Vendor('Weixinpay.Weixinpay');
    $wxpay=new \Weixinpay();
    $result = $wxpay->notify();
    if ($result) {
        $out_trade_no = explode('M',$result['out_trade_no'])[0] ;
        $this->toUpdatePayInfo($out_trade_no);
        //TODO 进行页面跳转  }
}
   
补录3.(2017-05-03)
   有种情况的出现是,同样的代码在实际支付回调不执行,然而自己做了个测试路径传入固定订单号发现执行顺利,前提是所处环境完全一致(都在线上进行),就如同上次使用D()方法测试可以执行,放在实际的微信回调后就打死也不执行,而这次吸取了教训,使用的new model实例化方法,因为其中的一个model类在初始化时调用了部分数据,结果微信支付回调时卡在实例化上,虽然测试的代码是没问题的,自己也说不清楚,鬼知道到底是怎么回事,不过发现A()跨模块方法还是可以用的,至少现在是可行的...

你可能感兴趣的:(补坑筆記[1]——微信公众号支付)