微信退款需要配置的数据有:
公众号的 $appid
商户号 $mch_id
随机字符串 $nonce_str
商户订单号 $out_trade_no
商户退单号 $out_refund_no
退款总金额 $refund_fee
订单总金额 $total_fee
操作员帐号 $op_user_id
商户平台中对应的key值 $key
---------------------------------
注意事项:
1.订单总金额和退款总金额是 处理单位是分 而且只能是整数
2.操作员账号 可以 用商户号就可以
3.商户退单号:自己随机一个只要不重复就可以,为了方便只要放上订单号就行本身也是不重复的
----------------------------------
使用:
根据上面的信息进行签名生成:
1.生成一个随机字符串
// 签名设置中随机字符串
function nonceStr(){
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
$length = 32;
for($i = 0; $i < $length; $i++){
$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
// 随机字符串
return $str;
}
2.签名生成
$arrayName = array('op_user_id'=>$op_user_id,'refund_fee'=>$refund_fee,
'total_fee'=>$total_fee,'appid'=>$appid,'mch_id'=>$mch_id,'out_trade_no'=>$out_trade_no,
'nonce_str'=>$nonce_str,'out_refund_no'=>$out_refund_no);
ksort($arrayName);
$sign = '';
foreach ($arrayName as $key => $value) {
$sign.='&'.$key.'='.$value;
}
// 进行拼凑
// 去掉开头的&并且进行MD5加密处理
$stringSignTemp = ltrim($sign,'&');
$key = "商户号申请的时候你自己的输入的key值";
$stringSignTemp = $stringSignTemp.'&key='.$key;
$sign = md5($stringSignTemp);
$sign = strtoupper($sign);// 最终获得签名的值
3.把上面的所有数据进行组成xml数据
$xmldata = "<xml><appid>".$appid."</appid><mch_id>".$mch_id."</mch_id><nonce_str>"
.$nonce_str."</nonce_str><op_user_id>".$op_user_id."</op_user_id><out_refund_no>".
$out_refund_no."</out_refund_no><out_trade_no>". $out_trade_no."</out_trade_no><refund_fee>".
$refund_fee ."</refund_fee><total_fee>". $total_fee."</total_fee><sign>".$sign."</sign></xml>";
4.微信退款接口准备:
$url = 'https://api.mch.weixin.qq.com/secapi/pay/refund';// 退款微信接口准备
5.进行curl 有证书post数据
function postXmlCurl($xmldata, $url, $useCert = false, $second = 6)
{
// 证书验证与否
$ch = curl_init();
// 设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
// 设置header
curl_setopt($ch, CURLOPT_HEADER, FALSE);
// 要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
// 退款严格使用证书,必须是公众号所对应的商户平台下的证书才可以,安全不的外泄
if($useCert == true){
// 设置证书
// 使用证书:cert 与 key 分别属于两个.pem文件
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT,ROOT_PATH."wxpay/cert/apiclient_cert.pem");
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY,ROOT_PATH."wxpay/cert/apiclient_key.pem");
}
// post提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);
// 运行curl
$xml = curl_exec($ch);
// 返回结果0的时候能只能表明程序是正常返回不一定说明退款成功而已
if($xml){
curl_close($ch);
// 把xml转化成数组
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$result['errNum'] = 0;
$result['info'] = objectToArray($xmlstring);
return $result;
}else{
$error = curl_errno($ch);
curl_close($ch);
// 错误的时候返回错误码。
$result['errNum'] = $error;
return $result;
}
}
注意:开发过程中,遇到的问题:证书:需要在上商户平台中获得然后根据自己的实际路径进行填写。
微信退款开发过程
最新推荐文章于 2024-08-11 03:33:32 发布