/**
* description:
* 微信支付完成,回调地址url方法
*/
public function PaymentCallback(){
$sKey = PAY_KEY;//你申请微信支付的KEY
$arrPostData = $this->input->post(); //接受POST数据
$arrXmlData = $this->xml_to_array($arrPostData); //微信支付成功,返回回调地址url的数据:XML转数组Array
$sPostSign = $arrXmlData['sign'];
unset($arrXmlData['sign']); //这里很重要哦,一定要将返回的sign剔除掉
/* 微信官方提醒:
* 商户系统对于支付结果通知的内容一定要做【签名验证】,
* 并校验返回的【订单金额是否与商户侧的订单金额】一致,
* 防止数据泄漏导致出现“假通知”,造成资金损失。
*/
ksort($arrXmlData);// 对数据进行排序
//正常情况微信是不会返回支付的key的,为保万一我们判断一下 --xzz 0622
if($arrXmlData['key']){
$sData = $this->ToUrlParams($arrXmlData);//对数组数据拼接成key=value字符串
}else{
$sData = $this->ToUrlParams($arrXmlData).'&key='.$sKey; //这里也一定要加上key,不然签名就错了
}
$sUserSign = strtoupper(md5($sData)); //再次生成签名,与$sPostSign比较
$where['crsNo'] = $arrXmlData['out_trade_no'];
$arrWechatOrder = $this->wxpay->GetWechatOreder($where);
/*
* 分别判断返回状态码、返回签名sign、返回订单总金额,三者同时为真,订单交易成功,状态修改为‘ok’
*/
if($arrXmlData['return_code']=='SUCCESS'&&$sPostSign==$sUserSign&&$arrWechatOrder['order_amount']*100==$arrXmlData['total_fee']){
/*
* 首先判断,订单是否已经更新为ok,因为微信会总共发送8次回调确认
* 其次,订单已经为ok的,直接返回SUCCESS
* 最后,订单没有为ok的,更新状态为ok,返回SUCCESS
*/
if($arrWechatOrder['order_status']=='ok'){
$this->return_success();
}else{
$updata['order_status'] = 'ok';
if($this->wxpay->UpdateWechatOrder($updata,$where)){
$this->return_success();
}
}
}else{
$arrHint = array('nStatus'=>1,'sMsg'=>'微信支付失败');
return $this->output->set_content_type('application/json')->set_output(json_encode($arrHint));
}
}
/**
* description:
* 数组转换成xml
*/
private function xml_to_array($xml){
if(!$xml){
return false;
}
//将XML转为array
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $data;
}
/**
* description:
* 给微信发送确认订单金额和签名正确,SUCCESS信息 -xzz0521
*/
private function return_success(){
$return['return_code'] = 'SUCCESS';
$return['return_msg'] = 'OK';
$xml_post = '<xml>
<return_code>'.$return['return_code'].'</return_code>
<return_msg>'.$return['return_msg'].'</return_msg>
</xml>';
echo $xml_post;exit;
}