ThinkPHP框架下微信支付功能总结踩坑笔记


Posted in PHP onApril 10, 2019

本文实例讲述了ThinkPHP框架下微信支付功能总结。分享给大家供大家参考,具体如下:

摘要

  • 此文主要为个人解决 ThinkPHP3.2.3 下微信支付所遇到的一些坑的解决方案,仅供参考
  • 详情请参考 原文 : 微信公众平台开发教程之ThinkPHP框架下微信支付功能

踩坑记录

为便于参考,此处附录部分 weixinpay.class代码截图

ThinkPHP框架下微信支付功能总结踩坑笔记

①. 验证不严谨,损失教训

  • 补充时间:【2017-01-02】
  • 情况描述

【我尊重你,但不认同你】

恰逢元旦期间,遭到微信支付被大牛攻破的情况,损失近 80k,好在公司并没有追究,毕竟一直在赶时间,测试不全面(压根没测试人员),庆幸的的对方 24小时未收款,基本全部退还

问题集中在验证不足的红包发放上,不属于我的编码范围,分析后,明白一点,尽全力不要使用前端的数据提交,需要进行后端的数据判断,考虑尽量多的情况。

②. “total_fee” 参数报错

  • 补充时间:【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
);

③. 批量支付问题

  • 补充时间:【2017-02-08】
  • 情况描述

今天在做批量支付时发现,会有 total_fee 报错

个人最初简单的想法是将所有待支付的批量订单拼接为 state 参数传入微信,然后再进入 notify() 方法中进行分离整理,此时发现微信有参数长度的限制,大概最多 50 个字符 ,不可以无限制的拼接

后来的解决方案是进行新订单的创建,由此新订单号去查询关联的其他批量订单信息,并且已完成需求

④. 回调函数的注意

  • 情况描述

注意该路径必须要与配置文件中的回调路径一致,此回调函数,是根据微信是否真正完成支付后的数据更新链接,一般在此处进行订单状态的修改

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

注意:

1. 比如,我在此处异步执行的是将订单号的支付状态参数由 0 置为 1,判断如果是已支付订单,则不再执行后续更新逻辑.
2. 个人测试发现,此处 session 和 cookie 的设置都失效,仅做参考

⑤. D() 方法失效问题

  • 补充时间:【2017-02-09】
  • 情况描述

今天发现,当在微信完成支付后进行的回调中,针对于 ThinkPHP 框架里的 D() 方法是无法执行的,测试发现同样的代码不是这样微信回调就可以执行,毕竟之前记得是没有问题的

此时考虑的解决方法是使用 model 的实例化 new 方法进行曲线优化,发现可行…

⑤. 鬼知道是什么情况

  • 补充时间:【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 进行页面跳转
  }
}

⑥. ThinkPHP 跨模块调用方法失效问题

  • 补充时间:【2017-05-03】
  • 情况描述

有种情况的出现是,同样的代码在实际支付回调的函数中不执行,然而自己做了个测试路径传入固定订单号发现执行顺利,前提是所处环境完全一致(都在线上进行),就如同上次使用D()方法测试可以执行,放在实际的微信回调后就打死也不执行

而这次吸取了教训,使用的 new model 实例化方法,因为其中的一个 model 类在初始化时调用了部分数据,结果微信支付回调时卡在实例化这行代码上,虽然测试的代码是没问题的,自己也说不清楚,鬼知道到底是怎么回事

不过发现 A() 跨模块方法还是可以用的,至少现在是可行的…
后期发现如下的类似方法也能执行

//TODO 获取对应订单的交易价
$cartPayController = new \M\Controller\CartpayController();
$order_amount = $cartPayController->wxPayOrder($out_trade_no,0);

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php 将bmp图片转为jpg等其他任意格式的图片
Jun 29 PHP
PHP 循环列出目录内容的函数代码
May 26 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
Jun 07 PHP
php不用正则验证真假身份证
Nov 06 PHP
使用CodeIgniter的类库做图片上传
Jun 12 PHP
微信公众号开发之微信公共平台消息回复类实例
Nov 14 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
Sep 22 PHP
PHP实现无限分类的实现方法
Nov 14 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
Oct 23 PHP
PHP+jQuery实现双击修改table表格功能示例
Feb 21 PHP
php快速导入大量数据的实例方法
Sep 23 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
Apr 10 #PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
Apr 10 #PHP
ThinkPHP框架实现的微信支付接口开发完整示例
Apr 10 #PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
Apr 10 #PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
Apr 10 #PHP
微信公众平台开发教程②微信端分享功能图文详解
Apr 10 #PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 #PHP
You might like
小偷PHP+Html+缓存
2006/11/25 PHP
php抓取https的内容的代码
2010/04/06 PHP
php empty函数判断mysql表单是否为空
2010/04/12 PHP
比较好用的PHP防注入漏洞过滤函数代码
2012/04/11 PHP
PHP 类相关函数的使用详解
2013/05/10 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
php以post形式发送xml的方法
2014/11/04 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
CodeIgniter配置之autoload.php自动加载用法分析
2016/01/20 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
jQuery实现仿腾讯视频列表分页效果的方法
2015/08/07 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
微信小程序 教程之引用
2016/10/18 Javascript
vue.js的安装方法
2017/05/12 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
Nuxt.js SSR与权限验证的实现
2018/11/21 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
vue+element实现表单校验功能
2019/05/20 Javascript
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
Python入门篇之文件
2014/10/20 Python
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
详解django的serializer序列化model几种方法
2018/10/16 Python
基于Python测试程序是否有错误
2020/05/16 Python
纯css3使用vw和vh实现自适应的方法
2018/02/09 HTML / CSS
.NET面试题:什么是值类型和引用类型
2016/01/12 面试题
模具设计与制造专业应届生求职信
2013/10/18 职场文书
生物科学专业个人求职信范文
2013/12/07 职场文书
财务部副经理岗位职责
2014/03/14 职场文书
法人委托书范本格式
2014/09/15 职场文书
模范班主任事迹材料
2014/12/17 职场文书
通知的格式范文
2015/04/27 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
Java界面编程实现界面跳转
2022/06/16 Java/Android