TP3微信企业付款工具类

<?php
	namespace Admin\Controller;
	use Think\Controller;
	
	/*
	 * 该类用于企业转账
	 */
	class TransController extends Controller{
		
	   	private $appid = '';
	   	private $appsecret = '';
	    private $mchid = '';
	    private $key = '';
	    
	    
	    public function _initialize(){
	        
	        $paymentPlugin = M('Plugin')->where("code='weixin' and  type = 'payment' ")->find(); // 找到微信支付插件的配置
	        $config_value = unserialize($paymentPlugin['config_value']); // 配置反序列化
	        $this->appid = $config_value['appid']; // * APPID:绑定支付的APPID(必须配置,开户邮件中可查看)
	        $this->mchid = $config_value['mchid']; // * MCHID:商户号(必须配置,开户邮件中可查看)
	        $this->key = $config_value['key']; // KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置)
	        $this->appsecret = $config_value['appsecret']; // 公众帐号secert(仅JSAPI支付的时候需要配置),
	    }
	    
	   
    	
    	//企业付款调用该方法
	    public function trans($openID,$money,$nickname=''){
	    	$params = array(
	    		'partner_trade_no' => $this->createPayid(),//生成订单号
	    		'openid' => $openID,
	    		'check_name' => 'NO_CHECK',
	    		'amount' => $money*100,
	    		'desc' => $nickname.'余额提现',
	    	);
	    	
	    	//证书路径
	    	$apicent_cert = CERT_PATH . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR. 'payment' . DIRECTORY_SEPARATOR . 'weixin' . DIRECTORY_SEPARATOR . 'cert' . DIRECTORY_SEPARATOR . 'apiclient_cert.pem';
	        $apiclient_key  = CERT_PATH . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR. 'payment' . DIRECTORY_SEPARATOR . 'weixin' . DIRECTORY_SEPARATOR . 'cert' . DIRECTORY_SEPARATOR . 'apiclient_key.pem';
	    	//$ca = WWWROOT . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR. 'payment' . DIRECTORY_SEPARATOR . 'weixin' . DIRECTORY_SEPARATOR . 'cert' . DIRECTORY_SEPARATOR . 'rootca.pem';
	        
	        $res = $this->payToUser($params,$apicent_cert,$apiclient_key);
	        
	    	
	    	if($res->result_code=='SUCCESS'){
	    	    return true;//转账成功
	    	}else{
	    	    $return_message = (string)$res->err_code_des;
	    	    return $return_message;
	    	}
	    	
	    	//获取支付结果
	    	//dump($res);
//	    	object(SimpleXMLElement)#7 (10) {
//				  ["return_code"] => string(7) "SUCCESS"
//				  ["return_msg"] => object(SimpleXMLElement)#8 (0) {
//				  }
//				  ["mch_appid"] => string(18) "wx6634becf2098b785"
//				  ["mchid"] => string(10) "1380838302"
//				  ["device_info"] => object(SimpleXMLElement)#9 (0) {
//				  }
//				  ["nonce_str"] => string(15) "848141333395157"
//				  ["result_code"] => string(7) "SUCCESS"
//				  ["partner_trade_no"] => string(16) "2016110909251350"
//				  ["payment_no"] => string(28) "1000018301201611094809686639"
//				  ["payment_time"] => string(19) "2016-11-09 09:25:15"
//				}
	    	
	    	
	    }
    	
    	
    	
    	/**
		 *  array转xml
		 */
		public function arrayToXml($arr){
			
		    $xml = "<xml>";
		    foreach ($arr as $key=>$val)
		    {
		        if (is_numeric($val))
		        {
		               $xml.="<".$key.">".$val."</".$key.">"; 
		
		        }
		        else
		        $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";  
		    }
		    $xml.="</xml>";
		    return $xml; 
		}
		
		
		public function createNoncestr( $length = 15 ) {
			$chars = "01234567890123456789";  
			$str ="";
			for ( $i = 0; $i < $length; $i++ )  {  
				$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);  
			}  
			return $str;
		}
		
		/**
	    *   作用:使用证书,以post方式提交xml到对应的接口url
	    */
	    public function postXmlSSLCurl($xml, $url, $second, $cert, $key){
	    	
	        $ch = curl_init();
	        //超时时间
	        curl_setopt($ch,CURLOPT_TIMEOUT,$second ? $second : $this->timeout);
	        
	        //这里设置代理,如果有的话
	        //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
	        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
	        curl_setopt($ch,CURLOPT_URL, $url);
	        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
	        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
	        //设置header
	        curl_setopt($ch,CURLOPT_HEADER,FALSE);
	        //要求结果为字符串且输出到屏幕上
	        curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
	        //设置证书
	        //使用证书:cert 与 key 分别属于两个.pem文件
	        //默认格式为PEM,可以注释
	        curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
	        curl_setopt($ch,CURLOPT_SSLCERT,$cert);
	        //默认格式为PEM,可以注释
	        curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
	        curl_setopt($ch,CURLOPT_SSLKEY, $key);
	        
	        //curl_setopt ($ch, CURLOPT_CAINFO, $ca);
	        //post提交方式
	        curl_setopt($ch,CURLOPT_POST, true);
	        curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
	        $data = curl_exec($ch);
	        
	        //返回结果
	        if($data){
	        	curl_close($ch);
	        	//file_put_contents("./nimamama",$data);
	            $restran = simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);//解析XML到对象
	    		//$restran = json_decode($restran,true);
	            return $restran;
	        }
	        else {
	            $error = curl_errno($ch);
	            echo "curl出错,错误码:$error"."<br>"; 
	            curl_close($ch);
	            return false;
	        }
	    }
	    
	    
	    
	    //生成订单号(最好在其它业务里生成该订单号,传到该类需要的函数中,Powered BY UNIX8.NET)
	    public function createPayid()
	    {
	        return date('Ymdhis', time()) . substr(floor(microtime() * 1000), 0, 1) . rand(0, 9);
	    }
	    
	    
	    
	    //企业向个人付款
	    public function payToUser($params, $apicent_cert, $apiclient_key) {
	        $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
	        
	        //检测必填参数
	        if($params["partner_trade_no"] == null) {   //
	            exit("退款申请接口中,缺少必填参数partner_trade_no!"."<br>");
	        }elseif($params["openid"] == null){
	            exit("退款申请接口中,缺少必填参数openid!"."<br>");
	        }elseif($params["check_name"] == null){             //NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
	            exit("退款申请接口中,缺少必填参数check_name!"."<br>");
	        }elseif(($params["check_name"] == 'FORCE_CHECK' or $params["check_name"] == 'OPTION_CHECK') && ($params["re_user_name"] == null)){  //收款用户真实姓名。
	            exit("退款申请接口中,缺少必填参数re_user_name!"."<br>");
	        }elseif($params["amount"] == null){
	            exit("退款申请接口中,缺少必填参数amount!"."<br>");
	        }elseif($params["desc"] == null){
	            exit("退款申请接口中,缺少必填参数desc!"."<br>");
	        }
	        
	        $params["mch_appid"] = $this->appid;//公众账号ID
	        $params["mchid"] = $this->mchid;//商户号
	        $params["nonce_str"] = $this->createNoncestr();//随机字符串
	        $params['spbill_create_ip'] = $_SERVER['REMOTE_ADDR'] == '::1' ? '192.127.1.1' : $_SERVER['REMOTE_ADDR'];//获取IP
	        
	        
	        $params["sign"] = $this->getSign($params);//获取签名
	        
	        $xml = $this->arrayToXml($params);
	        
	        return $this->postXmlSSLCurl($xml, $url, false, $apicent_cert, $apiclient_key);
	    }
	    
	    
	    public function formatBizQueryParaMap($paraMap, $urlencode)
		{
			//var_dump($paraMap);//die;
			$buff = "";
			ksort($paraMap);
			foreach ($paraMap as $k => $v)
			{
				if($urlencode)
				{
					$v = urlencode($v);
				}
				//$buff .= strtolower($k) . "=" . $v . "&";
				$buff .= $k . "=" . $v . "&";
			}
			$reqPar;
			if (strlen($buff) > 0)
			{
				$reqPar = substr($buff, 0, strlen($buff)-1);
			}
			//var_dump($reqPar);//die;
			return $reqPar;
		}
		
		/**
		 * 	作用:生成签名
		 */
		public function getSign($Obj)
		{
			//var_dump($Obj);//die;
			foreach ($Obj as $k => $v)
			{
				$Parameters[$k] = $v;
			}
			//签名步骤一:按字典序排序参数
			ksort($Parameters);
			$String = $this->formatBizQueryParaMap($Parameters, false);
			//echo '【string1】'.$String.'</br>';
			//签名步骤二:在string后加入KEY
			$String = $String."&key=".$this->key;
			//echo "【string2】".$String."</br>";
			//签名步骤三:MD5加密
			$String = md5($String);
			//echo "【string3】 ".$String."</br>";
			//签名步骤四:所有字符转为大写
			$result_ = strtoupper($String);
			//echo "【result】 ".$result_."</br>";
			return $result_;
		}

	    
	    
	    
    
    
	}

?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值