微信支付

<?php

namespace app\admin\controller;
 
use app\admin\controller\publicController;
date_default_timezone_set('PRC');

class userController extends publicController {
    
 
	function __construct() {
		parent::__construct();
	}




	/**
	*微信下单
	*/
	function wxorders(){

        ini_set("display_errors", "On");
        error_reporting(E_ALL | E_STRICT);

		$kilometre = $_POST['kilometre'];
		$km = $kilometre/1000;//米数转化成公里
        if(empty($_POST['session_key'])){
            $msg['status'] = 'error';
            $msg['msg'] = 'session_key 不能为空';
            echo json_encode($msg);exit();
        }
        if(empty($_POST['cost'])){
            $msg['status'] = 'error';
            $msg['msg'] = '总价钱不能为空';
            echo json_encode($msg);exit();
        }
        if(empty($_POST['startLoca'])){
            $msg['status'] = 'error';
            $msg['msg'] = '出发地址不能为空';
            echo json_encode($msg);exit();
        }
        if(empty($_POST['destLoca'])){
            $msg['status'] = 'error';
            $msg['msg'] = '目的地不能为空';
            echo json_encode($msg);exit();
        }
        if(empty($_POST['startTime'])){
            $msg['status'] = 'error';
            $msg['msg'] = 'startTime不能为空';
            echo json_encode($msg);exit();
        }
        if(empty($_POST['endTime'])){
            $msg['status'] = 'error';
            $msg['msg'] = 'endTime不能为空';
            echo json_encode($msg);exit(); 
        }
		//提交订单
		$data = array(
			'start_address'=>$_POST['startLoca'],//出发地址
			'end_address'=>$_POST['destLoca'],//目的地
			'start_time'=>strtotime(str_replace('.','-',$_POST['startTime'])),//开始时间
			'end_time'=>strtotime(str_replace('.','-',$_POST['endTime'])),//结束时间
			'km'=>$km,//公里数
			'seat'=>$_POST['seat'],//座位
			'borad_price'=>$_POST['basicPrice'],//上车价
			'per_km'=>$_POST['perKiloPrice'],//每公里单价
			'total_price'=>$_POST['cost'],//总价钱
			'contact'=>$_POST['name'],//联系人名
			'mobile'=>$_POST['phone'],//联系电话
			'status'=>'1',//状态
			'create_time'=>time(),//提交时间
			'type'=>$_POST['type'],//租车类型  小bus 大巴等
			'kelala'=>$_POST['session_key'],//标识符
			);
		$total_price = $_POST['cost'];//总价赋值
        //插入订单记录,此处状态为待付款
		$id = $this->baseModel->add('orders',$data);

        //根据标识符查询当前账号的openid
        $kelala = $_POST['session_key'];//用户的唯一标识
        $user = $this->baseModel->getRow('user','*',array('kelala'=>$kelala));
        if(empty($user)){
            $msg['status'] = 'error';
            $msg['msg'] = '用户信息不能为空';
            echo json_encode($msg);exit();
        }
        if(empty($user['openid'])){
            $msg['status'] = 'error';
            $msg['msg'] = 'openid不能为空';
            echo json_encode($msg);exit();
        }
	    //调用下单接口  $res为新订单的id
		$r = $this->wxpay($total_price,$user['openid'],$id);
        // if(empty($r['prepay_id'])){
        //     $msg['status'] = 'error';
        //     $msg['msg'] = '微信调起失败';
        //     $msg['data'] = $r;
        //     echo json_encode($msg);exit();
        // }
        // //分别传总金额,用户openid,前面生成的订单id
        // $a = $this->wxapi($total_price,$user['openid'],$r['prepay_id'],$res);
        // echo $a;exit();
        echo json_encode($r);exit();
	}


