php微信支付php代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhongyuchuan147/article/details/67633997
//配置调起支付前的配置参数
    public $config=array(
        'appid'=>'',// 开放平台appid
        'mch_id'=>'',//商户id
        'device_info'=>'web',
        'api_key'=>'',//商户密匙
        'nonce_str'=>'设置的随机字符串',//随机字符串
        'sign_type'=>'MD5',
        'body'=>'app支付订单',
        'out_trade_no'=>'',//订单号
        'total_fee'=>'',//总金额
        'spbill_create_ip'=>'',//用户端ip
        'notify_url'=>'',//回调地址
        'trade_type'=>'APP'
    );


    public function pay(){
       //填写基本信息
        //获取当前服务器ip
        function get_client_ip()
        {
            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;
        }
        $host = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST']:'');

        $out_trade_no=$_POST['osn'];//订单号
        $total_fee = $_POST['total_fee'];//价格
        //调试
        // $out_trade_no=$_GET['osn'];//订单号
        // $total_fee = $_GET['total_fee'];//价格

        //获取指定长度的随机字符串
        function getRandChar($length){
            $str = null;
            $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
            $max = strlen($strPol)-1;
            for($i=0;$i<$length;$i++){
                $str.=$strPol[rand(0,$max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
            }
            return $str;
        }
        // echo getRandChar(32);exit;
        $data['appid']=$this->config['appid'];
        $data['mch_id']=$this->config['mch_id'];
        $data['device_info']=$this->config['device_info'];
        $data['nonce_str']=getRandChar(32); //随机字符串
        // $data['nonce_str']=$this->config['nonce_str']; //随机字符串测试
        $data['body']=$this->config['body'];
        $data['out_trade_no']=$out_trade_no;
        $data['total_fee']=$total_fee*100;
        $data['spbill_create_ip ']=$_SERVER['REMOTE_ADDR'];//用户ip  
        $data['trade_type']='APP';
        $data['notify_url']=$this->config['notify_url'];

        if($out_trade_no=='' or $total_fee==''){
            $sever=array();
            $sever['code']='4001';
            $sever['message']='无参数或参数错误';
            $sever['info']='';
            echo json_encode($sever); 
            exit;
        }

        //生成第一次签名数组字典排序
        ksort($data);
        // echo $data;

        //字符串拼接 
        foreach ($data as $key => $value) {
            $stringA.=$key.'='.$value.'&';
        }
       

        //第二次拼接得到签名
        $stringSignTemp=$stringA."key=".$this->config['api_key'];
         // echo $stringSignTemp;
        $stringSignTemp=preg_replace('# #','',$stringSignTemp);
        // echo $stringSignTemp;
        $data['sign']=strtoupper(MD5($stringSignTemp));//
        // echo $data['sign'];
        // var_dump($data);exit;

        //数组转xml
        $xml='<xml>';
        foreach ($data as $key => $value) {
            
            $xml=$xml.'<'.$key.'><![CDATA['.$value.']]></'.$key.'>';
        }

        $xml=$xml.'</xml>';
        // echo $xml;
        // exit;
        // echo json_encode($data);
        
        //准备要发送的请求
        $payurl = "https://api.mch.weixin.qq.com/pay/unifiedorder";  //微信统一下单接口地址

        //发送xml的方法
        function postXmlCurl($xml, $url, $useCert = false, $second = 30){       
            $ch = curl_init();
            //设置超时
            curl_setopt($ch, CURLOPT_TIMEOUT, $second);
            curl_setopt($ch,CURLOPT_URL, $url);
            curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
            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, WxPayConfig::SSLCERT_PATH);
                curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
                //curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::SSLKEY_PATH);
            }
            //post提交方式
            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
            //运行curl
            $data = curl_exec($ch);
            //返回结果
            if($data){
                curl_close($ch);
                return $data;
            } else { 
                $error = curl_errno($ch);
                curl_close($ch);
                return false;
            }
        }
        $Wxinxml= postXmlCurl($xml,$payurl);
        
        $parser = xml_parser_create(); //创建解析器   
        xml_parse_into_struct($parser, $Wxinxml, $values, $index);
         //解析到数组   
         xml_parser_free($parser); //释放资源   //显示数组结构   
    
         // print_r($values); 
         // var_dump($values);exit;
         $Arlist=array();
         for($i=0;$i<count($values);$i++){
            if($values[$i]['tag']!='XML'){
                $Arlist[$values[$i]['tag']]=$values[$i]['value'];
            }
         }
         if($Arlist['RETURN_CODE']!='SUCCESS'){
            $sever=array();
            $sever['code']='4005';
            $sever['message']='订单生成失败';
            $sever['info']='';
            echo json_encode($sever); 
            exit;

         }

         // var_dump($Arlist);exit;
         //时间戳
        $time=time();
        

        $warr=array(
            'appid'=>$Arlist['APPID'],
            'partnerid'=>$Arlist['MCH_ID'],
            // 'device_info'=>$Arlist['DEVICE_INFO'],
            'noncestr'=>$Arlist['NONCE_STR'],
            'prepayid'=>$Arlist['PREPAY_ID'],
            'package'=>"Sign=WXPay",
            // 'trade_type'=>$Arlist['TRADE_TYPE'],
        );
        $warr['timestamp']=$time;
        

        //二次签名
         ksort($warr); 
         $stringA='';
        foreach ($warr as $key => $value) {
            $stringA.=$key.'='.$value.'&';
        }
        $stringSignTemp=$stringA."key=".$this->config['api_key'];
        
        $stringSignTemp=preg_replace('# #','',$stringSignTemp);
        // echo $stringSignTemp;
        $warr['sign']=strtoupper(MD5($stringSignTemp));

        $sever=array();
        $sever['code']='200';
        $sever['message']='统一下单';
        $sever['info']=$warr;

        echo json_encode($sever); 
        exit;

    }

猜你喜欢

转载自blog.csdn.net/zhongyuchuan147/article/details/67633997
今日推荐