PHP服务商模式微信支付退款

接上文提到的微信支付为前提做的微信退款
服务商模式下的退款,对应api接口是:https://api.mch.weixin.qq.com/v3/refund/domestic/refunds
可看文档:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_9.shtml
废话不多说,上代码:

function wxRefunds($param){        
    $url = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds";
    $url_parts = parse_url($url);
    $canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
    $timeStamp = time();
    $noncestr = nonce_str();
    // var_dump($param);
    $params['sub_mchid']=$param['mch_id'];//子商户的商户号---商品对应的门店
    $params['transaction_id'] = $param['transaction_id'];//支付回调时候获取到的
    $params['out_refund_no'] = $param['refund_order_sn'];//自定义
    // $params['notify_url'] = $param['notify_url'];
    $params['amount']['refund'] = intval($param['refund_price']);//退款金额
    $params['amount']['total'] = intval($param['total_price']);//订单总额
    // $params['amount']['refund'] = 1;//退款金额
    // $params['amount']['total'] = 1;
    $params['amount']['currency'] = 'CNY';
    $json = json_encode($params);
    // var_dump($json);
    $key = getSign_v3($json, $canonical_url, $noncestr, $timeStamp);//签名
    $mchid = $param['mch_id'];//商户ID
    $serial_no = '*******';//证书序列号
    $token = sprintf('mchid="%s",nonce_str="%s",signature="%s",timestamp="%d",serial_no="%s"',
        $mchid, $noncestr, $key, $timeStamp, $serial_no);
        // var_dump($token);
    $header = array(
        'Content-Type:' . 'application/json; charset=UTF-8',
        'Accept:application/json',
        'User-Agent:*/*',
        'Authorization: WECHATPAY2-SHA256-RSA2048 '.$token
    );
    // var_dump($header);
    $result = curl_post_https($url,$json,$header);
    // var_dump($result);
    // \Think\Log::write('wxrefunds '.$result);
    return $result;

    }
   function getSign_v3($data, $url, $randstr, $time)
    {
        $str = "POST" . "\n" . $url . "\n" . $time . "\n" . $randstr . "\n" . $data . "\n";
        $key = file_get_contents('./apiclient_key.pem');//在子商户平台下载的秘钥文件--
        $str = getSha256WithRSA($str, $key);
        return $str;
    }
 function getSha256WithRSA($content, $privateKey)
    {
        $binary_signature = "";
        $algo = "SHA256";
        openssl_sign($content, $binary_signature, $privateKey, $algo);
        $sign = base64_encode($binary_signature);
        return $sign;
    }
 function curl_post_https($url, $data, $header)
    { // 模拟提交数据函数
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        curl_setopt($curl, CURLOPT_TIMEOUT, 30);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        $result = curl_exec($curl);
        if (curl_errno($curl)) {
            $error = curl_error($curl);
            Log::write('curl_post_https-'.$error);
        }
        curl_close($curl);
        return $result;
    }
  function nonce_str(){
        $result = '';
        $str = 'QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz';
        for ($i=0;$i<32;$i++){
            $result .= $str[rand(0,48)];
        }
        return $result;
    }

猜你喜欢

转载自blog.csdn.net/zax_96/article/details/126420641