博主信息
博文 91
粉丝 2
评论 4
访问量 146834
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
微信支付回调
夏日的烈风的博客
原创
1131人浏览过

<?php


namespace wxpay;


//use think\Loader;


//require_once 'lib/WxPayException.php';

//Loader::import('wxpay.lib.WxPayApi');

//Loader::import('wxpay.lib.WxPayNotify');

require '../extend/wxpay/lib/WxPayException.php';

require '../extend/wxpay/lib/WxPayApi.php';

require '../extend/wxpay/lib/WxPayNotify.php';


//require '../extend/wxpay/lib/log.php';

//

////初始化日志

//$logHandler= new CLogFileHandler("../public/uploads/wx_logs/".date('Y-m-d').'.log');

//$log = Log::Init($logHandler, 15);


/**

 * 异步通知处理类

*/

class Notify extends \WxPayNotify

{


    /**

     * 此为主函数, 即处理自己业务的函数, 重写后, 框架会自动调用

     *

     * @param array $data 微信传递过来的参数数组

     * @param string $msg 错误信息, 用于记录日志

     */

    public function NotifyProcess($data, &$msg)

    {

        // 一下均为实例代码

        // 1.校检参数

        if(!array_key_exists("transaction_id", $data)){

            $msg = "输入参数不正确";

            return false;

        }


        // 2.微信服务器查询订单,判断订单真实性(可不需要)

        if(!$this->Queryorder($data["transaction_id"])){

            $msg = "订单查询失败";

            return false;

        }


        // 3.去本地服务器检查订单状态(强烈建议需要)

        $order = $this->getOrder($data);

        if(empty($order)) {

            $msg = '本地订单不存在';

            return false;

        }


        // 4.检查订单状态

        if($this->checkOrderStatus($order)) {

            // 如果订单处理过, 则直接返回true

            return true;

        }


        // 订单状态未修改情况下, 进行处理业务

        $result = $this->processOrder($order, $data);

        if(!$result) {

            $msg = '订单处理失败';

            return false;

        }


        return true;

    }


    /**

     * 处理核心业务

     * @param  array $order 订单信息

     * @param  array $data  通知数组

     * @return Bollean

     */

    public function processOrder($order, $data)

    {

        // 进行核心业务处理, 如更新状态, 发送通知等等

        // 处理成功, 返回true, 处理失败, 返回false

        // 例如:

        //$result = db('order')->where('id', $order['id'])->update(['status'=>1, 'transaction_id'=>$data['transaction_id']]);

        return $result;

    }



    // 去微信服务器查询是否有此订单

    public function Queryorder($transaction_id)

    {

        $input = new \WxPayOrderQuery();

        $input->SetTransaction_id($transaction_id);

        $result = \WxPayApi::orderQuery($input);

        if(array_key_exists("return_code", $result)

            && array_key_exists("result_code", $result)

            && $result["return_code"] == "SUCCESS"

            && $result["result_code"] == "SUCCESS")

        {

            return true;

        }

        return false;

    }


    // 去本地服务器查询订单信息

    public function getOrder($data)

    {

        // 可根据商户订单号进行查询

        // 例如:

        $order = db('order')->where('number', $data['out_trade_no'])->find();

        return $order;

    }


    /**

     * 检查order状态, 是否已经做过修改, 避免重复修改

     * 原因: 可能由于业务处理较慢, 还未等回复微信服务器, 同一订单的另一个通知已到达,

     *      为了避免重复修改订单, 需要对状态进行检查

     *

     * @return Bollean

     */

    public function checkOrderStatus($order)

    {

        // 检查还未修改, 则返回true, 检查已经修改过了, 则返回false

        // 例如:

        return $order['status'] == 1 ? true : false;

    }


}


本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学