首页 » 网站推广 » 退款php代码技巧_PHP实现微信申请退款功能

退款php代码技巧_PHP实现微信申请退款功能

访客 2024-12-14 0

扫一扫用手机浏览

文章目录 [+]

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

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

退款php代码技巧_PHP实现微信申请退款功能

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

退款php代码技巧_PHP实现微信申请退款功能
(图片来自网络侵删)

本篇还是利用到官方供应的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{ //失落败 }

退款成功返回如下:

标签:

相关文章

php多态若何懂得技巧_php多态性若何理解

多态性是指相同的操作或函数、过程可浸染于多种类型的工具上并得到不同的结果。不同的工具,收到同一将可以产生不同的结果,这种征象称为多...

网站推广 2024-12-15 阅读0 评论0