	/**
	*微信下单
	*@param total_price 下单金额 单位为/元 
    *@return 这一步返回prepay_id
    *@param $id为新订单的id
	*/
	function wxpay($total_price,$openid,$id){
        if(empty($total_price)){
            $msg['status'] = 'error';
            $msg['msg'] = '总价钱不能为空';
            echo json_encode($msg);exit();
        }
        if(empty($openid)){
            $msg['status'] = 'error';
            $msg['msg'] = 'openid不能为空';
            echo json_encode($msg);exit();
        }
		//拼接商品订单号
		$body = '测试商品';
		$out_trade_no = date("YmdHis") . rand(100, 999);
        // //更新微信返回的订单号
        $this->baseModel->updateById('orders',array('out_trade_no'=>$out_trade_no),$id);
		  $order = [
            'appid'=>'',
            'mch_id'=>'1499532322',
            'openid'=>$openid,
            'nonce_str'=>$this->rand2(10),
            'body'=>'测试商品',
            'out_trade_no'=>$out_trade_no,//商户唯一订单号,可包含字母序
            'total_fee'=>(string)$total_price*100,//订单金额,单位/分所以乘以100
            'spbill_create_ip'=>$_SERVER['REMOTE_ADDR'],
            //产生订单号的服务器IP
            'notify_url'=>'https://www.kelalazuche.com/notice',//接受微信异步通知地址
            'trade_type'=>'JSAPI',//交易类型
        ];
        //MD5处理,默认支持MD5
        // $sign = md5($sign);
        $order['sign'] = $this->getSign($order);
        //转换成一维XML格式
        $xml = '<xml>';
        foreach($order as $k=>$v){
            $xml.='<'.$k.'><![CDATA['.$v.']]></'.$k.'>';
        }
        $xml.='</xml>';
        $KEY = '12ed7bd47d66f4ef7865f79b2194a94b';//加密的字符串
        //CURL会话
        $ch = curl_init();
        // 设置curl允许执行的最长秒数
        curl_setopt($ch, CURLOPT_TIMEOUT, 3);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
        // 获取的信息以文件流的形式返回,而不是直接输出。
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        //发送一个常规的POST请求。
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_URL, 'https://api.mch.weixin.qq.com/pay/unifiedorder');
        //要传送的所有数据
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
        // 执行操作
        $response = curl_exec($ch);
        //将xml格式的$response 转成数组
        $response = json_decode( json_encode( simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA) ), true );
        // var_dump($response);die();
        if($response['return_code'] == "SUCCESS" && $response['result_code'] == "SUCCESS"){


            //根据微信支付返回的结果进行二次签名
            //二次签名所需的随机字符串
            $order["nonceStr"] = $this->rand2(10);//随机字符串
            //二次签名所需的时间戳
            $order['timeStamp'] = time()."";
            //二次签名剩余参数的补充
            $secondSignArray = array(
                    "appId"=>$order['appid'],
                    "nonceStr"=>$order['nonceStr'],
                    //"package"=>"Sign=WXPay",
                    "package"=>"prepay_id=".$response['prepay_id'],
                    "signType"=>"MD5",
                    "timeStamp"=>$order['timeStamp'],
            );
            $data = $secondSignArray;
            $recharge_num = $order["out_trade_no"];
            $data['paySign'] =  $this->makeSign($secondSignArray,$KEY);
            $data['prepay_id'] = $response['prepay_id'];

            $data['out_trade_no'] = $out_trade_no;
            
            // $output = array('data'=>$data ,'info'=>"success" ,'code'=>"200" ,'order_number'=>$recharge_num);
            // return($output);
            return $data;

        }else{
            //返回错误信息
            $output = array('data'=>false ,'info'=>"error" ,'code'=>"100" ,'order_number'=>false);
            echo json_encode($output);exit();
        }
        // return $response;
	}


	/**
	*生成签名算法
	*/
	function getSign($array)
	{
	    $pay_key = "12ed7bd47d66f4ef7865f79b2194a94b";
	    unset($array['sign']);
	    ksort($array);
	    $stringA = urldecode(http_build_query($array));
	    $stringSignTemp="$stringA&key=".$pay_key;
	    return strtoupper(md5($stringSignTemp));
	}


	/**
	*生成不重复的字符串
	*@param $len 字符串长度
	*@return 随机字符串
	*/
	function rand2($len)
	   {
	      $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
	      $string=time();
	      for(;$len>=1;$len--)
	      {
	          $position=rand()%strlen($chars);
	          $position2=rand()%strlen($string);
	          $string=substr_replace($string,substr($chars,$position,1),$position2,0);
	     }
	     return $string;
	}


    /**
     * 生成签名, $KEY就是支付key
     * @return 签名
     */
    function MakeSign( $params,$KEY){
        //签名步骤一:按字典序排序数组参数
        ksort($params);
        $string = $this->ToUrlParams($params);  //参数进行拼接key=value&k=v
        //签名步骤二:在string后加入KEY
        $string = $string . "&key=".$KEY;
        //签名步骤三:MD5加密
        $string = md5($string);
        //签名步骤四:所有字符转为大写
        $result = strtoupper($string);
        return $result;
    }


     function ToUrlParams( $params ){
        $string = '';
        if( !empty($params) ){
            $array = array();
            foreach( $params as $key => $value ){
                $array[] = $key.'='.$value;
            }
            $string = implode("&",$array);
        }
        return $string;
    }

     function xml2array($xml){
        $p = xml_parser_create();
        xml_parse_into_struct($p, $xml, $vals, $index);
        xml_parser_free($p);
        $data = "";
        foreach ($index as $key=>$value) {
            if($key == 'xml' || $key == 'XML') continue;
            $tag = $vals[$value[0]]['tag'];
            $value = $vals[$value[0]]['value'];
            $data[$tag] = $value;
        }
        return $data;
    }

    function http_request($url,$data = null,$headers=array())
    {
        $curl = curl_init();
        if( count($headers) >= 1 ){
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        }
        curl_setopt($curl, CURLOPT_URL, $url);
    
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    
        if (!empty($data)){
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }

}



