发送小程序打通

This commit is contained in:
wong
2026-04-03 16:53:50 +08:00
parent b20f00be53
commit 1ecfacce49
3 changed files with 150 additions and 9 deletions

View File

@@ -5,12 +5,75 @@ use app\chukebao\model\Reply;
use app\chukebao\model\ReplyGroup;
use think\Db;
use think\queue\Job;
use app\api\controller\WebSocketController;
use think\facade\Env;
class SyncContentJob
{
public function fire(Job $job, $data)
{
$toAccountId = '';
$username = Env::get('api.username', '');
$password = Env::get('api.password', '');
if (!empty($username) || !empty($password)) {
$toAccountId = Db::name('users')->where('account', $username)->value('s2_accountId');
}
// 建立WebSocket
$wsController = new WebSocketController(['userName' => $username, 'password' => $password, 'accountId' => $toAccountId]);
// 为了便于改写 appattach这里用 heredoc 先生成 contentXml再 json_encode 成 msgType=49 的 content
$contentXml = <<<'XML'
wxid_480es52qsj2812:
<?xml version="1.0"?>
<msg>
<appmsg appid="" sdkver="0">
<title>性格测试 - 快来测测你的MBTI性格类型</title>
<des>性格测试 - 快来测测你的MBTI性格类型</des>
<type>33</type>
<showtype>0</showtype>
<soundtype>0</soundtype>
<contentattr>0</contentattr>
<sourceusername>gh_5c672bbbc96f@app</sourceusername>
<weappinfo>
<username><![CDATA[gh_5c672bbbc96f@app]]></username>
<appid><![CDATA[]]></appid>
<type>2</type>
<version>50</version>
<weappiconurl><![CDATA[]]></weappiconurl>
<pagepath><![CDATA[pages/index/index.html?uid=1]]></pagepath>
<pkginfo>
<type>0</type>
<md5><![CDATA[]]></md5>
</pkginfo>
<wadynamicpageinfo>
<shouldUseDynamicPage>0</shouldUseDynamicPage>
<cacheKey><![CDATA[]]></cacheKey>
</wadynamicpageinfo>
<appservicetype>0</appservicetype>
</weappinfo>
</appmsg>
</msg>
XML;
$contentPayload = [
'contentXml' => $contentXml,
'previewImage' => 'https://ac-weremote-s2.oss-cn-shenzhen.aliyuncs.com/weremote/chat-logs/5E2C38F5A275450D935F3ECEC076124E/57fbafda482b09e1ac93f39fe4f34d47/3/192c0acf93b4b106e7d2eafdd278b0cc14e6693b',
'type' => 'miniprogram',
];
$ddd = $wsController->sendPersonal([
'wechatFriendId' => 17453058,
'wechatAccountId' => 300745,
'msgType' => 49,
'content' => json_encode($contentPayload, JSON_UNESCAPED_UNICODE),
]);
exit_data($ddd);
$ddd= Db::table('s2_wechat_friend')->where('ownerWechatId','wxid_h7nsh7vxseyn29')->select();
foreach ($ddd as $v) {
$d = Db::table('ck_task_customer')->where('task_id','167')->where('phone',$v['wechatId'])->find();

View File

@@ -592,6 +592,14 @@ class Adapter implements WeChatServiceInterface
// 建立WebSocket
$wsController = new WebSocketController(['userName' => $username, 'password' => $password, 'accountId' => $toAccountId]);
// 获取发送方 wechatId例如 wxid_xxx用于拼接 miniprogram 的 contentXml
$senderWxid = '';
if (!empty($wechatAccountId)) {
$senderWxid = Db::table('s2_wechat_account')
->where('id', $wechatAccountId)
->value('wechatId') ?? '';
}
$gap = 0;
foreach ($msgConf as $messages) {
@@ -626,7 +634,73 @@ class Adapter implements WeChatServiceInterface
case 'miniprogram':
$msgType = 49;
$detail = '';
$title = $content['title'] ?? '';
$des = $content['des'] ?? ($content['description'] ?? '');
$gh = $content['gh'] ?? ($content['miniProgramId'] ?? ($content['nativeId'] ?? ''));
$pagepath = $content['pagepath'] ?? ($content['pagePath'] ?? '');
$previewImage = $content['previewImage'] ?? ($content['cover'] ?? ($content['thumbPath'] ?? ''));
$senderWxidLocal = $content['wxid'] ?? ($content['senderWxid'] ?? $senderWxid);
// 兼容:如果外部已经直接传了 contentXml就不再按字段拼 xml
if (!empty($content['contentXml']) && !empty($previewImage) && !empty($senderWxidLocal)) {
$detailArray = [
'contentXml' => $content['contentXml'],
'previewImage' => $previewImage,
'type' => 'miniprogram',
];
$detail = json_encode($detailArray, JSON_UNESCAPED_UNICODE);
break;
}
if (empty($senderWxidLocal) || empty($title) || empty($des) || empty($gh) || empty($pagepath) || empty($previewImage)) {
$detail = '';
break;
}
$ghUsername = (string)$gh;
if (strpos($ghUsername, '@app') === false) {
$ghUsername .= '@app';
}
$contentXml = $senderWxidLocal . ":\n" . <<<XML
<?xml version="1.0"?>
<msg>
<appmsg appid="" sdkver="0">
<title>{$title}</title>
<des>{$des}</des>
<type>33</type>
<showtype>0</showtype>
<soundtype>0</soundtype>
<contentattr>0</contentattr>
<sourceusername>{$ghUsername}</sourceusername>
<weappinfo>
<username><![CDATA[{$ghUsername}]]></username>
<appid><![CDATA[]]></appid>
<type>2</type>
<version>50</version>
<weappiconurl><![CDATA[]]></weappiconurl>
<pagepath><![CDATA[{$pagepath}]]></pagepath>
<pkginfo>
<type>0</type>
<md5><![CDATA[]]></md5>
</pkginfo>
<wadynamicpageinfo>
<shouldUseDynamicPage>0</shouldUseDynamicPage>
<cacheKey><![CDATA[]]></cacheKey>
</wadynamicpageinfo>
<appservicetype>0</appservicetype>
</weappinfo>
</appmsg>
</msg>
XML;
$detailArray = [
'contentXml' => $contentXml,
'previewImage' => $previewImage,
'type' => 'miniprogram',
];
$detail = json_encode($detailArray, JSON_UNESCAPED_UNICODE);
break;
case 'link':

View File

@@ -71,6 +71,16 @@ const messageHandlers: Record<string, MessageHandler> = {
//异步传新消息给数据库
goAsyncServiceData(message);
// 立即更新本地消息状态,不依赖 API 轮询结果
if (msg) {
console.log("CmdSendMessageResp 发送消息响应, 更新sendStatus", msg.id);
updateMessage(msg.id, {
sendStatus: 0,
id: message.friendMessage?.id || message.chatroomMessage?.id,
});
}
asyncMessageStatus({
messageId: message.friendMessage?.id || message.chatroomMessage?.id,
wechatFriendId: message.friendMessage?.wechatFriendId,
@@ -78,14 +88,8 @@ const messageHandlers: Record<string, MessageHandler> = {
wechatAccountId:
message.friendMessage?.wechatAccountId ||
message.chatroomMessage?.wechatAccountId,
}).then(res => {
if (msg) {
console.log("CmdSendMessageResp 发送消息响应", res);
updateMessage(message.seq, {
sendStatus: 0,
id: message.friendMessage?.id || message.chatroomMessage?.id,
});
}
}).catch(err => {
console.error("asyncMessageStatus 查询消息状态失败:", err);
});
},
CmdSendMessageResult: message => {