'',
'mch_id'=>'',
'notify_url'=>'',
'out_trade_no'=>'',
'total_fee'=>'',
'trade_type'=>'',
'body'=>''
//'appsecret'=>''
);
private $file_conf=[
'cert_file'=>'',
'key_file'=>''
];
private $url='https://api.mch.weixin.qq.com/pay/unifiedorder';
function __construct($conf=null,$file_conf=[])
{
if($conf)$this->conf=$conf;
if(!empty($file_conf['cert_file'])){
$this->file_conf['cert_file']=$file_conf['cert_file'];
$this->file_conf['key_file']=empty($file_conf['key_file'])?'':$file_conf['key_file'];
}
}
/**
* 微信签名
*/
public function wxSign($data,$keys)
{
ksort($data);
$str='';
foreach($data as $key=>$val)
{
if($val)
{
if($str!='')$str.='&';
$str.="{$key}={$val}";
}
}
$str.='&key='.$keys;
$sign=strtoupper(MD5($str));
return $sign;
}
/**
* 获取客户端ip
* @return string
*/
private function getIp()
{
$cip=CommonServer::creatServer()->getClientIp();
// if ($_SERVER['REMOTE_ADDR']) {
// $cip = $_SERVER['REMOTE_ADDR'];
// } elseif (getenv("REMOTE_ADDR")) {
// $cip = getenv("REMOTE_ADDR");
// } elseif (getenv("HTTP_CLIENT_IP")) {
// $cip = getenv("HTTP_CLIENT_IP");
// } else {
// $cip = "unknown";
// }
return $cip;
}
/**
*
* 产生随机字符串,不长于32位
* @param int $length
* @return 产生的随机字符串
*/
public function getNonceStr($length = 32)
{
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ( $i = 0; $i < $length; $i++ ) {
$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
/**
* 微信退款
* @param $private_key
* @return array
*/
function wxPayRefund($private_key){
$data=$this->conf;
$data['nonce_str']=$this->getNonceStr();
$data['sign']=$this->wxSign($data,$private_key);
$xml = "";
foreach ($data as $key=>$val)
{
if (is_numeric($val))
{
$xml.="<".$key.">".$val."".$key.">";
}
else
$xml.="<".$key.">".$val."".$key.">";
}
$xml.="";
$url='https://api.mch.weixin.qq.com/secapi/pay/refund';
// $url='https://api.mch.weixin.qq.com/pay/orderquery';
$key_file=trim($this->file_conf['key_file'],'.');
$cert_file=trim($this->file_conf['cert_file'],'.');
if(!is_file($key_file) || !is_file($cert_file)){
return array('code'=>0,'data'=>'证书文件不存在');
}
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //设置访问路径
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //设置可以返回字符串
curl_setopt($ch, CURLOPT_POST,TRUE);//post请求
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, $cert_file);
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, $key_file);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//设置传递的参数
$request=curl_exec($ch);
curl_close($ch);
$request=json_decode(json_encode(simplexml_load_string($request, 'SimpleXMLElement', LIBXML_NOCDATA)),true);
if($request['return_code']=='SUCCESS'&&$request['result_code']=='SUCCESS')
{
return array('code'=>1,'data'=>$request);
}
else
{
return array('code'=>0,'data'=>$request);
}
}
function getPayOrder($private_key){
$data=$this->conf;
$data['nonce_str']=$this->getNonceStr();
// $data['spbill_create_ip']=$this->getIp();
$data['sign']=$this->wxSign($data,$private_key);
$xml = "";
foreach ($data as $key=>$val)
{
if (is_numeric($val))
{
$xml.="<".$key.">".$val."".$key.">";
}
else
$xml.="<".$key.">".$key.">";
}
$xml.="";
$key_file=trim($this->file_conf['key_file'],'.');
$cert_file=trim($this->file_conf['cert_file'],'.');
if(!is_file($key_file) || !is_file($cert_file)){
return array('code'=>0,'msg'=>'证书文件不存在');
}
$url='https://api.mch.weixin.qq.com/pay/orderquery';
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //设置访问路径
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //设置可以返回字符串
curl_setopt($ch, CURLOPT_POST,TRUE);//post请求
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, $cert_file);
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, $key_file);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//设置传递的参数
$request=curl_exec($ch);
curl_close($ch);
$request=json_decode(json_encode(simplexml_load_string($request, 'SimpleXMLElement', LIBXML_NOCDATA)),true);
if($request['return_code']=='SUCCESS'&&$request['result_code']=='SUCCESS')
{
return array('code'=>1,'msg'=>'订单信息','data'=>$request);
}
else
{
return array('code'=>0,'msg'=>empty($request['return_msg'])?'订单信息':($request['return_msg'].','.(empty($request['err_code_des'])?'':$request['err_code_des'])),'data'=>$request);
}
}
/**
*获取统一支付信息
* @param $private_key 支付秘钥
* @return array
*/
public function getOrder($private_key)
{
$data=$this->conf;
$data['nonce_str']=$this->getNonceStr();
$data['spbill_create_ip']=$this->getIp();
$data['sign']=$this->wxSign($data,$private_key);
$xml = "";
foreach ($data as $key=>$val)
{
if (is_numeric($val))
{
$xml.="<".$key.">".$val."".$key.">";
}
else
$xml.="<".$key.">".$key.">";
}
$xml.="";
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $this->url); //设置访问路径
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //设置可以返回字符串
curl_setopt($ch, CURLOPT_POST,TRUE);//post请求
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//设置传递的参数
$request=curl_exec($ch);
curl_close($ch);
$request=json_decode(json_encode(simplexml_load_string($request, 'SimpleXMLElement', LIBXML_NOCDATA)),true);
if($request['return_code']=='SUCCESS'&&$request['result_code']=='SUCCESS')
{
return array('code'=>1,'data'=>$request);
}
else
{
return array('code'=>0,'data'=>$request['return_msg']);
}
}
/**
* 获取用户openid
*/
public function get_openid()
{
$openid=session('wx_openid');
if($openid)return $openid;
$code=input('code','');
if(!$code)
{
$redirect_url='http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$redirect_url=urlencode($redirect_url);
$url="https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->conf['appid']}&redirect_uri={$redirect_url}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
redirect($url);return false;
}
else
{
$url="https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->conf['appid']}&secret={$this->conf['appsecret']}&code={$code}&grant_type=authorization_code";
$result=$this->send_request($url);
$result=json_decode($result,true);
if(isset($result['errcode']))
{
return false;
}
else
{
$openid=$result['openid'];
$access_token=$result['access_token'];
$url="https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={$this->conf['appid']}&grant_type=refresh_token&refresh_token={$result['refresh_token']} ";
$result=$this->send_request($url);
$result=json_decode($result,true);
if(isset($result['access_token'])){return $result['openid'];}
session('wx_openid',$openid);
return $openid;
}
}
}
/**
* @param $url
* @param string $type 请求方式
* @param string $postdata post数据 数组格式
* @return mixed
*/
private function send_request($url,$type='get',$postdata='')
{
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //设置访问路径
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //设置可以返回字符串
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
$head=array('User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36');
curl_setopt($ch, CURLOPT_HTTPHEADER,$head);
if($type=='post')
{
curl_setopt($ch, CURLOPT_POST,TRUE);//post请求
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);//设置传递的参数
}
$request=curl_exec($ch);
curl_close($ch);
return $request;
}
/**
* 企业付款到领钱
* @param $private_key
* @return array
*/
function setVerified($private_key){
$data=$this->conf;
$data['nonce_str']=$this->getNonceStr();
// $data['spbill_create_ip']=$this->getIp();
$data['spbill_create_ip']='119.23.242.246';
$data['sign']=$this->wxSign($data,$private_key);
$xml = "";
foreach ($data as $key=>$val)
{
if (is_numeric($val))
{
$xml.="<".$key.">".$val."".$key.">";
}
else
$xml.="<".$key.">".$key.">";
}
$xml.="";
$key_file=trim($this->file_conf['key_file'],'.');
$cert_file=trim($this->file_conf['cert_file'],'.');
// dd($key_file,$cert_file);
if(!is_file($key_file) || !is_file($cert_file)){
return array('code'=>0,'msg'=>'证书文件不存在');
}
$url='https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //设置访问路径
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //设置可以返回字符串
curl_setopt($ch, CURLOPT_POST,TRUE);//post请求
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, $cert_file);
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, $key_file);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//设置传递的参数
$request=curl_exec($ch);
curl_close($ch);
$request=json_decode(json_encode(simplexml_load_string($request, 'SimpleXMLElement', LIBXML_NOCDATA)),true);
if($request['return_code']=='SUCCESS'&&$request['result_code']=='SUCCESS')
{
return array('code'=>1,'msg'=>'提现成功','data'=>$request);
}
else
{
return array('code'=>0,'msg'=>empty($request['return_msg'])?'提现失败':($request['return_msg'].','.(empty($request['err_code_des'])?'':$request['err_code_des'])),'data'=>$request);
}
}
}