微信退款
微信退款接口注意点:
1.transaction_id(支付流水号,是微信支付返回的流水号)和out_trade_no(商户发起微信支付时自己生成的唯一单号)必填至少一个。
2.out_refund_no退款单号,这个是商户自己生成的唯一退款单号,可以随意生成一个。
3.total_fee(该笔订单微信支付时的实付金额,单位:分),必须和 该笔订单微信支付时的实付金额 保持一致;
4.refund_fee退款费用,必须小于等于 total_fee
5.报签名错误注意退款的密钥信息必须和支付时的密钥信息一致(如,微信小程序支付密钥信息不能用app退款密钥去生成退款签名)
6.退款时必须带上支付证书文件,像这样
public function curlWxXml($api,$xml){
$env = \think\Env::get('env_type','');
if(!empty($_REQUEST['patient_mini_pay'])&&$env=='pro'){
//证书路径
$SSLCERT_PATH = '/data/app/sz-api/cert/third/apiclient_cert.pem';
$SSLKEY_PATH='/data/app/sz-api/cert/third/apiclient_key.pem';
}else{
//证书路径
$SSLCERT_PATH = '/data/app/sz-api/cert/apiclient_cert.pem';
$SSLKEY_PATH='/data/app/sz-api/cert/apiclient_key.pem';
}
$header[] = "Content-type: text/xml"; //定义content-type为xml,注意是数组
$ch = curl_init ($api);
curl_setopt($ch, CURLOPT_URL, $api);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
//使用证书
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, $SSLCERT_PATH);
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, $SSLKEY_PATH);
$response = curl_exec($ch);
if(curl_errno($ch)){
print curl_error($ch);
exit();
}
curl_close($ch);
return $response;
}
//发起退款方法
public function refund($config)
{
$params = [];
$params['appid'] = $config['appid'];
$params['mch_id'] = $config['mch_id'];
$params['nonce_str'] = $this->getNonceStr();
$params['transaction_id'] = $config['transaction_id'];
$params['out_trade_no'] = $config['out_trade_no'];
$params['out_refund_no'] = $config['out_refund_no'];
$params['total_fee'] = $config['total_fee']*100;
$params['refund_fee'] = $config['refund_fee']*100;
$params['refund_desc'] = !empty($config['refund_desc'])? $config['refund_desc']:"";
//获取签名
$sign = $this->makeSign($params);
$params['sign'] = $sign;
$xml = $this->ToXml($params);
$api = "https://api.mch.weixin.qq.com/secapi/pay/refund";
$curlData = $this->curlWxXml($api, $xml);
$curlData = simplexml_load_string($curlData, 'SimpleXMLElement', LIBXML_NOCDATA);
$curlData = json_decode(json_encode($curlData), true);
return $curlData;
}
这是在调用refund之后的返回结果判断
if ( $curlData['return_code'] !== "SUCCESS" || ( !empty( $curlData['result_code'] ) && $curlData['result_code'] == "FAIL" ) ) {
throw new Exception(!empty( $curlData->return_msg) ? $curlData->return_msg : '退款失败');
}