PHP开发实现微信退款功能示例
本文实例讲述了PHP开发实现微信退款功能。分享给大家供大家参考,具体如下:
最近在调微信退款接口,发现有许多坑,更大家分享一下
①要是在测试的时候,网页提示curl58说明证书的路径出现问题(这里要填物理路径,也就是绝对路径)
②网页提示curl52说明你的证书引入少了,在官方的demo上只有两个证书apiclient_cert.pem和apiclient_key.pem 你还需要引入一个证书rootca.pem,这个证书需要你登录到
你的商户平台上下载
③要是网页提示 "HTTP/1.1200OKServer:nginxDate:Tue,20Jun201708:08:01GMTContent-Type:text/plainContent-Length:852Connection:keep-aliveKeep-Alive:timeout=8
说明你的代码是没有问题的,应该是参数出错了我之前错的地方是把out_refund_no和out_trade_no写的一样,微信官网上也是这样写的,但是就是出现问题,我把out_refund_no修改了一下发现可以了
注意:金额的单位是分
下面就是我写的接口
functionHome_index(){ date_default_timezone_set("Asia/Shanghai"); $date=date("YmdHis"); $appid=""; $mch_id=""; $out_trade_no="14487658021497944120"; $op_user_id=""; $out_refund_no=$date; $total_fee="500"; $refund_fee="500"; //$transaction_id="4009542001201706206596667604"; $key=""; $nonce_str=nonceStr(); $ref=strtoupper(md5("appid=$appid&mch_id=$mch_id&nonce_str=$nonce_str&op_user_id=$op_user_id" ."&out_refund_no=$out_refund_no&out_trade_no=$out_trade_no&refund_fee=$refund_fee&total_fee=$total_fee" ."&key=$key"));//sign加密MD5 $refund=array( 'appid'=>$appid,//应用ID,固定 'mch_id'=>$mch_id,//商户号,固定 'nonce_str'=>$nonce_str,//随机字符串 'op_user_id'=>$op_user_id,//操作员 'out_refund_no'=>$out_refund_no,//商户内部唯一退款单号 'out_trade_no'=>$out_trade_no,//商户订单号,pay_sn码1.1二选一,微信生成的订单号,在支付通知中有返回 //'transaction_id'=>'1',//微信订单号1.2二选一,商户侧传给微信的订单号 'refund_fee'=>$refund_fee,//退款金额 'total_fee'=>$total_fee,//总金额 '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,1); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,1);//证书检查 if($useCert==true){ //设置证书 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'pem'); curl_setopt($ch,CURLOPT_SSLCERT,dirname(__FILE__).'/WxPay/cert/apiclient_cert.pem'); curl_setopt($ch,CURLOPT_SSLCERTTYPE,'pem'); curl_setopt($ch,CURLOPT_SSLKEY,dirname(__FILE__).'/WxPay/cert/apiclient_key.pem'); curl_setopt($ch,CURLOPT_SSLCERTTYPE,'pem'); curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/WxPay/cert/rootca.pem'); } curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$xml); $xml=curl_exec($ch); //返回结果0的时候能只能表明程序是正常返回不一定说明退款成功而已 if($xml){ curl_close($ch); //把xml转化成数组 libxml_disable_entity_loader(true); $xmlstring=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA); //var_dump($xmlstring); $result['errNum']=0; $result['info']=object_to_array($xmlstring); //var_dump($result); return$result; }else{ $error=curl_errno($ch); curl_close($ch); //错误的时候返回错误码。 $result['errNum']=$error; return$result; } } functionarrayToXml($arr){ $xml=""; foreach($arras$key=>$val){ if(is_array($val)){ $xml.="<".$key.">".arrayToXml($val)."".$key.">"; }else{ $xml.="<".$key.">".$val."".$key.">"; } } $xml.=" "; return$xml; } functionobject_to_array($obj){ $obj=(array)$obj; foreach($objas$k=>$v){ if(gettype($v)=='resource'){ return; } if(gettype($v)=='object'||gettype($v)=='array'){ $obj[$k]=(array)object_to_array($v); } } return$obj; } functionnonceStr(){ $chars="abcdefghijklmnopqrstuvwxyz0123456789"; $str=""; $length=32; for($i=0;$i<$length;$i++){ $str.=substr($chars,mt_rand(0,strlen($chars)-1),1); } //随机字符串 return$str; } Home_index();
赶快添加到你的项目中去吧
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP微信开发技巧汇总》、《PHP编码与转码操作技巧汇总》、《PHP网络编程技巧总结》、《php字符串(string)用法总结》、《PHP中json格式数据操作技巧汇总》及《PHP针对XML文件操作技巧总结》
希望本文所述对大家PHP程序设计有所帮助。