easyWechat 处理ticket以及事件推送

现在的小程序电商系统一般都会用到第三方开放平台,因为这样可以方便管理小程序,还有一个品牌的标志

当然第三方平台需要开发的代码量也是可观的,这里我个人推荐使用PHP的微信开发SDK EasyWeChat,这个SDK虽然文档写的不完整,但是它的功能基本覆盖了所有微信开发的供能

其中,我用搭建第三方平台的时候遇到的两个处理ticket的url问题

官方文档会有两个接收事件的地址

1 授权事件接收URL

用于接收取消授权通知、授权成功通知、授权更新通知,也用于接收ticket,ticket是验证平台方的重要凭据。

2 消息与事件接收URL

通过该URL接收公众号或小程序消息和事件推送,该参数按规则填写(需包含/$APPID$,如www.abc.com/$APPID$/callback),实际接收消息时$APPID$将被替换为公众号或小程序AppId。

使用easywechat的时候这两个地址可以调用同一个消息处理事件,然后分别做返回success的处理,当然也可以把两个接收事件地址写成一样,统一处理。

授权通知的代码如下

/**
 * 授权接收
 * @return string
 */
public function ticket()
{
    (new TicketEvent())->event(); //统一处理的事件

    return 'success';
}

消息推送的代码如下

/**
 * 事件推送
 *
 * @return void
 */
public function ticket()
{
    (new TicketEvent())->event(); //统一处理的事件

    return 'success';
}

咋一看其实是一样的

以下是统一处理事件的类

class TicketEvent
{
    public function event()
    {
        $server = OpenApp::getApp()->server;

        $message = $server->getMessage();

        ///授权成功事件
        if (isset($message['InfoType'])&&$message['InfoType'] == 'authorized') {
            // TODO
        }
        //授权更新事件
        if (isset($message['InfoType'])&&$message['InfoType'] == 'updateauthorized') {
            // TODO
        }
        //授权取消事件
        if (isset($message['InfoType'])&&$message['InfoType'] == 'unauthorized') {
            (new AuthLogic())->authEvent($message);
        }
        //快速注册小程序事件
        if(isset($message['InfoType'])&&$message['InfoType'] == 'notify_third_fasteregister'){
            (new ComponentLogic())->registerNoteEvent($message);
        }
        //代码审核推送
        if (isset($message['MsgType'])&&$message['MsgType'] == 'event') {
            $appid = ltrim(request()->param('appid'), '/');
            //审核通过
            if (isset($message['Event'])&&$message['Event'] == 'weapp_audit_success') {
                (new CodeLogic())->codeEvent($appid);
            }
            //审核不通过
            if (isset($message['Event'])&&$message['Event'] == 'weapp_audit_fail') {
                $reason = $message['Reason'] ? $message['Reason'] : '未知原因';
                (new CodeLogic())->codeEvent($appid, $reason);
            }
        }
        // 其他事件另行开发,目前就只有这几个
        return $server->serve();
    }
}

OpenApp::getApp() 是我写的一个获取对象的单例,获取配置的暂时还没有用到

Class OpenApp
{
    protected static $_instance;

    private function __construct()
    {

    }

    public static function getApp($agent_id = false, $open_app_id = false)
    {
        if (is_null(self::$_instance)) {
            $config = self::getConfig($agent_id, $open_app_id);
            self::$_instance = Factory::openPlatform($config);
        }

        return self::$_instance;
    }

    protected static function getConfig($agent_id = false, $open_app_id = false)
    {
        $where = [];
        if ($agent_id) {
            $where['agent_id'] = $agent_id;
        }
        if ($open_app_id) {
            $where['open_app_id'] = $open_app_id;
        }
        $agent = (new Agent())->where($where)->find();
        $defaultConfig = [
            'app_id'   => 'appid',
            'secret'   => 'secret',
            'token'    => 'token',
            'aes_key'  => 'aes_key'
        ];
        if (!$agent) {
            $config = $defaultConfig;
        } else {
            if ($agent['is_open'] == 1) {
                $config = [
                    'app_id'   => $agent['open_app_id'],
                    'secret'   => $agent['open_secret'],
                    'token'    => $agent['open_token'],
                    'aes_key'  => $agent['open_aes_key']
                ];
            } else {
                $config = $defaultConfig;
            }
        }

        return $config;
    }
}

类似文章