PHP实现微信退款功能
大家好,我是小编,最近在调微信退款接口,发现有许多坑,更大家分享一下
①要是在测试的时候,网页提示curl58说明证书的路径出现问题(这里要填物理路径,也就是绝对路径)
②网页提示curl52说明你的证书引入少了,在官方的demo上只有两个证书 apiclient_cert.pem和 apiclient_key.pem 你还需要引入一个证书 rootca.pem,这个证书需要你登录到
你的商户平台上下载
3.要是网页提示 "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();
赶快添加到你的项目中去吧。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。