EasyWeChat環(huán)境需求:EasyWeChat要求PHP版本不低于8.0,并需要安裝cURL、OpenSSL、SimpleXML和fileinfo等擴展。這確保了EasyWeChat在Webman環(huán)境中的兼容性和功能性。
初始化EasyWeChat:使用EasyWeChat時,通過傳入配置信息來初始化一個模塊實例。這包括AppID、AppSecret、Token等敏感信息。在Webman中,需要確保這些配置信息的安全存儲和管理。比如常用的:
在webman中使用easywechat6服務端消息時,需要把webman的請求轉為easywechat6版本中使用的SymfonyRequest請求,當然想要在這里替換緩存的也可以根據(jù)實際需求替換,如果是多臺服務器的一定要使用統(tǒng)一的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版本(含)后才加入消息驗簽,按官方說法,建議在拿到微信接口響應和接收到微信支付的回調通知時,對通知的簽名進行驗證,以確保通知是微信支付發(fā)送的,推送消息的驗簽:
$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());
// 驗證通過,業(yè)務處理
} 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){
// 驗證失敗
}
時區(qū)問題:在使用EasyWeChat進行微信支付等操作時,可能會遇到時區(qū)不正確的問題。確保服務器上的時區(qū)設置正確,對于某些服務器,可能需要修改時區(qū)設置。
SSL證書問題:在調用微信支付等敏感操作接口時,可能會出現(xiàn)SSL證書問題。這要求服務器正確安裝了CA證書,并確保使用的SSL協(xié)議版本兼容。
支付授權目錄配置:微信支付授權目錄未正確配置可能導致支付失敗。開發(fā)者需要登錄微信公眾平臺,進入開發(fā)設置正確配置支付授權目錄。這包括目錄的URL、域名ICP備案等。
異常處理和日志記錄:在Webman中使用EasyWeChat時,確保正確處理任何可能出現(xiàn)的異常情況,并記錄相關操作的日志,以便于問題追蹤和調試。
參與社區(qū)和文檔:由于Webman和EasyWeChat都是開源項目,積極參與社區(qū)討論,查閱官方文檔和最佳實踐,可以幫助解決使用過程中遇到的問題。
開啟了控制器復用這樣使用的話會不會有什么問題?
$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;
}
}
看easywchat6源碼,代碼部分復用應該會有問題,因為源碼里面,不管是$app->getServer()獲取到的server,還是Server實例化時依賴的$this->getRequest()獲取到的服務端請求,都是判斷了有實例化對象就用之前的對象,還有通過Application獲取的客戶端請求也是一樣,所以不建議,拿到Application的時候,同步應該設置好里面的服務端請求和緩存對像等。本文章中的示例用法打開控制器復用應該沒有問題的
非常感謝正好需要