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

/**
 * 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;
}

猜你喜欢

转载自blog.csdn.net/zyj_15067066062/article/details/106209312