回调

<?php 

/**
	*支付通知
	*/
	function notice(){ 
		ini_set("display_errors", "On");
		error_reporting(E_ALL | E_STRICT);
		$data['kelala'] = $_POST['session_key'];//用户唯一标识
		if(empty($data['kelala'])){
			$msg['status'] = 'error';
			$msg['msg'] = 'session_key不能为空';
			echo json_encode($msg);exit();
		}
		$state = $_POST['state'];//支付状态,1是成功2是失败
		if(empty($state)){
			$msg['status'] = 'error';
			$msg['msg'] = '支付状态不能为空';
			echo json_encode($msg);exit();
		}
		$out_trade_no = (int)$_POST['out_trade_no'];
		if(empty($out_trade_no)){
			$msg['status'] = 'error';
			$msg['msg'] = '订单号out_trade_no不能为空';
			echo json_encode($msg);exit();
		}
		if($state==1){
			$data['status'] = 2;//成功
			//发送一条提醒短信
	        $arr = array(
	            'api_user'=>'kelala',
	            'api_pwd'=>'kelalazuche',
	            'sign'=>'客拉拉',
	            'content'=>'来新订单啦,请尽快登录管理平台分配订单。',
	            'mobiles'=>'15026645078'
	        );
	        $url = 'http://www.emailcar.net/v2/sms_send';
	        $this->send_emailcar($arr,$url);

	        $arr = array(
	            'api_user'=>'kelala',
	            'api_pwd'=>'kelalazuche',
	            'sign'=>'客拉拉',
	            'content'=>'来新订单啦,请尽快登录管理平台分配订单。',
	            'mobiles'=>'15201756612'
	        );
	        $url = 'http://www.emailcar.net/v2/sms_send';
	        $this->send_emailcar($arr,$url);

		}else{
			$data['status'] = 3;//失败
		}
		$data['out_trade_no'] = $out_trade_no;//唯一订单号
		$where = 'out_trade_no ='.$data['out_trade_no'].' and kelala ='."'".$data['kelala']."'";
		$res = $this->baseModel->update('orders',$data,$where);
		if($res==true){
			$msg['status'] = 'success';
			$msg['msg'] = '成功';
			echo json_encode($msg);exit();
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值