前面讲了怎样完成微信付出,详见相干文章:PHP完成微信付出(jsapi付出)流程 和ThinkPHP中完成微信付出(jsapi付出)流程。因为营业需求,还需要有微信退款,经由研讨和探索,也终究搞定了。类别:PHP教程 / 日期:2019-12-08 / 浏览:199 / 评论:0
前期预备:
固然是搞定了微信付出,不然怎样退款,此次照样运用官方的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)
更多PHP相干学问,请接见PHP教程!
以上就是PHP怎样完成微信要求退款的细致内容,更多请关注ki4网别的相干文章!
版权声明 : 本文未使用任何知识共享协议授权,您可以任何形式自由转载或使用。