新增小程序原生订阅消息授权页,在用户点击后请求生成结果通知授权。 拼图 compile_puzzle_draft 前等待授权页返回或跳过后再发起生成 action。 移除 web-view message 订阅授权路径,改用 storage/hash 回写订阅结果。 补充订阅授权测试、文档和团队踩坑记录。
136 lines
3.7 KiB
JavaScript
136 lines
3.7 KiB
JavaScript
/* global wx, getCurrentPages */
|
|
|
|
const SUBSCRIBE_RESULT_STORAGE_KEY = 'genarrative:wechat-subscribe-result';
|
|
|
|
function appendSubscribeResult(url, result) {
|
|
const hashIndex = String(url || '').indexOf('#');
|
|
const baseUrl =
|
|
hashIndex >= 0 ? String(url).slice(0, hashIndex) : String(url || '');
|
|
const rawHash = hashIndex >= 0 ? String(url).slice(hashIndex + 1) : '';
|
|
const nextHash = rawHash
|
|
.split('&')
|
|
.filter((part) => part && !part.startsWith('wx_subscribe_result='))
|
|
.concat(`wx_subscribe_result=${encodeURIComponent(result)}`)
|
|
.join('&');
|
|
return `${baseUrl}#${nextHash}`;
|
|
}
|
|
|
|
function buildSubscribeResultValue(requestId, status, reason) {
|
|
const segments = [requestId, status];
|
|
if (reason) {
|
|
segments.push(encodeURIComponent(reason));
|
|
}
|
|
return segments.join(':');
|
|
}
|
|
|
|
function notifyPreviousWebView(requestId, status, reason) {
|
|
const result = buildSubscribeResultValue(requestId, status, reason);
|
|
wx.setStorageSync(SUBSCRIBE_RESULT_STORAGE_KEY, result);
|
|
const pages = getCurrentPages();
|
|
const previousPage = pages.length >= 2 ? pages[pages.length - 2] : null;
|
|
if (previousPage && typeof previousPage.setData === 'function') {
|
|
previousPage.setData({
|
|
webViewUrl: appendSubscribeResult(previousPage.data.webViewUrl, result),
|
|
});
|
|
}
|
|
}
|
|
|
|
function resolveSubscribeStatus(result, templateId) {
|
|
return result && result[templateId] === 'accept'
|
|
? 'success'
|
|
: 'skip';
|
|
}
|
|
|
|
function createSubscribeMessagePage(pageContext, options = {}) {
|
|
const templateId = String(options.templateId || '').trim();
|
|
const notifyPageResult = (methodThis, status, reason) => {
|
|
const page = pageContext ?? methodThis;
|
|
const requestId = page.requestId || '';
|
|
if (!requestId || page.hasNotifiedSubscribeResult) {
|
|
return;
|
|
}
|
|
page.hasNotifiedSubscribeResult = true;
|
|
notifyPreviousWebView(requestId, status, reason);
|
|
};
|
|
|
|
return {
|
|
data: {
|
|
title: '接收生成结果通知',
|
|
errorMessage: '',
|
|
requesting: false,
|
|
},
|
|
|
|
onLoad(query) {
|
|
const page = pageContext ?? this;
|
|
page.requestId = String(query.requestId || '');
|
|
page.hasNotifiedSubscribeResult = false;
|
|
},
|
|
|
|
notifyResult(status, reason) {
|
|
notifyPageResult(this, status, reason);
|
|
},
|
|
|
|
requestSubscribe() {
|
|
const page = pageContext ?? this;
|
|
const requestId = page.requestId || '';
|
|
if (!requestId) {
|
|
page.setData({
|
|
errorMessage: '缺少订阅请求参数。',
|
|
});
|
|
return;
|
|
}
|
|
if (!templateId) {
|
|
notifyPageResult(this, 'skip', 'missing_template_id');
|
|
wx.navigateBack();
|
|
return;
|
|
}
|
|
if (typeof wx.requestSubscribeMessage !== 'function') {
|
|
notifyPageResult(this, 'skip', 'unsupported');
|
|
wx.navigateBack();
|
|
return;
|
|
}
|
|
|
|
page.setData({
|
|
requesting: true,
|
|
errorMessage: '',
|
|
});
|
|
wx.requestSubscribeMessage({
|
|
tmplIds: [templateId],
|
|
success(result) {
|
|
notifyPageResult(
|
|
page,
|
|
resolveSubscribeStatus(result, templateId),
|
|
'',
|
|
);
|
|
wx.navigateBack();
|
|
},
|
|
fail(error) {
|
|
notifyPageResult(
|
|
page,
|
|
'skip',
|
|
error && error.errMsg ? error.errMsg : 'failed',
|
|
);
|
|
wx.navigateBack();
|
|
},
|
|
});
|
|
},
|
|
|
|
handleSkip() {
|
|
notifyPageResult(this, 'skip', 'user_skip');
|
|
wx.navigateBack();
|
|
},
|
|
|
|
onUnload() {
|
|
notifyPageResult(this, 'skip', 'page_unload');
|
|
},
|
|
};
|
|
}
|
|
|
|
module.exports = {
|
|
SUBSCRIBE_RESULT_STORAGE_KEY,
|
|
appendSubscribeResult,
|
|
buildSubscribeResultValue,
|
|
createSubscribeMessagePage,
|
|
resolveSubscribeStatus,
|
|
};
|