微信退款开发过程

18 篇文章 0 订阅
微信退款需要配置的数据有:
公众号的  $appid
商户号  $mch_id 
随机字符串 $nonce_str
商户订单号  $out_trade_no
商户退单号  $out_refund_no
退款总金额  $refund_fee   
订单总金额  $total_fee    
操作员帐号  $op_user_id   
商户平台中对应的key值 $key
---------------------------------
注意事项:
1.订单总金额和退款总金额是 处理单位是分 而且只能是整数
2.操作员账号 可以 用商户号就可以
3.商户退单号:自己随机一个只要不重复就可以,为了方便只要放上订单号就行本身也是不重复的
----------------------------------
使用:
	根据上面的信息进行签名生成:
	1.生成一个随机字符串
	// 签名设置中随机字符串
		function nonceStr(){
			$chars = "abcdefghijklmnopqrstuvwxyz0123456789";  
			$str ="";
			$length = 32;
			for($i = 0; $i < $length; $i++){  
				$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);  
			} 
			// 随机字符串
			return $str;
		}
	2.签名生成
		$arrayName = array('op_user_id'=>$op_user_id,'refund_fee'=>$refund_fee,
		'total_fee'=>$total_fee,'appid'=>$appid,'mch_id'=>$mch_id,'out_trade_no'=>$out_trade_no,
		'nonce_str'=>$nonce_str,'out_refund_no'=>$out_refund_no);
		ksort($arrayName);
		$sign = '';
		foreach ($arrayName as $key => $value) {
			$sign.='&'.$key.'='.$value;
		}
		// 进行拼凑
		// 去掉开头的&并且进行MD5加密处理
		$stringSignTemp = ltrim($sign,'&');
		$key = "商户号申请的时候你自己的输入的key值";
		$stringSignTemp =  $stringSignTemp.'&key='.$key;
		$sign = md5($stringSignTemp);
		$sign = strtoupper($sign);// 最终获得签名的值
	3.把上面的所有数据进行组成xml数据
		$xmldata = "<xml><appid>".$appid."</appid><mch_id>".$mch_id."</mch_id><nonce_str>"
		     .$nonce_str."</nonce_str><op_user_id>".$op_user_id."</op_user_id><out_refund_no>".
			 $out_refund_no."</out_refund_no><out_trade_no>". $out_trade_no."</out_trade_no><refund_fee>".
			 $refund_fee ."</refund_fee><total_fee>". $total_fee."</total_fee><sign>".$sign."</sign></xml>";
    4.微信退款接口准备:
		$url = 'https://api.mch.weixin.qq.com/secapi/pay/refund';// 退款微信接口准备
	5.进行curl 有证书post数据
	    function postXmlCurl($xmldata, $url, $useCert = false, $second = 6)
		{       
			// 证书验证与否

			$ch = curl_init();
			// 设置超时
			curl_setopt($ch, CURLOPT_TIMEOUT, $second);
			curl_setopt($ch,CURLOPT_URL, $url);
			curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
			curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
			// 设置header
			curl_setopt($ch, CURLOPT_HEADER, FALSE);
			// 要求结果为字符串且输出到屏幕上
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
			// 退款严格使用证书,必须是公众号所对应的商户平台下的证书才可以,安全不的外泄
			if($useCert == true){
				// 设置证书
				// 使用证书:cert 与 key 分别属于两个.pem文件
				curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
				curl_setopt($ch,CURLOPT_SSLCERT,ROOT_PATH."wxpay/cert/apiclient_cert.pem");
				curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
				curl_setopt($ch,CURLOPT_SSLKEY,ROOT_PATH."wxpay/cert/apiclient_key.pem");
			}
			// post提交方式
			curl_setopt($ch, CURLOPT_POST, TRUE);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);
			// 运行curl
			$xml = curl_exec($ch);
			// 返回结果0的时候能只能表明程序是正常返回不一定说明退款成功而已
			if($xml){
				curl_close($ch);
				// 把xml转化成数组
				libxml_disable_entity_loader(true); 
				$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); 
				$result['errNum'] = 0;
				$result['info'] = objectToArray($xmlstring);
				return $result;
			}else{ 
				$error = curl_errno($ch);
				curl_close($ch);
				// 错误的时候返回错误码。
				$result['errNum'] = $error;
				return $result;
			}
		}
    注意:开发过程中,遇到的问题:证书:需要在上商户平台中获得然后根据自己的实际路径进行填写。

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gjanuary

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值