<?php
/**
*微信下单
*/
function wxorders(){
*微信下单
*/
function wxorders(){
ini_set("display_errors", "On");
error_reporting(E_ALL | E_STRICT);
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();
}
//提交订单
$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();
// }
//这里是返回给前端的参数,也是这篇代码的最后一句,返回之后,前端就可以调用微信支付弹出框了
echo json_encode($r);exit();
}
$km = $kilometre/1000;//米数转化成公里
if(empty($_POST['session_key'])){
$msg['status'] = 'error';
$msg['msg'] = 'session_key 不能为空';
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();
// }
//这里是返回给前端的参数,也是这篇代码的最后一句,返回之后,前端就可以调用微信支付弹出框了
echo json_encode($r);exit();
}
/**
*微信下单
*@param total_price 下单金额 单位为/元
*@return 这一步返回prepay_id
*@param $id为新订单的id
*/
function wxpay($total_price,$openid,$id){
//拼接商品订单号
$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',//这个是商户id,是在商户平台绑定银行卡后的id,给谁付钱就是谁的商户id
'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 );
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'];
//二次签名所需的随机字符串
$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;
// $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;
}
//返回错误信息
$output = array('data'=>false ,'info'=>"error" ,'code'=>"100" ,'order_number'=>false);
echo json_encode($output);exit();
}
// return $response;
}
/**
*生成签名算法
*/
function getSign($array)
{
//这个是在平台自己设置的,一个32位的字符串,应该是秘钥(私钥)什么的
$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;
}
$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;
}