版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhongyuchuan147/article/details/67633997
//配置调起支付前的配置参数
public $config=array(
'appid'=>'',// 开放平台appid
'mch_id'=>'',//商户id
'device_info'=>'web',
'api_key'=>'',//商户密匙
'nonce_str'=>'设置的随机字符串',//随机字符串
'sign_type'=>'MD5',
'body'=>'app支付订单',
'out_trade_no'=>'',//订单号
'total_fee'=>'',//总金额
'spbill_create_ip'=>'',//用户端ip
'notify_url'=>'',//回调地址
'trade_type'=>'APP'
);
public function pay(){
//填写基本信息
//获取当前服务器ip
function get_client_ip()
{
if ($_SERVER['REMOTE_ADDR']) {
$cip = $_SERVER['REMOTE_ADDR'];
} elseif (getenv("REMOTE_ADDR")) {
$cip = getenv("REMOTE_ADDR");
} elseif (getenv("HTTP_CLIENT_IP")) {
$cip = getenv("HTTP_CLIENT_IP");
} else {
$cip = "unknown";
}
return $cip;
}
$host = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST']:'');
$out_trade_no=$_POST['osn'];//订单号
$total_fee = $_POST['total_fee'];//价格
//调试
// $out_trade_no=$_GET['osn'];//订单号
// $total_fee = $_GET['total_fee'];//价格
//获取指定长度的随机字符串
function getRandChar($length){
$str = null;
$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
$max = strlen($strPol)-1;
for($i=0;$i<$length;$i++){
$str.=$strPol[rand(0,$max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
}
return $str;
}
// echo getRandChar(32);exit;
$data['appid']=$this->config['appid'];
$data['mch_id']=$this->config['mch_id'];
$data['device_info']=$this->config['device_info'];
$data['nonce_str']=getRandChar(32); //随机字符串
// $data['nonce_str']=$this->config['nonce_str']; //随机字符串测试
$data['body']=$this->config['body'];
$data['out_trade_no']=$out_trade_no;
$data['total_fee']=$total_fee*100;
$data['spbill_create_ip ']=$_SERVER['REMOTE_ADDR'];//用户ip
$data['trade_type']='APP';
$data['notify_url']=$this->config['notify_url'];
if($out_trade_no=='' or $total_fee==''){
$sever=array();
$sever['code']='4001';
$sever['message']='无参数或参数错误';
$sever['info']='';
echo json_encode($sever);
exit;
}
//生成第一次签名数组字典排序
ksort($data);
// echo $data;
//字符串拼接
foreach ($data as $key => $value) {
$stringA.=$key.'='.$value.'&';
}
//第二次拼接得到签名
$stringSignTemp=$stringA."key=".$this->config['api_key'];
// echo $stringSignTemp;
$stringSignTemp=preg_replace('# #','',$stringSignTemp);
// echo $stringSignTemp;
$data['sign']=strtoupper(MD5($stringSignTemp));//
// echo $data['sign'];
// var_dump($data);exit;
//数组转xml
$xml='<xml>';
foreach ($data as $key => $value) {
$xml=$xml.'<'.$key.'><![CDATA['.$value.']]></'.$key.'>';
}
$xml=$xml.'</xml>';
// echo $xml;
// exit;
// echo json_encode($data);
//准备要发送的请求
$payurl = "https://api.mch.weixin.qq.com/pay/unifiedorder"; //微信统一下单接口地址
//发送xml的方法
function postXmlCurl($xml, $url, $useCert = false, $second = 30){
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);
//设置header
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
if($useCert == true){
//设置证书
//使用证书:cert 与 key 分别属于两个.pem文件
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
//curl_setopt($ch,CURLOPT_SSLCERT, WxPayConfig::SSLCERT_PATH);
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
//curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::SSLKEY_PATH);
}
//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_errno($ch);
curl_close($ch);
return false;
}
}
$Wxinxml= postXmlCurl($xml,$payurl);
$parser = xml_parser_create(); //创建解析器
xml_parse_into_struct($parser, $Wxinxml, $values, $index);
//解析到数组
xml_parser_free($parser); //释放资源 //显示数组结构
// print_r($values);
// var_dump($values);exit;
$Arlist=array();
for($i=0;$i<count($values);$i++){
if($values[$i]['tag']!='XML'){
$Arlist[$values[$i]['tag']]=$values[$i]['value'];
}
}
if($Arlist['RETURN_CODE']!='SUCCESS'){
$sever=array();
$sever['code']='4005';
$sever['message']='订单生成失败';
$sever['info']='';
echo json_encode($sever);
exit;
}
// var_dump($Arlist);exit;
//时间戳
$time=time();
$warr=array(
'appid'=>$Arlist['APPID'],
'partnerid'=>$Arlist['MCH_ID'],
// 'device_info'=>$Arlist['DEVICE_INFO'],
'noncestr'=>$Arlist['NONCE_STR'],
'prepayid'=>$Arlist['PREPAY_ID'],
'package'=>"Sign=WXPay",
// 'trade_type'=>$Arlist['TRADE_TYPE'],
);
$warr['timestamp']=$time;
//二次签名
ksort($warr);
$stringA='';
foreach ($warr as $key => $value) {
$stringA.=$key.'='.$value.'&';
}
$stringSignTemp=$stringA."key=".$this->config['api_key'];
$stringSignTemp=preg_replace('# #','',$stringSignTemp);
// echo $stringSignTemp;
$warr['sign']=strtoupper(MD5($stringSignTemp));
$sever=array();
$sever['code']='200';
$sever['message']='统一下单';
$sever['info']=$warr;
echo json_encode($sever);
exit;
}