PHP实现微信申请退款流程实例源码

https://www.jb51.net/article/136476.htm

目录

  • 前期准备:

前面讲了怎么实现微信支付,详见博文:PHP实现微信支付(jsapi支付)流程  和ThinkPHP中实现微信支付(jsapi支付)流程。由于业务需求,还需要有微信退款,经过研究和摸索,也终于搞定了。

前期准备:

当然是搞定了微信支付,不然怎么退款,这次还是使用官方的demo。当然网上可能也有很多大神自己重写和封装了demo,或许更加好用简洁,但是我还是不提倡用,原因如下:

(1)可能功能不全,或许他只是实现了微信支付,但是还有申请退款、查询退款、订单查询、撤销订单等业务功能可能是你后续需要的,如果你依赖于大神的SDK的便捷,如果有新的业务需求,你就懵逼了;

(2)安全考虑,涉及到支付涉及到金钱,必须要非常安全。官方SDK虽然我也吐槽,但至少会相对比较安全,再次重写,虽然暂时没看出问题,但是万一有漏洞就不好了。

本篇还是使用到官方提供的SDK中的最重要的一个类文件WxPay.Api.php中提供的refund()方法来实现,此方法在WxPay.Api.php文件的第141行,代码如下:

/**
 *
 * 申请退款,WxPayRefund中out_trade_no、transaction_id至少填一个且
 * out_refund_no、total_fee、refund_fee、op_user_id为必填参数
 * appid、mchid、spbill_create_ip、nonce_str不需要填入
 * @param WxPayRefund $inputObj
 * @param int $timeOut
 * @throws WxPayException
 * @return 成功时返回,其他抛异常
 */
public static function refund($inputObj, $timeOut = 6){
 $url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
 //检测必填参数
 if(!$inputObj->IsOut_trade_noSet() && !$inputObj->IsTransaction_idSet()) {
  throw new WxPayException("退款申请接口中,out_trade_no、transaction_id至少填一个!");
 }else if(!$inputObj->IsOut_refund_noSet()){
  throw new WxPayException("退款申请接口中,缺少必填参数out_refund_no!");
 }else if(!$inputObj->IsTotal_feeSet()){
  throw new WxPayException("退款申请接口中,缺少必填参数total_fee!");
 }else if(!$inputObj->IsRefund_feeSet()){
  throw new WxPayException("退款申请接口中,缺少必填参数refund_fee!");
 }else if(!$inputObj->IsOp_user_idSet()){
  throw new WxPayException("退款申请接口中,缺少必填参数op_user_id!");
 }
 $inputObj->SetAppid(WxPayConfig::APPID);//公众账号ID
 $inputObj->SetMch_id(WxPayConfig::MCHID);//商户号
 $inputObj->SetNonce_str(self::getNonceStr());//随机字符串
 $inputObj->SetSign();//签名
 $xml = $inputObj->ToXml();
 $startTimeStamp = self::getMillisecond();//请求开始时间
 $response = self::postXmlCurl($xml, $url, true, $timeOut);
 $result = WxPayResults::Init($response);
 self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间
 return $result;
}

官方的方法,写的很清楚需要哪些参数,还有一些必须参数SDK已经帮我们补齐了,我将这个方法重新封装一下,便于在项目中调用:

/**
 * 微信退款
 * @param string $order_id 订单ID
 * @return 成功时返回(array类型),其他抛异常
 */
function wxRefund($order_id){
 //我的SDK放在项目根目录下的Api目录下
 require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php";
 //查询订单,根据订单里边的数据进行退款
 $order = M(‘order‘)->where(array(‘id‘=>$order_id,‘is_refund‘=>2,‘order_status‘=>1))->find();
 $merchid = WxPayConfig::MCHID;
 if(!$order) return false;
 $input = new WxPayRefund();
 $input->SetOut_trade_no($order[‘order_sn‘]);   //自己的订单号
 $input->SetTransaction_id($order[‘transaction_id‘]);  //微信官方生成的订单流水号,在支付成功中有返回
 $input->SetOut_refund_no(getrand_num(true));   //退款单号
 $input->SetTotal_fee($order[‘total_price‘]);   //订单标价金额,单位为分
 $input->SetRefund_fee($order[‘total_price‘]);   //退款总金额,订单总金额,单位为分,只能为整数
 $input->SetOp_user_id($merchid);
 $result = WxPayApi::refund($input); //退款操作
 // 这句file_put_contents是用来查看服务器返回的退款结果 测试完可以删除了
 //file_put_contents(APP_ROOT.‘/Api/wxpay/logs/log3.txt‘,arrayToXml($result),FILE_APPEND);
 return $result;
}

这里需要吐槽一下,竟然不说返回值的类型,在支付的时候返回的是XML数据,这里竟然返回的是数组,让我措手不及,哈哈不过还是返回数组比较好,可以直接判断处理。

方法调用就更加简单了:

