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都是开源项目,积极参与社区讨论,查阅官方文档和最佳实践,可以帮助解决使用过程中遇到的问题。
非常感谢正好需要
不用谢
说实话, 6真不如5好用
其实是一样的,6封装了底层的加密验签请求等,需要你更了解微信官方的相关文档,5是针对功能封装好的。6对easywechat作者升级更友好,微信sdk加了一个功能接口,5需要针对该功能重新封装,而6不需要,因为底层的加解密验签和请求不变。
给大佬点赞,
非fpm模式,需要自己处理request的兼容性问题
握手
开启了控制器复用这样使用的话会不会有什么问题?
$app = Wxapp::get();
$server = $app->getServer();
$response = $server->serve();
看easywchat6源码,代码部分复用应该会有问题,因为源码里面,不管是$app->getServer()获取到的server,还是Server实例化时依赖的$this->getRequest()获取到的服务端请求,都是判断了有实例化对象就用之前的对象,还有通过Application获取的客户端请求也是一样,所以不建议,拿到Application的时候,同步应该设置好里面的服务端请求和缓存对像等。本文章中的示例用法打开控制器复用应该没有问题的
直接 composer安装一个包即可
composer require ledc/easywechat
我刚说来个人封装一下easywechat ,。。