class
Wxpay {
private
$config = array(
'appid'
=> "wxc888888888",
'mch_id'
=> "88888888",
'api_key'
=> "5d82747060a5873e0d3de256b8485094",
'notify_url'
=> 'http://www.xxxxx.com/app/index.php/Api/modifyPayState'
);
public
function getPrePayOrder($body,
$out_trade_no,
$total_fee){
$url
= "https://api.mch.weixin.qq.com/pay/unifiedorder";
$notify_url
= $this->config["notify_url"];
$onoce_str
= $this->createNoncestr();
$data["appid"] =
$this->config["appid"];
$data["body"] =
$body;
$data["mch_id"] =
$this->config['mch_id'];
$data["nonce_str"] =
$onoce_str;
$data["notify_url"] =
$notify_url;
$data["out_trade_no"] =
$out_trade_no;
$data["spbill_create_ip"] =
$this->get_client_ip();
$data["total_fee"] =
$total_fee;
$data["trade_type"] =
"APP";
$sign
= $this->getSign($data);
$data["sign"] =
$sign;
$xml
= $this->arrayToXml($data);
$response
= $this->postXmlCurl($xml,
$url);
$response
= $this->xmlToArray($response);
return
$respone;
}
public
function getSign($Obj){
foreach
($Obj
as $k =>
$v){
$Parameters[$k] =
$v;
}
ksort($Parameters);
$String
= $this->formatBizQueryParaMap($Parameters, false);
$String
= $String."&key=".$this->config['api_key'];
$String
= md5($String);
$result_
= strtoupper($String);
return
$result_;
}
public
function createNoncestr(
$length = 32 ){
$chars
= "abcdefghijklmnopqrstuvwxyz0123456789";
$str
="";
for
( $i
= 0; $i <
$length; $i++ ) {
$str.=
substr($chars, mt_rand(0,
strlen($chars)-1), 1);
}
return
$str;
}
public
function arrayToXml($arr){
$xml
= "<xml>";
foreach
($arr
as $key=>$val){
if
(is_numeric($val)){
$xml.="<".$key.">".$val."</".$key.">";
}else{
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
}
$xml.="</xml>";
return
$xml;
}
public
function xmlToArray($xml){
$array_data
= json_decode(json_encode(simplexml_load_string($xml,
'SimpleXMLElement', LIBXML_NOCDATA)), true);
return
$array_data;
}
public
function postXmlCurl($xml,$url,$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,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS,
$xml);
$data
= curl_exec($ch);
if($data){
curl_close($ch);
return
$data;
}else{
$error
= curl_errno($ch);
echo
"curl出错,错误码:$error"."<br>";
curl_close($ch);
return
false;
}
}
public
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;
}
public
function formatBizQueryParaMap($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;
}