微信退款接口注意点:

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 : '退款失败');
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注