微信企业支付到零钱

   public function weixinpay(){

        $url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";

        $openid = $this->input->get('openid'); //用户唯一标示

        $amount =$this->input->get('amount'); //付款金额 

        $payment_id = $this->_get_pay_code();//订单号,可以自定义,但不能重复使用

        //根据openid查询用户信息

        $userinfo = $this->answer_m->get_userinfo_by_openid($openid);

        if (empty($userinfo)){

            exit('查询用户信息失败');

        }

        // 创建订单

        $code = $this->_get_pay_code();

        $openid = $userinfo['openid'];

        $user_id = $userinfo['id'];

        $nickname = $userinfo['nickname'];

        $this->answer_m->create_order($user_id,$openid,$code,$amount);

        // 执行支付

        $parameters = array(

            'mch_appid' =>self::MCH_APPID,//绑定支付的APPID

            'mchid' => self::MCHID,//商户号

            'nonce_str' => $this->create_noncestr(32), //生成32位的随机字符串   

            'partner_trade_no' => $payment_id,  //商户订单号,不能重复使用

            'openid' => $openid,//用户的open_id

            'check_name' => 'NO_CHECK',//是否检查姓名

            // 're_user_name' => $transfer['real_name'],  //真实姓名

            'amount' => bcmul($amount,100,0),   //企业付款金额,单位为分  最低1元

            'desc' => '答题奖金',//备注

            'spbill_create_ip' => strval($_SERVER['SERVER_ADDR']),//服务器IP

        );

        $parameters['sign'] = $this->getSign($parameters, self::PAY_KEY);//getSign商户支付密钥

        $xml = $this->arrayToXml($parameters);

        $response = $this->postXmlCurl($xml, $url,true);

        $result = $this->xmlToArray($response);

        if($result['return_code']=='SUCCESS'){

            if($result['result_code']=='SUCCESS'){

                    $this->success($payment_id.'=payment_id  付款成功');

                    $this->answer_m->update_order($code);

                return true;

            }else{

               $data =  $result['err_code_des'].' 付款失败';

                return false;

            }

        }else{

            $data = '付款失败,微信接口出现异常';

            return false;

        }

    }

    

    public function  create_noncestr($length=16){

        $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

        $str = '';

        for ($i = 0; $i < $length; $i++) {

          $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);

        }

        return $str;

    }

    // 生成签名

    public function getSign($obj,$key){

        foreach ($obj as $k => $v) {

            $parameters[$k] = $v;

        }

        ksort($parameters);

        $string = $this->formtBizQueryParMap($parameters,false);

        $string = $string."&key=".$key;

        // var_dump($string);

        $string = md5($string);

        $result =strtoupper($string);

        // var_dump($result);die;

        return $result;

    }

 

    

    public function arrayToXml($arr){

        $xml = "<xml>";

        foreach ($arr as $key => $value) {

            if(is_numeric($value)){

                $xml .= "<" .$key. ">" .$value ."</" .$key .">";

            }else{

                $xml .= "<" .$key. "><![CDATA[".$value."]]></".$key.">"; 

            }

        }

        $xml .="</xml>";

        return $xml;

    }

 

  

    public function postXmlCurl($xml,$url,$userCert= false,$second= 30){

        $ch = curl_init();

        // 设置超时时间

        curl_setopt($ch, CURLOPT_TIMEOUT, $second);

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //严格模式

        curl_setopt($ch, CURLOPT_HEADER, false);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        if($userCert ==true){

            // 设置证书

            curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'pem');

            curl_setopt($ch, CURLOPT_SSLCERT, '');//证书位置相对路径

            curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'pem');

            curl_setopt($ch, CURLOPT_SSLKEY, ''); //证书位置 相对路径

        }

        // 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_error($ch);

            curl_close($ch);

            $this->error("curl出错,错误码".$error,'wxpostXmlCurl');

 

        }

 

    }

 

    //  将xml 转array 

    public function xmlToArray($xml){

        $array_data = json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),TRUE);

        return $array_data;

    }

 

    //  格式化参数,签名使用

    public function  formtBizQueryParMap($paramap,$urlencode){

        $buff = "";

        ksort($paramap);

        foreach ($paramap as $k => $v) {

            if($urlencode){

                $v = $urlencode['$v'];

            }

            $buff .= $k ."=".$v."&";

        }

        $reqpar = '';

        if(strlen($buff) >0){

            $reqpar = substr($buff, 0,strlen($buff)-1);

        }

        return $reqpar;

    }

 

 

    // 创建订单号

    public function _get_pay_code() {

        $years  = array(2016=> 'A', 2017=> 'B', '2018' => 'C', 2019=> 'D');

        $months = array(1   => 'A', 2   => 'B', 3   => 'C', 4   => 'D', 5   => 'E', 6   => 'F', 7   => 'G', 8   => 'H', 9   => 'I', 10   => 'J', 11   => 'K', 12   => 'L');

        $code   = date('YmdHis').rand(0, 1000).rand(1000, 2000);

        return $code;

    }

猜你喜欢

转载自blog.csdn.net/DK_ajie/article/details/81117157