php实现微信支付之退款功能
网上的很多PHP微信支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,希望可以给各位想接入微信支付的带来些许帮助和借鉴意义。
直接运行该文件即可给指定的微信用户退款。
需要注意的事项:
1.微信退款到零钱要求必传证书,需要到这里账户中心->账户设置->API安全->下载证书,然后修改代码中的证书路径
2.该文件需放到支付授权目录下,可以在微信支付商户平台->产品中心->开发配置中设置。
3.如提示签名错误可以通过微信支付签名验证工具进行验证:微信公众平台支付接口调试工具
4.错误码参照:参照地址
代码如下:
账户设置->API安全->下载证书,证书路径在第119行和122行修改
*2.错误码参照:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
*/
header('Content-type:text/html;Charset=utf-8');
$mchid='xxxxx';//微信支付商户号PartnerID通过微信支付商户资料审核后邮件发送
$appid='xxxxx';//微信支付申请对应的公众号的APPID
$apiKey='xxxxx';//https://pay.weixin.qq.com帐户设置-安全设置-API安全-API密钥-设置API密钥
$orderNo='';//商户订单号(商户订单号与微信订单号二选一,至少填一个)
$wxOrderNo='';//微信订单号(商户订单号与微信订单号二选一,至少填一个)
$totalFee=0.01;//订单金额,单位:元
$refundFee=0.01;//退款金额,单位:元
$refundNo='refund_'.uniqid();//退款订单号(可随机生成)
$wxPay=newWxpayService($mchid,$appid,$apiKey);
$result=$wxPay->doRefund($totalFee,$refundFee,$refundNo,$wxOrderNo,$orderNo);
if($result===true){
echo'refundsuccess';exit();
}
echo'refundfail';
classWxpayService
{
protected$mchid;
protected$appid;
protected$apiKey;
public$data=null;
publicfunction__construct($mchid,$appid,$key)
{
$this->mchid=$mchid;//https://pay.weixin.qq.com产品中心-开发配置-商户号
$this->appid=$appid;//微信支付申请对应的公众号的APPID
$this->apiKey=$key;//https://pay.weixin.qq.com帐户设置-安全设置-API安全-API密钥-设置API密钥
}
/**
*退款
*@paramfloat$totalFee订单金额单位元
*@paramfloat$refundFee退款金额单位元
*@paramstring$refundNo退款单号
*@paramstring$wxOrderNo微信订单号
*@paramstring$orderNo商户订单号
*@returnstring
*/
publicfunctiondoRefund($totalFee,$refundFee,$refundNo,$wxOrderNo='',$orderNo='')
{
$config=array(
'mch_id'=>$this->mchid,
'appid'=>$this->appid,
'key'=>$this->apiKey,
);
$unified=array(
'appid'=>$config['appid'],
'mch_id'=>$config['mch_id'],
'nonce_str'=>self::createNonceStr(),
'total_fee'=>intval($totalFee*100),//订单金额单位转为分
'refund_fee'=>intval($refundFee*100),//退款金额单位转为分
'sign_type'=>'MD5',//签名类型支持HMAC-SHA256和MD5,默认为MD5
'transaction_id'=>$wxOrderNo,//微信订单号
'out_trade_no'=>$orderNo,//商户订单号
'out_refund_no'=>$refundNo,//商户退款单号
'refund_desc'=>'商品已售完',//退款原因(选填)
);
$unified['sign']=self::getSign($unified,$config['key']);
$responseXml=$this->curlPost('https://api.mch.weixin.qq.com/secapi/pay/refund',self::arrayToXml($unified));
$unifiedOrder=simplexml_load_string($responseXml,'SimpleXMLElement',LIBXML_NOCDATA);
if($unifiedOrder===false){
die('parsexmlerror');
}
if($unifiedOrder->return_code!='SUCCESS'){
die($unifiedOrder->return_msg);
}
if($unifiedOrder->result_code!='SUCCESS'){
die($unifiedOrder->err_code);
}
returntrue;
}
publicstaticfunctioncurlGet($url='',$options=array())
{
$ch=curl_init($url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_TIMEOUT,30);
if(!empty($options)){
curl_setopt_array($ch,$options);
}
//https请求不验证证书和host
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
$data=curl_exec($ch);
curl_close($ch);
return$data;
}
publicfunctioncurlPost($url='',$postData='',$options=array())
{
if(is_array($postData)){
$postData=http_build_query($postData);
}
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$postData);
curl_setopt($ch,CURLOPT_TIMEOUT,30);//设置cURL允许执行的最长秒数
if(!empty($options)){
curl_setopt_array($ch,$options);
}
//https请求不验证证书和host
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
//第一种方法,cert与key分别属于两个.pem文件
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert/apiclient_cert.pem');
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/cert/apiclient_key.pem');
//第二种方式,两个文件合成一个.pem文件
//curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');
$data=curl_exec($ch);
curl_close($ch);
return$data;
}
publicstaticfunctioncreateNonceStr($length=16)
{
$chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$str='';
for($i=0;$i<$length;$i++){
$str.=substr($chars,mt_rand(0,strlen($chars)-1),1);
}
return$str;
}
publicstaticfunctionarrayToXml($arr)
{
$xml="";
foreach($arras$key=>$val){
if(is_numeric($val)){
$xml.="<".$key.">".$val."".$key.">";
}else
$xml.="<".$key.">".$key.">";
}
$xml.=" ";
return$xml;
}
publicstaticfunctiongetSign($params,$key)
{
ksort($params,SORT_STRING);
$unSignParaString=self::formatQueryParaMap($params,false);
$signStr=strtoupper(md5($unSignParaString."&key=".$key));
return$signStr;
}
protectedstaticfunctionformatQueryParaMap($paraMap,$urlEncode=false)
{
$buff="";
ksort($paraMap);
foreach($paraMapas$k=>$v){
if(null!=$v&&"null"!=$v){
if($urlEncode){
$v=urlencode($v);
}
$buff.=$k."=".$v."&";
}
}
$reqPar='';
if(strlen($buff)>0){
$reqPar=substr($buff,0,strlen($buff)-1);
}
return$reqPar;
}
}
?>
github下载地址
相关文章:
php实现微信支付之企业付款
php实现微信支付之现金红包
php实现微信原生支付(扫码支付)功能
php微信支付之公众号支付功能
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。