search
HomeBackend DevelopmentPHP TutorialDetailed explanation of steps to apply for refund on WeChat using PHP

This time I will bring you a detailed explanation of the steps to implement WeChat refund application in PHP. What are the precautions for PHP to implement WeChat refund application? Here is a practical case, let’s take a look.

Preliminary preparation:

Of course, WeChat payment has been settled, otherwise how can I get a refund? This time I will use the official demo. Of course, there may be many masters on the Internet who have rewritten and encapsulated the demo themselves, which may be easier to use and simpler, but I still don’t recommend using it for the following reasons:

(1) It may not be fully functional, maybe it just implements WeChat payment , but there are also business functions such as applying for refunds, querying refunds, order inquiries, and canceling orders, which you may need later. If you rely on the convenience of the master’s SDK, you will be confused if there are new business needs;

(2) Security considerations, when it comes to payment and money, it must be very safe. Although I also complain about the official SDK, at least it will be relatively safe. It will be rewritten again. Although no problems have been found for the time being, it will be bad if there are loopholes.

This article is still implemented by using the refund() method provided in WxPay.Api.php, the most important class file in the official SDK. This method is located at No. 141 of the WxPay.Api.php file. OK, the code is as follows:

/** 
 * 
 * 申请退款,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; 
}

The official method clearly states which parameters are required, and the SDK has already filled in some required parameters for us. I will re-encapsulate this method to facilitate calling it in the project. :

/** 
 * 微信退款 
 * @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; 
}

I need to make a complaint here. The type of the return value is not mentioned. When paying, XML data is returned. However, an array is returned here, which caught me off guard. Haha, but it is better to return an array. Can be directly judged and processed.

The method call is even simpler:

//微信退款 
$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{ 
 //失败 
}

The refund is returned successfully as follows:

Personal test is correct: this is an integrated official Implemented by the SDK, if you do not use the SDK, you can use a simpler method, see: PHP to implement WeChat payment (jsapi payment) and refund (no need to integrate the payment SDK)

I believe you have mastered the method after reading the case in this article. For more exciting information, please pay attention to other related articles on the php Chinese website!

Recommended reading:

Detailed explanation of the steps to implement one-way hash encryption in PHP

Detailed explanation of the steps to implement single sign-in in PHP

The above is the detailed content of Detailed explanation of steps to apply for refund on WeChat using PHP. For more information, please follow other related articles on the PHP Chinese website!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
What data can be stored in a PHP session?What data can be stored in a PHP session?May 02, 2025 am 12:17 AM

PHPsessionscanstorestrings,numbers,arrays,andobjects.1.Strings:textdatalikeusernames.2.Numbers:integersorfloatsforcounters.3.Arrays:listslikeshoppingcarts.4.Objects:complexstructuresthatareserialized.

How do you start a PHP session?How do you start a PHP session?May 02, 2025 am 12:16 AM

TostartaPHPsession,usesession_start()atthescript'sbeginning.1)Placeitbeforeanyoutputtosetthesessioncookie.2)Usesessionsforuserdatalikeloginstatusorshoppingcarts.3)RegeneratesessionIDstopreventfixationattacks.4)Considerusingadatabaseforsessionstoragei

What is session regeneration, and how does it improve security?What is session regeneration, and how does it improve security?May 02, 2025 am 12:15 AM

Session regeneration refers to generating a new session ID and invalidating the old ID when the user performs sensitive operations in case of session fixed attacks. The implementation steps include: 1. Detect sensitive operations, 2. Generate new session ID, 3. Destroy old session ID, 4. Update user-side session information.

What are some performance considerations when using PHP sessions?What are some performance considerations when using PHP sessions?May 02, 2025 am 12:11 AM

PHP sessions have a significant impact on application performance. Optimization methods include: 1. Use a database to store session data to improve response speed; 2. Reduce the use of session data and only store necessary information; 3. Use a non-blocking session processor to improve concurrency capabilities; 4. Adjust the session expiration time to balance user experience and server burden; 5. Use persistent sessions to reduce the number of data read and write times.

How do PHP sessions differ from cookies?How do PHP sessions differ from cookies?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

How does PHP identify a user's session?How does PHP identify a user's session?May 01, 2025 am 12:23 AM

PHPidentifiesauser'ssessionusingsessioncookiesandsessionIDs.1)Whensession_start()iscalled,PHPgeneratesauniquesessionIDstoredinacookienamedPHPSESSIDontheuser'sbrowser.2)ThisIDallowsPHPtoretrievesessiondatafromtheserver.

What are some best practices for securing PHP sessions?What are some best practices for securing PHP sessions?May 01, 2025 am 12:22 AM

The security of PHP sessions can be achieved through the following measures: 1. Use session_regenerate_id() to regenerate the session ID when the user logs in or is an important operation. 2. Encrypt the transmission session ID through the HTTPS protocol. 3. Use session_save_path() to specify the secure directory to store session data and set permissions correctly.

Where are PHP session files stored by default?Where are PHP session files stored by default?May 01, 2025 am 12:15 AM

PHPsessionfilesarestoredinthedirectoryspecifiedbysession.save_path,typically/tmponUnix-likesystemsorC:\Windows\TemponWindows.Tocustomizethis:1)Usesession_save_path()tosetacustomdirectory,ensuringit'swritable;2)Verifythecustomdirectoryexistsandiswrita

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),