类别:PHP教程 / 日期:2019-12-08 / 浏览:199 / 评论:0

前面讲了怎样完成微信付出,详见相干文章: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)

更多PHP相干学问,请接见PHP教程!

以上就是PHP怎样完成微信要求退款的细致内容,更多请关注ki4网别的相干文章!

打赏

感谢您的赞助~

打开支付宝扫一扫,即可进行扫码打赏哦~

版权声明 : 本文未使用任何知识共享协议授权,您可以任何形式自由转载或使用。