/**
* 格式化参数格式化成url参数*/
public function ToUrl($arr)
{$buff = "";foreach ($arr as $k => $v)
{if($k != "sign" && $v != "" && !is_array($v)){$buff .= $k . "=" . $v . "&";
}
}$buff = trim($buff, "&");return $buff;
}//将乱序的数组
public function ToSign($arr,$key)
{//签名步骤一:按字典序排序参数
ksort($arr);$string = ToUrl($arr);//签名步骤二:在string后加入KEY
$string = $string . "&key=".$key;//签名步骤三:MD5加密
$string = md5($string);//签名步骤四:所有字符转为大写
// $result1 = strtoupper($string);
return $string;
}/**
* 输出xml字符
* @throws WxPayException
**/
public static function ToXml($arr)
{if(!is_array($arr) || count($arr) <= 0)
{echo ‘数据异常‘;
}$xml = "";foreach ($arr as $key=>$val)
{if (is_numeric($val)){$xml.="".$val."".$key.">";
}else{$xml.="".$key.">";
}
}$xml.="";return $xml;
}/**
* zll 生成唯一订单号*/
public functionorder_sn(){$str = "qyfk".uniqid();return $str;
}/**
* zll 将信息提交到微信服务器,发起企业付款*/
public function qyzf_post($url,$xml,$config,$second=30){$ch =curl_init();
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);//curl_setopt($ch,CURLOPT_SSLCERT,"/home/lizi/addons/grow/template/mobile/cash/apiclient_cert.pem");
// curl_setopt($ch,CURLOPT_SSLKEY,"/home/lizi/addons/grow/template/mobile/cash/apiclient_key.pem");
$str = ‘D:/www/‘;//证书必须使用绝对路径,否则报错,错误貌似是52什么的
curl_setopt($ch,CURLOPT_SSLCERTTYPE,‘PEM‘);
curl_setopt($ch,CURLOPT_SSLCERT,$str.trim($config[‘apiclient_cert‘],‘.‘));
curl_setopt($ch,CURLOPT_SSLKEYTYPE,‘PEM‘);
curl_setopt($ch,CURLOPT_SSLKEY,$str.trim($config[‘apiclient_key‘],‘.‘));
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);$data = curl_exec($ch);if($data){
curl_close($ch);return $data;
}else{$error = curl_errno($ch);echo "call faild, errorCode:$error\n";
curl_close($ch);return false;
}
}/**
* zll 企业付款*/
public function qiyezhifu($data){//解释amount为付款金额,单位分,貌似最低1元,desc为付款的描述(必填),ip就是服务器ip必填
//$data = array(‘wxappid‘=>14,‘openid‘=>‘oRyzq0LrtuqKqQdH-FubBqcMuTi8-‘,‘amount‘=>100,‘desc‘=>‘提现奖励‘,‘ip‘=>‘123.207.19.254‘);
//获取数据库的支付配置信息
$config = get_pay_conf($data[‘wxappid‘]);if($config){//对必备参数进行有效性判断
if(empty($config[‘appid‘]) || empty($config[‘shh‘]) || empty($config[‘partnerkey‘]) || empty($data[‘amount‘]) || empty($config[‘apiclient_cert‘]) || empty($config[‘apiclient_key‘])){throw new Exception("支付配置中的appid或商户号或支付秘钥不能为空,或支付金额不能为空");
}else{$da[‘mch_appid‘] = $config[‘appid‘]; //appid
$da[‘mchid‘] = $config[‘shh‘]; //商户号
$da[‘nonce_str‘] = $this->getStr(32); //随机字符串
$da[‘partner_trade_no‘] = $this->order_sn(); //订单号,保持唯一性即可
$da[‘openid‘] = $data[‘openid‘]; //粉丝的openid
$da[‘check_name‘] = "NO_CHECK"; //NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账) OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
//$da[‘re_user_name‘] = ""; //收款用户真实姓名。 如果check_name设置为FORCE_CHECK或OPTION_CHECK,则必填用户真实姓名
$da[‘amount‘] = $data[‘amount‘]; //付款金额,单位分
$da[‘desc‘] = $data[‘desc‘] ? $data[‘desc‘]:"提现奖励"; //企业付款描述信息
$da[‘spbill_create_ip‘] = $data[‘ip‘] ? $data[‘ip‘] : "123.207.19.254"; //服务器ip
$da[‘sign‘] = $this->ToSign($da, $config[‘partnerkey‘]);//生成签名
//$da[‘key‘] = $config[‘partnerkey‘]; //支付秘钥
//将数组转为xml
$xml = $this->ToXml($da);$url = ‘https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers‘;$this->qyzf_post($url,$xml,$config);
}
}else{return false;
}
}