123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 |
- <?php
- namespace App\Servers\Weixin;
- use App\Servers\CommonServer;
- /**
- * 统一下单
- * Created by PhpStorm.
- * User: Administrator
- * Date: 2016/10/24
- * Time: 11:28
- */
- class Unifiedorder
- {
- private $conf=array(
- 'appid'=>'',
- '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 = "<xml>";
- foreach ($data as $key=>$val)
- {
- if (is_numeric($val))
- {
- $xml.="<".$key.">".$val."</".$key.">";
- }
- else
- $xml.="<".$key.">".$val."</".$key.">";
- }
- $xml.="</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 = "<xml>";
- foreach ($data as $key=>$val)
- {
- if (is_numeric($val))
- {
- $xml.="<".$key.">".$val."</".$key.">";
- }
- else
- $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
- }
- $xml.="</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 = "<xml>";
- foreach ($data as $key=>$val)
- {
- if (is_numeric($val))
- {
- $xml.="<".$key.">".$val."</".$key.">";
- }
- else
- $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
- }
- $xml.="</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 = "<xml>";
- foreach ($data as $key=>$val)
- {
- if (is_numeric($val))
- {
- $xml.="<".$key.">".$val."</".$key.">";
- }
- else
- $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
- }
- $xml.="</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);
- }
- }
- }
|