ThinkPHP5异步通知SDK详解

来源:互联网 发布:淘宝店铺购买平台 编辑:程序博客网 时间:2024/06/05 15:06

最近写了一个ThinkPHP5的微信支付SDK,  感觉微信官方SDK有很多值得学习的地方, 其中异步通知算是写的比较巧妙的, 下面就做一下分析:

首先看一下我写的SDK的使用方法: 

$notify = new \wxpay\Notify();$notify->Handle();


由此, 我们需要去看一下 extend\wxpay\Notify.php, 我们看到

class Notify extends \WxPayNotify{    public function NotifyProcess($data, &$msg)    {        // 1.校检参数        ...        // 2.微信服务器查询订单,判断订单真实性(可不需要)        ...        // 3.去本地服务器检查订单状态(强烈建议需要)        ...        // 4.检查订单状态        ...    }}

这里我们继承了 WxPayNotify类 并写了一个主函数 NotifyProcess,  主函数中调用了很多方法, 对数据校检, 对订单处理等

那么, 我们回头看, notify->Hanle() 到底做了什么, 我们为什么要写 NotifyProcess() 方法??

打开 extend\wxpay\lib\WxPayNotify.php, 我们看到Handle方法

final public function Handle($needSign = false){    $msg = "OK";    //当返回false的时候,表示notify中调用NotifyCallBack回调失败获取签名校验失败,此时直接回复失败    $result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);    if($result == false){        $this->SetReturn_code("FAIL");        $this->SetReturn_msg($msg);        $this->ReplyNotify(false);        return;    } else {        //该分支在成功回调到NotifyCallBack方法,处理完成之后流程        $this->SetReturn_code("SUCCESS");        $this->SetReturn_msg("OK");    }    $this->ReplyNotify($needSign);}

由此我们看到, 其主要是调用了 WxpayApi::notify() 并传递了回调函数, 如果返回结果是false, 则回复微信服务器失败, 如果是true, 则回复成功;


我们进入WxpayApi::notify() 看一下

public static function notify($callback, &$msg){    try {        //获取通知的数据        $xml = $GLOBALS['HTTP_RAW_POST_DATA'];        // 1.数据签名校检        // 2.转化为数组        $result = WxPayResults::Init($xml);     } catch (WxPayException $e){        $msg = $e->errorMessage();        return false;    }    return call_user_func($callback, $result);}
我们看到这段代码, 主要是获取了通知的数据, 并通过WxPayResults::Init()方法对数据进行了校检和转化为数组, 如果通过, 则将数据传递给回调函数

因此, 我们需要到回调函数 WxPayNotify类NotifyCallBack()方法看一下

final public function NotifyCallBack($data){    $msg = "OK";    $result = $this->NotifyProcess($data, $msg);    if($result == true){        $this->SetReturn_code("SUCCESS");        $this->SetReturn_msg("OK");    } else {        $this->SetReturn_code("FAIL");        $this->SetReturn_msg($msg);    }    return $result;}
我们看到, 其主要是调用了NotifyProcess()方法, 由此我们明白, 原来一切都在这个NotifyProcess()方法里, 所以我们才要继承WxPayNotify类,并重写了NotifyProcess()


呃...说到这里大家应该都明白了, 不知道是不是分析的到位, 如有问题请留言!