ThinkPHP框架下微信支付功能总结踩坑笔记
作者:moTzxx 发布时间:2024-05-02 17:13:41
本文实例讲述了ThinkPHP框架下微信支付功能总结。分享给大家供大家参考,具体如下:
摘要
此文主要为个人解决 ThinkPHP3.2.3 下微信支付所遇到的一些坑的解决方案,仅供参考
详情请参考 原文 : 微信公众平台开发教程之ThinkPHP框架下微信支付功能
踩坑记录
为便于参考,此处附录部分 weixinpay.class代码截图
①. 验证不严谨,损失教训
补充时间:【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程序设计有所帮助。
来源:https://blog.csdn.net/u011415782/article/details/78757381


猜你喜欢
- 今天做了一个很简单的小项目,感受到了paramiko模块的强大,也深感自己Linux的功力不行~~一、需求二、简单需求分析及流程图需求很少,
- 类代码:# -*- coding:gbk -*-import ConfigParser, osclass INIFILE: de
- 一、手指触屏,利用touchstart和touchend计算前后滑动距离,判断是上拉还是下滑。二、js中距离:pageY、clientY、o
- 本文主要介绍了Python3中PyQt5简单实现文件打开及保存,分享给大家,具体如下:# -*- coding: utf-8 -*-# Fo
- 深度学习中,模型训练一般都需要很长的时间,由于很多原因,导致模型中断训练,下面介绍继续断点训练的方法。方法一:载入模型时,不必指定迭代次数,
- 引入为什么要有垃圾回收机制Python中的垃圾回收机制简称(GC),我们在程序的运行中会产生大量的变量用于保存数据,而有时候有些变量已经没有
- 最近在学python的过程中无意间发现一个python库:wxpy,其可以实现让微信自动接收、处理消息并进行回复的一系列功能。感觉挺有意思的
- 在防止sql注入这些细节出现问题的一般是那些大意的程序员或者是新手程序员,他们由于没有对用户提交过来的数据进行一些必要的过滤,从而导致了给大
- 一、Session 的概念cookie 是在浏览器端保存键值对数据,而 session 是在服务器端保存键值对数据 session 的使用依
- 人脸美白原理人脸美白原理说透了,就是一种图像的颜色空间处理,所以我们需要通过颜色空间进行设计。不过,我们先来参考以下PS对于图像美白的处理步
- 据国外媒体报道,相较于IE8浏览器,微软最新一代浏览器IE9的最大改进就是硬件加速HTML5。微软承诺,通过利用IE9中的硬件加速功能,开发
- 1. 错误描述之前在学习Python的过程中,导入自己写的包文件时,与之相关的方法等都会被划红线,但并不影响代码执行,如图:看着红线确实有点
- input标签checkbox,change和click绑定事件的区别我们经常在vue开发项目的过程中,遇到需要对input框使用v-mod
- 现在网页设计师除了把页面做的漂亮以外,越来越注重“用户体验”,就是要做“别让用户思考”的网页,使网站真正做到“可用性”。望望结合几年的工作经
- 一、logging模块Python中有一个模块logging,可以直接记录日志# 日志级别# CRITICAL 50# ERRO
- return 语句就是讲结果返回到调用的地方,并把程序的控制权一起返回程序运行到所遇到的第一个return即返回(退出def块),不会再运行
- AICodeHelper是一款AI编程助手,旨在帮助程序员提高他们的编码技能。简单的像尝试的代码直接问就行,但是一些复杂的,就得需要写技巧;
- matplotlib及相关cmap参数的取值在matplotlib中对于图片的显示有如下方法(这不是重点), 其中有cmap=&ls
- 在服务器上生成动态内容是使用ASP最主要的原因之一,所以我们选择的第一个测试项目是确定把动态内容发送到应答流使用什么方法最好。基本的选择有两
- 某次一不小心,用了delete from xxx 删除了几条重要数据,在网上找了很多方法,但都比较零散,打算记录本次数据找回的过程。大致分为