接上文提到的微信支付为前提做的微信退款
服务商模式下的退款,对应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;
}