PHP发起微信退款、查询退款申请函数分享 本文共有4463个字,关键词: 虽然官方sdk中也有相应的退款申请、查询接口,不过有时候在一些项目中引入sdk比较麻烦,这个时候直接定义一个函数来处理就简单的多。出了问题改起来也省事。今天就遇到一个这样的项目,所以就自己写了一个简单的处理函数。具体代码功能和内容请看相应注释。 ``` //发起退款 function wechat_back($order_sn,$amount){ $amount = $amount * 100; $wxpay = get_payment("wx_new_jspay");//get_payment主要用于获取当前微信支付的配置信息 $nonce_str = time().rand(000,999); $out_trade_no = $order_sn."_".$amount; $ref= strtoupper(md5("appid=$wxpay[appid]&mch_id=$wxpay[mchid]&nonce_str=$nonce_str&op_user_id=1539278161" . "&out_refund_no=$order_sn&out_trade_no=$out_trade_no&refund_fee=$amount&total_fee=$amount" . "&key=$wxpay[key]"));//sign加密MD5 $refund=array( 'appid'=>$wxpay['appid'],//应用ID,固定 'mch_id'=>$wxpay['mchid'],//商户号,固定 'nonce_str'=>$nonce_str,//随机字符串 'op_user_id'=>$wxpay['op_user_id'],//操作员编码,如:153928888 从微信支付商家后台获取 'out_refund_no'=>$order_sn,//商户内部唯一退款单号 'out_trade_no'=>$out_trade_no,//商户订单号,pay_sn码 1.1二选一,微信生成的订单号,在支付通知中有返回 // 'transaction_id'=>'1',//微信订单号 1.2二选一,商户侧传给微信的订单号 'refund_fee'=>$amount,//退款金额 'total_fee'=>$amount,//总金额 'sign'=>$ref//签名 ); $url="https://api.mch.weixin.qq.com/secapi/pay/refund";;//微信退款地址,post请求 $xml=arrayToXml($refund); $ch=curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_HEADER,0); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,1);//证书检查 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'pem'); //这里的几个证书必须要引入,否则无法退款。 curl_setopt($ch,CURLOPT_SSLCERT,dirname(__FILE__).'/../wechat/apiclient_cert.pem');//微信支付证书,从商家后台下载 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'pem'); curl_setopt($ch,CURLOPT_SSLKEY,dirname(__FILE__).'/../wechat/apiclient_key.pem');//微信支付证书,从商家后台下载 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'pem'); curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/../wechat/rootca.pem');//ca根证书 curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$xml); $data=curl_exec($ch); if($data){ //返回来的是xml格式需要转换成数组再提取值 curl_close($ch); $res = xmlToArray($data); return array("error"=>0,"res"=>$res); }else{ $error=curl_errno($ch); curl_close($ch); return array("error"=>1,"res"=>"curl出错,错误代码:$error"); } } //查询退款订单 function wechat_back_order_info($order_sn,$amount){ $amount = $amount * 100; $wxpay = get_payment("wx_new_jspay"); $nonce_str = time().rand(000,999); $out_trade_no = $order_sn."_".$amount; $ref= strtoupper(md5("appid=$wxpay[appid]&mch_id=$wxpay[mchid]&nonce_str=$nonce_str" . "&out_trade_no=$out_trade_no" . "&key=$wxpay[key]"));//sign加密MD5 $refund=array( 'appid'=>$wxpay['appid'],//应用ID,固定 'mch_id'=>$wxpay['mchid'],//商户号,固定 'nonce_str'=>$nonce_str,//随机字符串 'out_trade_no'=>$out_trade_no,//商户订单号,pay_sn码 1.1二选一,微信生成的订单号,在支付通知中有返回 'sign'=>$ref//签名 ); $url="https://api.mch.weixin.qq.com/pay/refundquery";;//微信退款地址,post请求 $xml=arrayToXml($refund); $ch=curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_HEADER,0); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,1);//证书检查 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'pem'); curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/../wechat/rootca.pem'); curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$xml); $data=curl_exec($ch); if($data){ //返回来的是xml格式需要转换成数组再提取值 curl_close($ch); //file_put_contents("test_debug.txt",var_export($data,true),FILE_APPEND); $res = xmlToArray($data); $res['refund_fee'] = $res['refund_fee']/100; return array("error"=>0,"msg"=>"","data"=>$res); }else{ $error=curl_errno($ch); curl_close($ch); return array("error"=>1,"msg"=>"curl出错,错误代码:$error"); } } //数组转换为xml function arrayToXml($arr){ $xml = ""; foreach ($arr as $key=>$val){ if(is_array($val)){ $xml.="<".$key.">".arrayToXml($val)."".$key.">"; }else{ $xml.="<".$key.">".$val."".$key.">"; } } $xml.=""; return $xml ; } /** * 作用:将xml转为array */ function xmlToArray($xml) { //将XML转为array libxml_disable_entity_loader(true); $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $array_data; } ``` × yihong (๑>ڡ<)☆谢谢老板~ 2元 5元 10元 50元 100元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 码农心得,PHP 2019-08-23 评论 2646 次浏览