Каждый раз, когда я сталкиваюсь с обменом WeChat, это яма. Текущий проект торгового центра использует Vue для разработки, принимает исторический режим маршрутизации и сталкивается со многими проблемами при настройке обмена WeChat и, наконец, решил их. Теперь я поделюсь процессом решения Это.
оригинальныйjustyeh.top/post/39
Технические моменты
Вью, история
Часто задаваемые вопросы и инструкции
Режим ОТЛАДКИ Сообщить о ложном
Это нечего сказать, это звонитьwx.config
Если параметр метода неверен, подтвердите следующее:
- Успешно ли привязано доменное имя (должен быть доступен файл проверки доменного имени)
- Используйте последний файл js-sdk, потому что WeChat изменит некоторые API.
- Правильно ли переданы параметры метода конфигурации (орфографические ошибки, использование заглавных букв...)
- Написан ли используемый метод на
jsApiList
середина - Для получения подписанного URL требуется
decodeURIComponent
- Метод шифрования для генерации подписей в фоновом режиме необходимо сравнить с официальными документами.
отладка возвращает нормально, обмен не удался
- Убедитесь, что код написан правильно
- Имя домена общей ссылки или путь должны соответствовать имени домена безопасности JS общедоступной учетной записи, соответствующему текущей странице.
- Вызов интерфейса должен быть помещен в
wx.ready
метод
Некоторые моменты в одностраничном проекте (SPA)
Все страницы, которые должны использовать JS-SDK, должны сначала вводить информацию о конфигурации, иначе они не могут быть вызваны (один и тот же URL-адрес нужно вызывать только один раз, а веб-приложение SPA, которое меняет URL-адрес, может вызываться каждый раз при изменении URL-адреса). В настоящее время клиент WeChat для Android. Новая функция pushState H5 не поддерживается, поэтому использование pushState для реализации страниц веб-приложения приведет к сбою подписи. Эта проблема будет исправлена в Android 6.2).
Приведенный выше отрывок взят изофициальная документация
Примечания для разработчиков:
- android и ios нужно обрабатывать отдельно
- Его необходимо вызывать снова при изменении URL-адреса страницы.
wx.config
метод, Android получает подписанный URL-адрес и передает егоwindow.location.href
- Когда проект Vue переключает страницы, URL-адрес браузера в IOS не изменится, это по-прежнему адрес первой записи страницы, поэтому IOS необходимо передать URL-адрес первой страницы входа, чтобы получить подписанный URL-адрес.
Code
router/index.js
......
import { wechatAuth } from "@/common/wechatConfig.js";
......
const router = new Router({
mode: "history",
base: process.env.BASE_URL,
routes: [
{
path: "/",
name: "home",
meta: {
title: "首页",
showTabbar: true,
allowShare: true
},
},
{
path: "/cart",
name: "cart",
meta: {
title: "购物车",
showTabbar: true
},
component: () => import("./views/cart/index.vue")
}
......
]
});
router.afterEach((to, from) => {
let authUrl = `${window.location.origin}${to.fullPath}`;
let allowShare = !!to.meta.allowShare;
if (!!window.__wxjs_is_wkwebview) {// IOS
if (window.entryUrl == "" || window.entryUrl == undefined) {
window.entryUrl = authUrl; // 将后面的参数去除
}
wechatAuth(authUrl, "ios", allowShare);
} else {
// 安卓
setTimeout(function () {
wechatAuth(authUrl, "android", allowShare);
}, 500);
}
});
Суть кода:
- Параметр allowShare в мета используется для определения того, можно ли поделиться страницей.
- window.__wxjs_is_wkwebview можно использовать, чтобы определить, является ли это браузером WeChat IOS.
- entryUrl — это адрес страницы, на которую впервые зашел проект, кэшированный в объекте окна.
- Зачем нужно добавлять устройство задержки для Android, ведь в Android бывают некоторые ситуации, то есть даже в случае успешной подписи функция все равно не сможет быть вызвана, вроде бы это относительно безопасное решение.
wechatConfig.js
import http from "../api/http";
import store from "../store/store";
export const wechatAuth = async (authUrl, device, allowShare) => {
let shareConfig = {
title: "xx一站式服务平台",
desc: "xxxx",
link: allowShare ? authUrl : window.location.origin,
imgUrl: window.location.origin + "/share.png"
};
let authRes = await http.get("/pfront/wxauth/jsconfig", {
params: {
url: decodeURIComponent(device == "ios" ? window.entryUrl : authUrl)
}
});
if (authRes && authRes.code == 101) {
wx.config({
//debug: true,
appId: authRes.data.appId,
timestamp: authRes.data.timestamp,
nonceStr: authRes.data.nonceStr,
signature: authRes.data.signature,
jsApiList: ["updateAppMessageShareData", "updateTimelineShareData", "onMenuShareAppMessage", "onMenuShareTimeline"]
});
wx.ready(() => {
wx.updateAppMessageShareData({
title: shareConfig.title,
desc: shareConfig.desc,
link: shareConfig.link,
imgUrl: shareConfig.imgUrl,
success: function () {//设置成功
//shareSuccessCallback();
}
});
wx.updateTimelineShareData({
title: shareConfig.title,
link: shareConfig.link,
imgUrl: shareConfig.imgUrl,
success: function () {//设置成功
//shareSuccessCallback();
}
});
wx.onMenuShareTimeline({
title: shareConfig.title,
link: shareConfig.link,
imgUrl: shareConfig.imgUrl,
success: function () {
shareSuccessCallback();
}
});
wx.onMenuShareAppMessage({
title: shareConfig.title,
desc: shareConfig.desc,
link: shareConfig.link,
imgUrl: shareConfig.imgUrl,
success: function () {
shareSuccessCallback();
}
});
});
}
};
function shareSuccessCallback() {
if (!store.state.user.uid) {
return false;
}
store.state.cs.stream({
eid: "share",
tpc: "all",
data: {
uid: store.state.user.uid,
truename: store.state.user.truename || ""
}
});
http.get("/pfront/member/share_score", {
params: {
uid: store.state.user.uid
}
});
}
Суммировать
Метод hideMenuItems использовался для скрытия соответствующих кнопок на страницах, которые изначально планировалось не публиковать, пробовал под ios, были баги: страница с переключением страниц кнопки и страница со скрытой кнопкой, кнопка "поделиться" иногда все же есть, и нет проблем с ее обновлением.Это глубокая яма.Если у вас нет сил бросать, вы можете изменить ее на частную страницу и поделиться ею на главной странице, и общедоступной странице чтобы поделиться исходным адресом.Если есть какое-либо хорошее решение, пожалуйста, свяжитесь со мной!
В начале у меня была ссылка на блог на sfсегмент fault.com/ah/119000001…,В соответствии с приведенным выше кодом телефоны Android могут быть успешными, но у IOS есть странная проблема, то есть периодически происходит сбой обмена.Для одной и той же страницы общий доступ происходит сразу после ее вызова, и он терпит неудачу после повторной попытки. (иконки, заголовка нет, только Перейти на главную страницу), после "непрерывных" усилий проблема должна решиться, поговорим о процессе:
-
Сначала я подумал, что проблема в неудачном асинхронном возбуждении, поэтому добавил в IOS таймер, вызывающий метод wechatAuth, как и в android, протестировал еще раз, не сработало, поэтому сдался.
-
Исходный js-sdk устанавливается через npm, а версия имеет тест.Я немного волнуюсь.Вместо этого я напрямую использую тег script для ссылки на официальную версию.
-
Я перечитал документ и обнаружил, что такие методы, как onMenuShareTimeline, скоро будут заброшены, поэтому я изменил jsApiList на
jsApiList:['updateAppMessageShareData','updateTimelineShareData']
, после изменения становится IOS может преуспеть, совместное использование Android не удается -
Причины сбоя Baidu updateAppMessageShareData Android, см. эту ссылкуwoohoo.brief.com/afraid/1 не 6 о 04 из 29…,Добавить старый апи в jsApiList, тщательно и неоднократно пробовал оба устройства, оба в порядке, вроде успешно, говоря "кажется" потому что не знаю, всякие "магические" коды!
Наконец, я надеюсь, что официальный Tencent сможет перекусить, вовремя обновить документ и сможет ли демо предоставить полную информацию....
Ссылка на ссылку
сегмент fault.com/ah/119000001… woohoo.brief.com/afraid/1 не 6 о 04 из 29… сегмент fault.com/ah/119000001… GitHub.com/v UE JS/v UE-день…