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 相关文章推荐
搜索引擎技术核心揭密
Oct 09 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
PHP页面间参数传递的四种方法详解
Jun 09 PHP
解析数组非数字键名引号的必要性
Aug 09 PHP
php使用curl发送json格式数据实例
Dec 17 PHP
php去除换行(回车换行)的三种方法
Mar 26 PHP
PHPThumb图片处理实例
May 03 PHP
Yii2隐藏frontend/web和backend/web的方法
Dec 12 PHP
PHP图片水印类的封装
Jul 06 PHP
Laravel中服务提供者和门面模式的入门介绍
Nov 06 PHP
YII分模块加载路由的实现方法
Oct 01 PHP
php+lottery.js实现九宫格抽奖功能
Jul 21 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
自动分页的不完整解决方案
2007/01/12 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
2017/07/27 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
laravel 5.5 关闭token的3种实现方式
2019/10/24 PHP
PHP 实现 WebSocket 协议原理与应用详解
2020/04/22 PHP
PHP $O00OO0=urldecode & eval 解密,记一次商业源码的去后门
2020/09/13 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
2013/11/19 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
2015/02/26 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
2015/12/01 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
JS实现微信弹出搜索框 多条件查询功能
2016/12/13 Javascript
TypeScript学习之强制类型的转换
2016/12/27 Javascript
JS+html5制作简单音乐播放器
2020/09/13 Javascript
基于js 本地存储(详解)
2017/08/16 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
Python中字典的setdefault()方法教程
2017/02/07 Python
python出现"IndentationError: unexpected indent"错误解决办法
2017/10/15 Python
python3+requests接口自动化session操作方法
2018/10/13 Python
Python识别html主要文本框过程解析
2020/02/18 Python
canvas绘制圆角头像的实现方法
2019/01/17 HTML / CSS
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
关于党风廉政建设宣传教育月的活动总结!
2019/08/08 职场文书
Mysql如何查看是否使用到索引
2022/12/24 MySQL