php微信支付代码

<?php

/**

*微信下单

*/

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();

}

//提交订单

$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_];

$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)

{

//这个是在平台自己设置的,一个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;

}

/**

*发送请求的代码

*/

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;

}