zoukankan      html  css  js  c++  java
  • 微信企业付款

    <?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;
        }
      }
  • 相关阅读:
    网页背景音乐
    CSS 实现背景半透明
    实战中总结出来的CSS常见问题及解决办法
    AsyncTask的简单使用
    ORMLiteDatabase的简单使用并且与其他的表相互联系
    传递消息--第三方开源--EventBus的简单使用
    通过messenger实现activity与service的相互通信
    通过Messenger与后台连接(单向操作,activity向service发送数据)
    怎么做QQ、微信等消息气泡
    通过bind实现activity与service的交互
  • 原文地址:https://www.cnblogs.com/lujiang/p/7280983.html
Copyright © 2011-2022 走看看