php实现微信支付之退款功能
网上的很多PHP微信支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,希望可以给各位想接入微信支付的带来些许帮助和借鉴意义。
直接运行该文件即可给指定的微信用户退款。
需要注意的事项:
1.微信退款到零钱要求必传证书,需要到这里账户中心->账户设置->API安全->下载证书,然后修改代码中的证书路径
2.该文件需放到支付授权目录下,可以在微信支付商户平台->产品中心->开发配置中设置。
3.如提示签名错误可以通过微信支付签名验证工具进行验证:微信公众平台支付接口调试工具
4.错误码参照:参照地址
代码如下:
账户设置->API安全->下载证书,证书路径在第119行和122行修改 *2.错误码参照:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 */ header('Content-type:text/html;Charset=utf-8'); $mchid='xxxxx';//微信支付商户号PartnerID通过微信支付商户资料审核后邮件发送 $appid='xxxxx';//微信支付申请对应的公众号的APPID $apiKey='xxxxx';//https://pay.weixin.qq.com帐户设置-安全设置-API安全-API密钥-设置API密钥 $orderNo='';//商户订单号(商户订单号与微信订单号二选一,至少填一个) $wxOrderNo='';//微信订单号(商户订单号与微信订单号二选一,至少填一个) $totalFee=0.01;//订单金额,单位:元 $refundFee=0.01;//退款金额,单位:元 $refundNo='refund_'.uniqid();//退款订单号(可随机生成) $wxPay=newWxpayService($mchid,$appid,$apiKey); $result=$wxPay->doRefund($totalFee,$refundFee,$refundNo,$wxOrderNo,$orderNo); if($result===true){ echo'refundsuccess';exit(); } echo'refundfail'; classWxpayService { protected$mchid; protected$appid; protected$apiKey; public$data=null; publicfunction__construct($mchid,$appid,$key) { $this->mchid=$mchid;//https://pay.weixin.qq.com产品中心-开发配置-商户号 $this->appid=$appid;//微信支付申请对应的公众号的APPID $this->apiKey=$key;//https://pay.weixin.qq.com帐户设置-安全设置-API安全-API密钥-设置API密钥 } /** *退款 *@paramfloat$totalFee订单金额单位元 *@paramfloat$refundFee退款金额单位元 *@paramstring$refundNo退款单号 *@paramstring$wxOrderNo微信订单号 *@paramstring$orderNo商户订单号 *@returnstring */ publicfunctiondoRefund($totalFee,$refundFee,$refundNo,$wxOrderNo='',$orderNo='') { $config=array( 'mch_id'=>$this->mchid, 'appid'=>$this->appid, 'key'=>$this->apiKey, ); $unified=array( 'appid'=>$config['appid'], 'mch_id'=>$config['mch_id'], 'nonce_str'=>self::createNonceStr(), 'total_fee'=>intval($totalFee*100),//订单金额单位转为分 'refund_fee'=>intval($refundFee*100),//退款金额单位转为分 'sign_type'=>'MD5',//签名类型支持HMAC-SHA256和MD5,默认为MD5 'transaction_id'=>$wxOrderNo,//微信订单号 'out_trade_no'=>$orderNo,//商户订单号 'out_refund_no'=>$refundNo,//商户退款单号 'refund_desc'=>'商品已售完',//退款原因(选填) ); $unified['sign']=self::getSign($unified,$config['key']); $responseXml=$this->curlPost('https://api.mch.weixin.qq.com/secapi/pay/refund',self::arrayToXml($unified)); $unifiedOrder=simplexml_load_string($responseXml,'SimpleXMLElement',LIBXML_NOCDATA); if($unifiedOrder===false){ die('parsexmlerror'); } if($unifiedOrder->return_code!='SUCCESS'){ die($unifiedOrder->return_msg); } if($unifiedOrder->result_code!='SUCCESS'){ die($unifiedOrder->err_code); } returntrue; } publicstaticfunctioncurlGet($url='',$options=array()) { $ch=curl_init($url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_TIMEOUT,30); if(!empty($options)){ curl_setopt_array($ch,$options); } //https请求不验证证书和host curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); $data=curl_exec($ch); curl_close($ch); return$data; } publicfunctioncurlPost($url='',$postData='',$options=array()) { if(is_array($postData)){ $postData=http_build_query($postData); } $ch=curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$postData); curl_setopt($ch,CURLOPT_TIMEOUT,30);//设置cURL允许执行的最长秒数 if(!empty($options)){ curl_setopt_array($ch,$options); } //https请求不验证证书和host curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); //第一种方法,cert与key分别属于两个.pem文件 //默认格式为PEM,可以注释 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert/apiclient_cert.pem'); //默认格式为PEM,可以注释 curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/cert/apiclient_key.pem'); //第二种方式,两个文件合成一个.pem文件 //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem'); $data=curl_exec($ch); curl_close($ch); return$data; } publicstaticfunctioncreateNonceStr($length=16) { $chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $str=''; for($i=0;$i<$length;$i++){ $str.=substr($chars,mt_rand(0,strlen($chars)-1),1); } return$str; } publicstaticfunctionarrayToXml($arr) { $xml=""; foreach($arras$key=>$val){ if(is_numeric($val)){ $xml.="<".$key.">".$val."".$key.">"; }else $xml.="<".$key.">".$key.">"; } $xml.=" "; return$xml; } publicstaticfunctiongetSign($params,$key) { ksort($params,SORT_STRING); $unSignParaString=self::formatQueryParaMap($params,false); $signStr=strtoupper(md5($unSignParaString."&key=".$key)); return$signStr; } protectedstaticfunctionformatQueryParaMap($paraMap,$urlEncode=false) { $buff=""; ksort($paraMap); foreach($paraMapas$k=>$v){ if(null!=$v&&"null"!=$v){ if($urlEncode){ $v=urlencode($v); } $buff.=$k."=".$v."&"; } } $reqPar=''; if(strlen($buff)>0){ $reqPar=substr($buff,0,strlen($buff)-1); } return$reqPar; } } ?>
github下载地址
相关文章:
php实现微信支付之企业付款
php实现微信支付之现金红包
php实现微信原生支付(扫码支付)功能
php微信支付之公众号支付功能
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。