微信企业付款

<?php

   class wxTransfer
  {
       public function pay_transfer($zid)
      {

          $apply=M('cashier_balance');//生成模型
          $where='id='.$zid;
          $db_config = loadConfig('db');
          $tablepre = $db_config['default']['tablepre'];
          $sql="select mid,openid,cash from ".$tablepre.'cashier_balance where '. $where;
          $share=new model();
          $data=$share->selectBySql($sql);
          $mid=$data[0]['mid'];
          $openid=$data[0]['openid'];
          $cash=$data[0]['cash']*100;
            // echo $mid,$openid,$cash;
            // die;

          $wx_user = M('cashier_payconfig')->getwxuserConf($mid);
          $apiclient_cert_url = rawurldecode($wx_user['apiclient_cert']);
          $apiclient_key_url = rawurldecode($wx_user['apiclient_key']);
          $rootca_url = rawurldecode($wx_user['rootca']);
          //var_dump($wx_user);die;
           $ip = $this -> dangqiangIp();
           //echo $ip;die;
           $api='https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
            //构造参数
            $randString=md5(uniqid());
            $randOrder='000'.rand(1,1000000);
            $data=[
            'mch_appid'=>$wx_user['appid'],//
            'mchid'=>$wx_user['mchid'],//
            'nonce_str'=>$randString,//
            'partner_trade_no'=>$randOrder,//
            'openid' =>$openid,//
            'check_name' => 'NO_CHECK',
            'amount'=>$cash,//单位是分
            'desc'=>'付款',
            'spbill_create_ip'=> $ip,//终端ip
            ];
            //对以上参数计算签名
            ksort($data);//以键名排序
            $string='';
            foreach($data as $k=>$v)
            {
                $string.="$k=$v&";
            }
            //把秘钥连接到参数上
            $string.='key='.$wx_user['key'];
            //把链接的字符串全部大写再MD5加密
            $sign=strtoupper(md5($string));
            //把参数和签名放到一起
            $data['sign']=$sign;
            //参数转成xml
            $xml='<xml>';
            foreach($data as $k=>$v)
            {
                $xml.="<$k>$v</$k>";
            }
            $xml.='</xml>';


            $ret = $this->postXmlCurl($api,$isHttps = TRUE, $apiclient_cert_url, $apiclient_key_url, $rootca_url, $xml);
            $xml=simplexml_load_string($ret);
            if($xml->result_code=='SUCCESS')
            {
                file_put_contents('./upload/log/xml.txt',strlen($ret));
                // if(strlen($ret)>=530)
                // {

                    $where='id='.$zid;
                    $db_config = loadConfig('db');
                    $tablepre = $db_config['default']['tablepre'];
                    $time=time();
                    $sql="update ".$tablepre.'cashier_balance set pay_state=2,pay_time='.$time . ' where '. $where;
                    $share=new model();
                    $data=$share->selectBySql($sql);
                    // echo "<script>alert('付款成功');location.href='?m=User&c=balance&a=pay_list'</script>";
                    return true;

                // }else
                // {
                //     // echo "<script>alert('付款失败,请检查错误原因');location.href='?m=User&c=balance&a=apply_list'</script>";
                //     file_put_contents('./upload/log/xml.txt', $ret);
    //                 return false;
                // }
            }else
            {
                return false;
                die('error~');
            }

    }

    public function postXmlCurl($url, $isHttps = TRUE, $apiclient_cert_url, $apiclient_key_url, $rootca_url, $xml)
    {
         // 创建curl对象
         $ch = curl_init ();
        // 配置这个对象
        curl_setopt ( $ch, CURLOPT_URL, $url);  // 请求的URL地址
        if($isHttps)
        {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检查SSL加密算法是否存在
        }
        curl_setopt($ch,CURLOPT_SSLCERT,getcwd()."$apiclient_cert_url");
        curl_setopt($ch,CURLOPT_SSLKEY,getcwd()."$apiclient_key_url");
        curl_setopt($ch,CURLOPT_CAINFO,"$rootca_url");
        // post提交方式
        curl_setopt ( $ch, CURLOPT_POST, 1);  // 是否是POST请求
        curl_setopt ( $ch, CURLOPT_HEADER, 0);  // 去掉HTTP协议头
        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1);  // 返回接口的结果,而不是输出
        curl_setopt($ch,CURLOPT_POSTFIELDS,  $xml); // 提交的数据
        $data = curl_exec($ch);
        //返回结果
        if($data){
            curl_close($ch);
            return $data;
        }else{
            $error = curl_errno($ch);
            echo "curlww出错,错误码:$error"."<br>";
            echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>";
            curl_close($ch);
            return false;
        }
    }

    public function dangqiangIp()
    {

        $ip = "Unknown";

        if (isset($_SERVER["HTTP_X_REAL_IP"]) && !empty($_SERVER["HTTP_X_REAL_IP"])) {
            $ip = $_SERVER["HTTP_X_REAL_IP"];
        }
        elseif (isset($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]) && !empty($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])) {
            $ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
        }
        elseif (isset($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]) && !empty($HTTP_SERVER_VARS["HTTP_CLIENT_IP"])) {
            $ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
        }
        elseif (isset($HTTP_SERVER_VARS["REMOTE_ADDR"]) && !empty($HTTP_SERVER_VARS["REMOTE_ADDR"])) {
            $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
        }
        elseif (getenv("HTTP_X_FORWARDED_FOR")) {
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        }
        elseif (getenv("HTTP_CLIENT_IP")) {
            $ip = getenv("HTTP_CLIENT_IP");
        }
        elseif (getenv("REMOTE_ADDR")) {
            $ip = getenv("REMOTE_ADDR");
        }
        return $ip;
    }
  }
原文地址:https://www.cnblogs.com/lujiang/p/7280983.html