微信退款
微信退款接口注意点:
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 : '退款失败'); }