webman中使用easywechat6需要注意的问题

彭彭
Webman是基于Workerman开发的高性能HTTP服务框架,具有高稳定性、超高性能、高复用性、高扩展性等特点。它支持自定义进程,并复用Composer生态中的组件和类库,使得开发变得更加简单和高效。而EasyWeChat是一个开源的、简洁而强大的微信非官方SDK,从 6.x 起 SDK 中不再内置具体业务的接口,仅封装底层基础部分,如认证、授权和 API 客户端。在Webman中使用EasyWeChat可以帮助开发者快速接入微信功能,如公众号、小程序等。然而,在这个过程中,有一些需要注意的问题,以确保项目的顺利进行。以下是在Webman中使用EasyWeChat时需要注意的一些问题:
  • EasyWeChat环境需求:EasyWeChat要求PHP版本不低于8.0,并需要安装cURL、OpenSSL、SimpleXML和fileinfo等扩展。这确保了EasyWeChat在Webman环境中的兼容性和功能性。

  • 初始化EasyWeChat:使用EasyWeChat时,通过传入配置信息来初始化一个模块实例。这包括AppID、AppSecret、Token等敏感信息。在Webman中,需要确保这些配置信息的安全存储和管理。比如常用的:

在webman中使用easywechat6服务端消息时,需要把webman的请求转为easywechat6版本中使用的SymfonyRequest请求,当然想要在这里替换缓存的也可以根据实际需求替换,如果是多台服务器的一定要使用统一的redis缓存来缓存基础的token:

<?php
namespace app\controller;

use Symfony\Component\Cache\Adapter\RedisAdapter;
use Symfony\Component\Cache\Psr16Cache;
use EasyWeChat\OfficialAccount\Application;
use support\Request;
use Symfony\Component\HttpFoundation\HeaderBag;
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;

// 授权事件回调地址:http://easywechat.com/OfficialAccount/server

class OfficialAccount
{
    public function server(Request $request)
    {
        $config = config('wechatv6.official_account');
        $app = new Application($config);
        $symfony_request = new SymfonyRequest($request->get(), $request->post(), [], $request->cookie(), [], [], $request->rawBody());
        $symfony_request->headers = new HeaderBag($request->header());
        $app->setRequestFromSymfonyRequest($symfony_request);
        //$app->setCache(new Psr16Cache(new RedisAdapter(Redis::connection()->client())));//需要在redis配置中加上相关信息
        $server = $app->getServer();
        $response = $server->serve();

        return response($response->getBody()->getContents(), $response->getStatusCode(), $response->getHeaders());
    }
}

在Thinkphp或者laravel等框架的模板中使用微信JSSDK,其中变量$app需要后台assign到前端,下面以thinkphp为例:

<script src="https://res2.wx.qq.com/open/js/jweixin-1.4.0.js" type="text/javascript" charset="utf-8"></script>
<script>
    wx.config(<?php echo json_encode($app->getUtils()->buildJsSdkConfig('https://'. $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'],['hideAllNonBaseMenuItem','hideMenuItems'],[], false)); ?>);
    wx.ready(function () {
        wx.hideAllNonBaseMenuItem();
        wx.hideMenuItems({
            menuList: ['menuItem:share:appMessage', 'menuItem:share:timeline', 'menuItem:copyUrl', 'menuItem:originPage'] // 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,所有menu项见附录3
        });
    })
</script>

easywechat6是在6.11版本(含)后才加入消息验签,按官方说法,建议在拿到微信接口响应和接收到微信支付的回调通知时,对通知的签名进行验证,以确保通知是微信支付发送的,推送消息的验签:

$server = $app->getServer();

$server->handlePaid(function (Message $message, \Closure $next) use ($app) {
    // $message->out_trade_no 获取商户订单号
    // $message->payer['openid'] 获取支付者 openid

    try{
        $app->getValidator()->validate($app->getRequest());
       // 验证通过,业务处理
    } catch(Exception $e){
      // 验证失败
    }

    return $next($message);
});

// 默认返回 ['code' => 'SUCCESS', 'message' => '成功']
return $server->serve();

api返回值的验签:

// API 请求示例
$response = $app->getClient()->postJson("v3/pay/transactions/jsapi", [...]);

try{
    $app->getValidator()->validate($response->toPsrResponse());
   // 验证通过
} catch(Exception $e){
  // 验证失败
}
  • 时区问题:在使用EasyWeChat进行微信支付等操作时,可能会遇到时区不正确的问题。确保服务器上的时区设置正确,对于某些服务器,可能需要修改时区设置。

  • SSL证书问题:在调用微信支付等敏感操作接口时,可能会出现SSL证书问题。这要求服务器正确安装了CA证书,并确保使用的SSL协议版本兼容。

  • 支付授权目录配置:微信支付授权目录未正确配置可能导致支付失败。开发者需要登录微信公众平台,进入开发设置正确配置支付授权目录。这包括目录的URL、域名ICP备案等。

  • 异常处理和日志记录:在Webman中使用EasyWeChat时,确保正确处理任何可能出现的异常情况,并记录相关操作的日志,以便于问题追踪和调试。

  • 参与社区和文档:由于Webman和EasyWeChat都是开源项目,积极参与社区讨论,查阅官方文档和最佳实践,可以帮助解决使用过程中遇到的问题。

总之,在Webman中集成和使用EasyWeChat时,需要综合考虑框架特性、环境配置、初始化设置、安全性、性能优化以及社区支持等多方面因素。通过妥善处理这些问题,可以确保EasyWeChat在Webman中的顺利使用,为微信应用开发提供强大支持。
1755 5 2
5个评论

567

非常感谢正好需要

zjkal✅

说实话, 6真不如5好用

  • 彭彭 2024-04-30

    其实是一样的,6封装了底层的加密验签请求等,需要你更了解微信官方的相关文档,5是针对功能封装好的。6对easywechat作者升级更友好,微信sdk加了一个功能接口,5需要针对该功能重新封装,而6不需要,因为底层的加解密验签和请求不变。

积极废人

给大佬点赞,
非fpm模式,需要自己处理request的兼容性问题

nbyang

开启了控制器复用这样使用的话会不会有什么问题?
$app = Wxapp::get();
$server = $app->getServer();
$response = $server->serve();

<?php

namespace support;

use EasyWeChat\MiniApp\Application;

class Wxapp
{
    public static ?Application $wx_app = null;

    public static function get(): Application
    {
        if (self::$wx_app === null) {
            $config = [
                'app_id' => getenv('WXAPP_ID'),
                'secret' => getenv('WXAPP_SECRET'),
                'token' => getenv('WXAPP_TOKEN'),
                'aes_key' => getenv('WXAPP_AES_KEY'),
                'http' => [
                    'throw' => false,
                    'timeout' => 5.0,
                    'retry' => false,
                ],
            ];
            self::$wx_app = new Application($config);
        }

        return self::$wx_app;
    }
}
  • 彭彭 20天前

    看easywchat6源码,代码部分复用应该会有问题,因为源码里面,不管是$app->getServer()获取到的server,还是Server实例化时依赖的$this->getRequest()获取到的服务端请求,都是判断了有实例化对象就用之前的对象,还有通过Application获取的客户端请求也是一样,所以不建议,拿到Application的时候,同步应该设置好里面的服务端请求和缓存对像等。本文章中的示例用法打开控制器复用应该没有问题的

efnic

直接 composer安装一个包即可
composer require ledc/easywechat

彭彭

-110
积分
0
获赞数
0
粉丝数
2023-06-06 加入
×
🔝