Hyperf EasyWeChat企业微信客服接入指南

SDK使用:https://www.easywechat.com/5.x/overview.html

Hyperf基本能使用支持Laravel的composer包, 所以即使easy wechat不是hyperf的扩展,但基于composer包安装后也可以正常使用。

接入企业微信客服基本要使用三大功能 1 auth授权(企业微信扫码登录) 2企业微信客服 3素材管理

企业微信官网: https://work.weixin.qq.com/api/doc/90001/90143/91201

注意点:

1 收发消息时SDK要处理 微信的request重写, 但并不是所有接口都需要重写,所以需要使用参数判断是否需要重写

处理这步后才能正常收到企业微信的消息推送。

 if ($replaceRequest) {
            // 微信的request重写
            $get         = request()->getQueryParams();
            $post        = request()->getParsedBody();
            $cookie      = request()->getCookieParams();
            $uploadFiles = request()->getUploadedFiles() ?? [];
            $server      = request()->getServerParams();
            $xml         = request()->getBody()->getContents();
            $headers     = request()->getHeaders();
            $files       = [];
            /** @var \Hyperf\HttpMessage\Upload\UploadedFile $v */
            foreach ($uploadFiles as $k => $v) {
                $files[$k] = $v->toArray();
            }
            $request          = new Request($get, $post, [], $cookie, $files, $server, $xml);
            $request->headers = new HeaderBag($headers);
            $app->rebind('request', $request);
        }

2 auth 扫码登录SDK easy wechat sdk默认是没有的,需要自己单独封装,请求企业微信。

3 hyperf2.x版本 swoole 4.8.x后curl请求默认已经协程化curl, 但hyperf 1.x版本的需要自行处理,封装好的代码如下:

<?php

declare(strict_types=1);

namespace App\Extend\CommonSdk\Curl;


use App\Extend\CommonSdk\Exception\BaseException;
use App\Extend\CommonSdk\Tool\Json;
use GuzzleHttp\Client;
use Hyperf\Guzzle\HandlerStackFactory;

class Curl
{
    /**
     * @var Client
     */
    private $client;


    /**
     * Curl constructor.
     */
    public function __construct()
    {
        $factory = new HandlerStackFactory();
        $stack   = $factory->create();

        $this->client = make(Client::class, [
            'config' => [
                'handler' => $stack,
            ],
        ]);
    }

    /**
     * 检查返回http状态码
     *
     * @param \Psr\Http\Message\ResponseInterface $response
     */
    private function adjustResponse($response)
    {
        if (200 !== $response->getStatusCode()) {
            throw new BaseException("请求失败,详情:" . $response->getReasonPhrase());
        }
    }

    /**
     * 发送get请求
     *
     * @param string $url
     * @param array  $params
     *
     * @return string
     */
    public function get(string $url, array $params=[])
    {
        $client = $this->client;

        $response = $client->get($url, ['query' => $params]);

        $this->adjustResponse($response);

        return $response->getBody()->getContents();
    }

    /**
     * 发送Post请求
     *
     * @param string $url
     * @param array  $body
     * @param array  $headers
     *
     * @return string
     */
    public function post(
        string $url,
        array $body,
        array $headers = ['Content-Type' => 'application/json;charset=utf-8',]
    ) {
        $response = $this->client->post($url, [
            'body'    => Json::encode($body),
            'headers' => $headers,
        ]);

        $this->adjustResponse($response);

        return $response->getBody()->getContents();
    }

}

4 企业微信API会话流程图是有问题的!!!

默认会话使用智能助手状态, 才能走api发出消息,并且,需要用户先发送消息后,客服才能发送5条消息。

首回语需要使用企业微信的event来标记处理。

这篇文章需要在读者在通读了一次企业微信api熟悉工作流后在次阅读才能有进一步帮助。

有需要可评论留言~,能帮助到你的我会回复。