//微信退款
$result = wxRefund($order_id);
// 这句file_put_contents是用来查看服务器返回的退款结果 测试完可以删除了
//file_put_contents(APP_ROOT.‘/Api/wxpay/logs/log4.txt‘,arrayToXml($result),FILE_APPEND);
if(($result[‘return_code‘]==‘SUCCESS‘) && ($result[‘result_code‘]==‘SUCCESS‘)){
 //退款成功
}else if(($result[‘return_code‘]==‘FAIL‘) || ($result[‘result_code‘]==‘FAIL‘)){
 //退款失败
 //原因
 $reason = (empty($result[‘err_code_des‘])?$result[‘return_msg‘]:$result[‘err_code_des‘]);
}else{
 //失败
}

退款成功返回如下:

亲测无误:这是集成了官方的SDK实现的,如果不使用SDK,可以使用更简单的方法,见:PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)

原文地址:https://www.cnblogs.com/lxwphp/p/9841571.html

时间: 2024-10-17 07:12:23

PHP实现微信申请退款流程实例源码的相关文章

微信小程序实例源码大全

怎么本地测试微信小程序实例源码 1.下载源码 2.打开微信开发者工具 3.添加项目->选择本项目目录->编译执行 微信小程序实例源码大全 微信小程序游戏类demo:识色:从相似颜色中挑选不同的一个 源码链接:http://www.wxapp-union.com/forum.php?mod=viewthread&tid=1105 微信小程序精品demo:仿网易云音乐:歌单,FM,播放,评论 源码链接:http://www.wxapp-union.com/forum.php?mod=vie

微信小程序实例源码大全demo下载

怎么本地测试微信小程序实例源码 1.下载源码 2.打开微信开发者工具 3.添加项目->选择本项目目录->编译执行 微信小程序实例源码大全 微信小程序游戏类demo:识色:从相似颜色中挑选不同的一个 源码链接:http://www.wxapp-union.com/forum.php?mod=viewthread&tid=1105 微信小程序精品demo:仿网易云音乐:歌单,FM,播放,评论 源码链接:http://www.wxapp-union.com/forum.php?mod=vie

JAVA上百实例源码以及开源项目

简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬.向往!此时此景,笔者只专注Android.Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能.编辑音乐软件的朋友,这款实例会对你有所帮助.Calendar万年历 1个目标文件EJ

Android 上千实例源码分析以及开源分析

Android 上千实例源码分析以及开源分析(百度云分享) 要下载的直接翻到最后吧,项目实例有点多. 首先 介绍几本书籍(下载包中)吧. 01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 06_Android的GUI系统 07_Android的Audio系统 08_Android的Video 输入输出系统 09_Android的多媒体系统 10_

Android应用层View绘制流程与源码分析

Android应用层View绘制流程与源码分析 1 背景 还记得前面<Android应用setContentView与LayoutInflater加载解析机制源码分析>这篇文章吗?我们有分析到Activity中界面加载显示的基本流程原理,记不记得最终分析结果就是下面的关系: 看见没有,如上图中id为content的内容就是整个View树的结构,所以对每个具体View对象的操作,其实就是个递归的实现. 前面<Android触摸屏事件派发机制详解与源码分析一(View篇)>文章的3-1

微信商城+电脑商城多用户源码+个人免签支付宝 +24套微信店铺模

微信商城+电脑商城多用户源码+个人免签支付宝 +24套微信店铺模Ecmaill微信商城源码,功能非常不错的.电脑商城多用户,个人支付宝免签,无需在支付宝申请接口,直接填写支付就可以实现在线支付功能,另外再加上24套微信店铺模板一起打包,在这里完全免费分享,无任何限制,免金币,免RMB下载.在这里非常感谢粉丝分享了这么好的源码,请懂得珍惜好源码,也是源码贡献者花人民币购买过来的.    以下内容为转过来的,实际情况请自行下载测试多用户(微信+手机+电脑)多平台商城,微信商城与电脑商城数据同步支持绑

【OpenHW12参赛手记】ZedBoard-自定义IP核实现+PS成功调用【详细步骤+流程介绍+源码】 转载

文章来源 图片无法复制,请看原文 http://www.eefocus.com/jefby1990/blog/13-03/291975_490bc.html [OpenHW12参赛手记]ZedBoard-自定义IP核实现+PS成功调用[详细步骤+流程介绍+源码] 2013-03-07 17:56:30 分享: (图片请点击查看原图) 软件环境:WIN7_64 + ISE 14.4 (system_edition) 硬件:Zedboard.USB-Cable线 搭建图: 经过前几天的学习,查看数据

基于Docker的TensorFlow机器学习框架搭建和实例源码解读

概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的机器学习开发环境,探索人工智能的奥秘,容器随开随用方便快捷.源码解析TensorFlow容器创建和示例程序运行,为热爱机器学者降低学习难度. 默认机器已经装好了Docker(Docker安装和使用可以看我另一篇博文:Ubuntu16.04安装Docker1.12+开发实例+hello world+w

Struts2+Spring+Ibatis用户注册、登录、管理入门学习实例源码下载

原文:Struts2+Spring+Ibatis用户注册.登录.管理入门学习实例源码下载 源代码下载地址:http://www.zuidaima.com/share/1550463735532544.htm Struts2+Spring+Ibatis用户注册.登录.管理入门学习实例源码下载 项目截图: jar包和sql文件都在源码包中. 运行截图: 用户注册页面: 用户管理页面: