微信小程序之微信支付(回調接口)

/**
 * 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章