废话不多少 直接上代码 退款是需要证书验证的 根据你自己的证书存放的位置自己修改
// 订单退款
public function refund($order){
// 需要传递的参数
$post = array(
'appid'=>Config::get('AppId'),
'mch_id'=>Config::get('MchId'),
'nonce_str'=>md5($order['transaction_id']),
'transaction_id'=>$order['transaction_id'],
'out_refund_no'=>$order['out_refund_no'],
'out_trade_no'=>$order['order_sn'],
'total_fee'=>$order['order_amount']*100,
'refund_fee'=>$order['order_amount']*100,
);
// 排序
ksort( $post);
// 获取签名
$post['sign'] = $this->get_sign($post);
// 生成XML
$post_data = $this->arrayToXml($post);
// 请求路径
$url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
// curl 请求接口
$dataxml =$this->post($url, $post_data);
$objectxml = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA); //将微信返回的XML 转换成数组
return $objectxml;
}
// 生成签名
private function get_sign($arrdata){
// 数组序列化
$strdata = $this->myKsort($arrdata);
// 串上KEY
$strSignTmp = $strdata."&key=".Config::get('key');
// md5加密
$sign = MD5($strSignTmp);
// 数据小写
$sign = strtoupper($sign);
return $sign;
}
// 请求数据序列化
private function myKsort($data){
// 数组按照ASK排序
// 去空
$data=array_filter($data);
//签名步骤一:按字典序排序参数
ksort($data);
$strdata=http_build_query($data);
$strdata=urldecode($strdata);
// 打回数据
return $strdata;
}
// 数组转XML
private function arrayToXml($arr)
{
$xml = "<xml>";
foreach ($arr as $key=>$val)
{
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
// if (is_numeric($val)){
// $xml.="<".$key.">".$val."</".$key.">";
// }else{
// $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
// }
}
$xml.="</xml>";
return $xml;
}
private function post( $url,$strXml) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 只信任CA颁布的证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名,并且是否与提供的主机名匹配
curl_setopt($ch, CURLOPT_SSLCERT,$_SERVER['DOCUMENT_ROOT'].'/weixin/apiclient_cert.pem');
curl_setopt($ch, CURLOPT_SSLKEY,$_SERVER['DOCUMENT_ROOT'].'/weixin/apiclient_key.pem');
//curl_setopt($ch, CURLOPT_CAINFO, $_SERVER['DOCUMENT_ROOT'].'/public/weixin/rootca.pem'); // CA根证书(用来验证的网站证书是否是CA颁布)
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $strXml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$res = curl_exec($ch);
$err_code = curl_errno($ch);
curl_close($ch);
return $res;
}