Documentation WeChat JS-SDK
Documentation WeChat JS-SDK
WeChat JS-SDK est fourni par la plateforme publique WeChat pour les développeurs Web basés sur WeChat Boîte à outils de développement Web à l'intérieur.
En utilisant WeChat JS-SDK, les développeurs Web peuvent utiliser WeChat pour utiliser efficacement les capacités des systèmes de téléphonie mobile telles que la prise de photos, la sélection d'images, la voix et la localisation. En même temps, ils peuvent directement utiliser WeChat pour partager. , scan, coupon, paiement, etc. Les capacités uniques de WeChat offrent aux utilisateurs de WeChat une meilleure expérience Web.
Ce document présente comment utiliser WeChat JS-SDK et les précautions associées pour les développeurs Web. Étapes pour utiliser JSSDK « Paramètres de fonction » Remplissez le « Nom de domaine de sécurité de l'interface JS ».
Remarque : Après vous être connecté, vous pouvez afficher les autorisations d'interface correspondantes dans le "Centre des développeurs".
Étape 2 : Importer des fichiers JSIntroduisez le fichier JS suivant dans la page qui doit appeler l'interface JS (supporte https) : http://res.wx.qq.com/open/js/jweixin-1.0.0.js Si vous devez utiliser les fonctions périphériques Shake, veuillez présenter http://res.wx.qq.com/open/js/jweixin-1.1.0.js Remarque : prend en charge l'utilisation d'AMD. /CMD méthode de chargement du module standard Chargement Étape 3 : Injecter la configuration de vérification des autorisations via l'interface de configuration Toutes les pages qui doivent utiliser JS-SDK doivent d'abord injecter des informations de configuration, sinon elles ne le seront pas être appelé (la même URL ne doit être appelée qu'une seule fois, l'application Web du SPA qui modifie l'URL peut être appelée à chaque fois que l'URL change. Actuellement, le client Android WeChat ne prend pas en charge la nouvelle fonctionnalité H5 de pushState, donc en utilisant pushState pour implémenter la page de l'application Web entraînera l'échec de la signature. Ce problème sera résolu dans Android 6.2). wx.config({ ) debug: true, // Activez le mode débogage. Les valeurs de retour de toutes les API appelées seront alertées côté client. Si vous souhaitez afficher les paramètres entrants, vous pouvez l'ouvrir côté PC. Les informations sur les paramètres seront imprimées via le log, et ne seront imprimées que côté PC appId : '', // Obligatoire, l'identifiant unique du compte officiel . timestamp : , // Obligatoire, utilisé pour générer une signature Timestamp nonceStr : '', // Obligatoire, générer une chaîne aléatoire de signature signature : '', // Obligatoire, signature. , voir Annexe 1 jsApiList : [] // Obligatoire, la liste des interfaces JS qui doivent être utilisées, voir Annexe 2 pour la liste de toutes les interfaces JS }); Étape 4 : Traiter la vérification réussie via l'interface prête wx.ready(function(){ ) // La méthode prête sera exécutée une fois les informations de configuration vérifiées , et tous les appels d'interface doivent Une fois que l'interface de configuration a obtenu le résultat, config est une opération asynchrone côté client, donc si l'interface appropriée doit être appelée lorsque la page est chargée, l'interface appropriée doit être appelée dans la fonction ready pour assurer une exécution correcte lorsqu'il est déclenché par l'interface utilisateur, il peut être appelé directement et n'a pas besoin d'être placé dans la fonction ready }); Étape 5 : Gérer l'échec de la vérification via l'interface d'erreur wx.error(function(res){ ) // Si la vérification des informations de configuration échoue, la fonction d'erreur être exécuté, par exemple lorsque la signature expire. La vérification a échoué. Les informations d'erreur spécifiques peuvent être consultées dans le mode débogage de la configuration ou dans le paramètre res renvoyé. Pour SPA, la signature peut être mise à jour ici }); Instructions d'appel d'interface Toutes les interfaces sont appelées via des objets wx (les objets jWeixin peuvent également être utilisés. Le paramètre est un objet en plus des paramètres qui doivent être transmis pour chaque interface). lui-même, il y a les paramètres généraux suivants : 1.success : fonction de rappel exécutée lorsque l'appel de l'interface est réussi. 2.fail : La fonction de rappel exécutée lorsque l'appel d'interface échoue. 3.complete : La fonction de rappel exécutée lorsque l'appel d'interface est terminé, sera exécutée quel que soit le succès ou l'échec. 4.cancel : La fonction de rappel lorsque l'utilisateur clique sur Annuler. Elle n'est utilisée que par certaines API où l'utilisateur annule l'opération. 5.trigger : Une méthode qui est déclenchée lorsqu'un bouton du menu est cliqué. Cette méthode ne prend en charge que les interfaces associées dans le menu. Remarque : N'essayez pas d'utiliser une requête asynchrone ajax dans le déclencheur pour modifier le contenu de ce partage, car l'opération de partage client est une opération synchrone et le paquet de retour utilisant ajax ne sera pas renvoyé pour le moment. Les fonctions ci-dessus ont toutes un paramètre, qui est de type objet. En plus des données renvoyées par chaque interface elle-même, il existe également un attribut général errMsg, dont le format de valeur est le suivant : Quand. l'appel réussit : "xxx:ok", où xxx est le nom de l'interface appelée Lorsque l'utilisateur annule : "xxx:cancel", où xxx est le nom de l'interface appelée Lorsque l'appel l'appel échoue : sa valeur est le message d'erreur spécifique Déterminez si la version actuelle du client prend en charge l'interface JS spécifiée wx.checkJsApi({ jsApiList : ['chooseImage ' ], // Liste des interfaces JS qui doivent être détectées, voir Annexe 2 pour la liste de toutes les interfaces JS, success: function(res) { Ne pas utiliser False f //, tel comme : {"CheckResult": {"chOOSEIMAGE": True}, "ERRMSG": "Checkjsapi : OK"}}} ); Remarque : L'interface checkJsApi est une interface réservée nouvellement introduite dans le client 6.0.2. Les interfaces ouvertes dans la première phase peuvent être détectées sans utiliser checkJsApi. Veuillez faire attention à ne pas inciter au partage et à d'autres activités illégales. En cas de comportement de partage induit, l'autorisation de l'interface de compte officielle sera définitivement révoquée. Pour les règles détaillées, veuillez vérifier : FAQ sur la gestion des moments. Obtenez l'état du clic sur le bouton "Partager dans Moments" et personnalisez l'interface de partage de contenu wx.onMenuShareTimeline({ titre : '', // Titre du partage lien : '', // Partager le lien imgUrl : '', // Icône de partage succès : fonction () { // Fonction de rappel exécutée après que l'utilisateur confirme le partage }, annuler : fonction () {取 // L'utilisateur annule la fonction de rappel exécutable après le partage }} ); Obtenez l'état du clic sur le bouton "Partager avec des amis" et personnalisez l'interface de partage de contenu wx.onMenuShareAppMessage({ ) titre : '', // Titre du partage desc : '', // Description du partage lien : '', // Lien de partage imgUrl : '', // Icône de partage type : '', // Partager type, musique, vidéo ou lien, si laissé vide, la valeur par défaut est link dataUrl : '', // Si le type est musique ou vidéo, un lien de données doit être fourni, la valeur par défaut est vide succès : function () { ‐ à être exécuté après que l'utilisateur a confirmé le partage, ‐‐‐‐‐‐‐‐‐‐‐‐‐‐''''' () { Fonction de rappel exécutée après l'annulation du partage par l'utilisateur Obtenez l'état du clic sur le bouton "Partager sur QQ" et personnalisez l'interface de partage de contenu wx.onMenuShareQQ({ ) titre : '', // Titre du partage desc : '', // Description du partage lien : '', // Lien de partage imgUrl : '', // Icône de partage succès : fonction () { peut être exécuté après que le partage puisse être exécuté après que le partage puisse être annulé } }); wx.onMenuShareWeibo({ title: '', // 分享标题 desc: '', // 分享描述 link: '', // 分享链接 imgUrl: '', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { Fonction de rappel exécutée après l'annulation du partage par l'utilisateur wx.onMenuShareQZone({ title: '', // 分享标题 desc: '', // 分享描述 link: '', // 分享链接 imgUrl: '', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { Fonction de rappel exécutée après l'annulation du partage par l'utilisateur Interface pour prendre des photos ou sélectionner des photos dans l'album mobile wx.chooseImage({ Compte : 1, / / Défaut 9 sizeType : ['original', 'compressed'], // Vous pouvez préciser s'il s'agit de l'image originale ou de l'image compressée, les deux sont disponibles par défaut sourceType : ['album' , 'camera'], // Vous pouvez préciser si la source est l'album photo ou l'appareil photo. Par défaut, les deux sont inclus : function (res) { L'attribut src de la balise affiche l'image . } }); wx.previewImage({ actuelle : '', // lien http pour afficher actuellement l'image urls : [] //besoin aperçu Liste des liens http photos }); Interface de téléchargement d'image wx.uploadImage({ localId: '', // L'ID local de l'image à télécharger est obtenu par l'interface ChooseImage isShowProgressTips : 1, // La valeur par défaut est 1, affiche l'invite de progression Succès : function (res) { var serverId = res.serverId; // Renvoie l'ID du serveur de l'image } }); Remarque : les images téléchargées sont valables 3 jours. Vous pouvez utiliser l'interface multimédia WeChat pour télécharger des images sur votre propre serveur. L'ID de serveur obtenu ici est media_id. Interface de téléchargement de l'image wx.downloadImage({ ) serverId: '', // L'ID côté serveur de l'image à télécharger est obtenu à partir du interface uploadImage isShowProgressTips : 1, // La valeur par défaut est 1, affiche les conseils de progression success : function (res) { var localId = res.localId ; // Renvoie l'ID local après le téléchargement du image } }); Arrêter l'interface d'enregistrement wx.stopRecord({ Succès : fonction (res) { var localId = res. localId; } }); Interface pour arrêter automatiquement l'enregistrement de surveillance wx.onVoiceRecordEnd({ ) // Un rappel complet sera exécuté lorsque la durée d'enregistrement dépasse une minute sans s'arrêter complet : function ( res) { var localId = res.localId } }); wx.playVoice({ ) localId: '' // L'ID local de l'audio à lire est obtenu à partir de l'interface stopRecord }) ; wx.pauseVoice({ ) localId: '' // L'ID local de l'audio qui doit être mis en pause est obtenu par l'interface stopRecord }); wx.stopVoice({ ) localId: '' // L'ID local de l'audio qui doit être arrêté est obtenu par l'interface stopRecord }) Interface pour surveiller l'achèvement de la lecture vocale wx.onVoicePlayEnd({ Succès : fonction (res) { var local Id = res.localId ; / / Renvoyer l'identifiant local audio } }); wx.uploadVoice({ ) localId: '', // L'ID local de l'audio à télécharger est obtenu par l'interface stopRecord ISShowProgressTips: 1, // par défaut est 1, afficher l'invite de progression Succès: fonction (res) { var serverID = res.serverID; } }); Remarque : la voix téléchargée est valable 3 jours. Vous pouvez utiliser l'interface multimédia WeChat pour télécharger la voix sur votre propre serveur. L'ID de serveur obtenu ici est media_id. Veuillez vous référer au document. l'interface de téléchargement est de 10 000 fois/jour. Si nécessaire, augmentez la fréquence, veuillez vous connecter à la plateforme publique WeChat et demander d'augmenter la limite supérieure temporaire dans la liste des autorisations de l'interface de développement. Télécharger l'interface vocale wx.downloadVoice({ ) serverId: '', // L'ID côté serveur de l'audio à télécharger est obtenu à partir du interface uploadVoice isShowProgressTips : 1, // La valeur par défaut est 1, affichant les conseils de progression success: function (res) { var localId = res.localId ; audio } }); Interface pour reconnaître l'audio et renvoyer les résultats de reconnaissance wx.translateVoice({ localId : '', // besoins à identifier L'ID local de l'audio, obtenu à partir de l'interface associée à l'enregistrement isShowProgressTips : 1, // La valeur par défaut est 1, affiche l'invite de progression succès : fonction (res) { alert(res.translateResult); // Résultat de la reconnaissance vocale } }); Obtenir l'interface d'état du réseau wx.getNetworkType({ réussite : fonction (res) { var networkType = res.networkType; // Renvoie le type de réseau 2g, 3g, 4g, wifi } }); Utilisez l'interface de localisation de la vue cartographique intégrée à WeChat wx.openLocation({ latitude : 0, // latitude , points flottants, la plage est de 90 ~ -90 longitude : 0, // Longitude, nombre à virgule flottante, la plage est de 180 ~ -180 nom : '', // Nom du lieu . adresse : ' ', // Détails de l'adresse échelle : 1, // Niveau de zoom de la carte, valeur de mise en forme, allant de 1 à 28. La valeur par défaut est le maximum infoUrl : '' // Affiché à l'adresse en bas de l'interface de localisation de la vue Hyperlien, cliquez pour sauter }); Obtenir l'interface de localisation géographique wx.getLocation({ ) tapez : 'wgs84', // La valeur par défaut est les coordonnées GPS wgs84 Si vous souhaitez retourner directement sur Mars. Les coordonnées openLocation peuvent être transmises dans 'gcj02' Succès : fonction (res) { var latitude = res.latitude; // Latitude, nombre à virgule flottante, la plage est de 90 ~ -90 var longitude = res.longitude; // Longitude, nombre à virgule flottante, la plage est de 180 ~ -180. var speed = res.speed; // Vitesse, en mètres par seconde var précision = res.accuracy; Précision de la position } }); Ouvrez l'interface pour rechercher les appareils ibeacon environnants wx.startSearchBeacons({ billet :" ", / / Secouez les tickets professionnels environnants, le système les ajoute automatiquement après le lien de la page secouée complete:function(argv){ //Activez la fonction de rappel une fois la recherche terminée } }); Remarque : Si vous devez accéder à la fonction de périphérique de secousse, veuillez vous référer à : Appliquer pour activer le périphérique de secousse ({ }}); Écoutez l'interface du périphérique ibeacon wx.onSearchBeacons({ complete:function(argv){ //Fonction de rappel, peut être sous forme de tableau Obtenir la liste des périphériques associés enregistrés par le commerçant } }); Remarques : Pour les précautions d'utilisation de l'interface périphérique Shake Shake mentionnées ci-dessus et d'autres instructions sur les résultats de retour, veuillez vous référer à : Périphériques Shake Shake pour obtenir des informations sur l'appareil Masquer l'interface du menu dans le coin supérieur droit wx.hideOptionMenu(); Afficher l'interface du menu dans le coin supérieur droit wx.showOptionMen u() ; Fermez l'interface de la fenêtre de la page Web actuelle wx.closeWindow(); Interface du bouton de fonction de masquage par lots wx. hideMenuItems( { menuList : [] // Les éléments de menu à masquer ne peuvent masquer que les boutons "Propagation" et "Protection". Voir l'Annexe 3 pour tous les éléments de menu }); Interface des boutons de fonction d'affichage par lots wx.showMenuItems({ ) menuList : [] // Éléments de menu à afficher, voir l'annexe 3 pour tous les éléments de menu } ; Afficher l'interface de tous les boutons de fonction wx.showAllNonBaseMenuItem(); Configurer l'interface de numérisation WeChat wx.scanQRCode({ needResult : 0, // Par défaut Si c'est le cas est 0, le résultat du scan sera traité par WeChat, si 1, le résultat du scan sera renvoyé directement, scanType: ["qrCode","barCode"], // Vous pouvez spécifier s'il faut scanner un code QR ou un code 1D, et les deux sont disponibles par défaut Success: function (res) { var result = res.resultStr; // Lorsque needResult vaut 1, le résultat renvoyé en scannant le code } }); Accédez à l'interface de la page produit WeChat wx.openProductSpecificView({ productId : '', // identifiant du produit viewType : '' // 0. Valeur par défaut, page de détails du produit ordinaire 1. Scanner la page de détails du produit 2. Page de détails du produit du magasin }); Le certificat de signature api_ticket utilisé dans l'interface WeChat Cards and Tickets est différent du certificat de signature jsapi_ticket utilisé dans la configuration à la troisième étape. appeler le JS-SDK des cartes et billets WeChat. Deux signatures différentes doivent être complétées dans l'ordre et les informations d'identification doivent être mises en cache. api_ticket est un ticket temporaire utilisé pour appeler la carte WeChat et l'API Voucher JS. Il est valable 7 200 secondes et est obtenu via access_token. Note aux développeurs : 1.Cet api_ticket utilisé pour la signature de l'interface des cartes et des coupons est différent du jsapi_ticket utilisé pour injecter la configuration de vérification des autorisations via l'interface de configuration à l'étape 3. 2. Étant donné que le nombre d'appels API pour obtenir api_ticket est très limité, l'actualisation fréquente d'api_ticket entraînera un nombre limité d'appels API et affectera leur propre entreprise. Les développeurs doivent stocker et mettre à jour api_ticket dans leurs propres services. Description de la demande d'appel d'interface Méthode de requête http : GET https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type= wx_card Description du paramètre Données de retour Exemple de données : { "errcode":0, "errmsg": "ok", "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKdvsdshFKA", "expires_in":7200 } Tirez la liste des cartes et des coupons applicables et obtenez les informations de sélection de l'utilisateur wx.chooseCard({ shopId: '', // Store Id cardType : '' , // Type de carte et de coupon cardId: '', // Id de la carte et du coupon horodatage: 0, // Horodatage de signature de la carte et du coupon nonceStr: '', / / La signature de la carte et du coupon est aléatoire String signType: '', // Méthode de signature, par défaut 'SHA1' cardSign: '', // Signature de la carte succès : fonction (res) { var cardList = res.cardList; // Informations sur la liste des cartes sélectionnées par l'utilisateur } }); Attention particulière aux développeurs : des erreurs de signature entraîneront un vide anormal de la liste des cartes d'extraction. Veuillez vérifier attentivement la validité des paramètres impliqués dans la signature. Rappel spécial La liste déroulante est uniquement liée aux coupons locaux de l'utilisateur. Il existe généralement trois situations où la liste déroulante est anormalement vide : une erreur de signature, un horodatage invalide et un mécanisme de filtrage incorrect. . Les développeurs sont invités à étudier les raisons du positionnement dans l'ordre. Interface pour ajouter des cartes par lots wx.addCard({ ) cardList : [{ ] cardI d : '', cardExt : '' }); Il est à noter que le paramètre card_ext ici doit être cohérent avec les paramètres participant à la signature, et que le format est une chaîne au lieu d'un objet, sinon une erreur de signature sera signalée. Il est recommandé aux développeurs de ne pas ajouter plus de 5 cartes à la fois, sinon ils rencontreront une erreur de délai d'attente. Affichez l'interface de la carte et du coupon dans le package de cartes WeChat wx.openCard({ ) cardList : [{ carte Identifiant : ', code : '' }]// Liste des cartes et coupons à ouvrir }); Initier une demande de paiement WeChat wx.chooseWXPay({ horodatage : 0, // Horodatage de la signature du paiement, Remarque que tous les champs d'horodatage utilisés dans WeChat jssdk sont en minuscules. Cependant, le nom du champ timeStamp utilisé par la dernière version de l'arrière-plan de paiement pour générer des signatures doit mettre en majuscule le caractère S nonceStr: '', // Chaîne aléatoire de signature de paiement, pas plus de 32 bits package : '', // La valeur du paramètre prepay_id renvoyée par l'interface de paiement unifiée, le format de soumission est : prepay_id=***) signType : '', // Méthode de signature, la valeur par défaut est 'SHA1', vous devez saisir 'MD5' pour utiliser la nouvelle version du paiement paySign : '', // Signature du paiement succès : fonction (res) { }} ); Remarques : prepay_id est obtenu via l'interface de commande unifiée WeChat Pay. paySign adopte la méthode de génération de signature unifiée WeChat Pay Sign. Notez que l'appId ici doit également participer à la signature. qui est le dernier paramètre impliqué dans la signature. Il y a appId, timeStamp, nonceStr, package, signType. Documentation de développement des paiements WeChat : https://pay.weixin.qq.com/wiki/doc/api/index.html Annexe 1-JS-SDK, algorithme de signature d'autorisation d'utilisation jsapi_ticket Vous devez d'abord comprendre jsapi_ticket avant de générer une signature. jsapi_ticket est un ticket temporaire utilisé par les comptes publics pour appeler l'interface WeChat JS. Dans des circonstances normales, la période de validité du jsapi_ticket est de 7 200 secondes, obtenue via access_token. Étant donné que le nombre d'appels API pour obtenir jsapi_ticket est très limité, l'actualisation fréquente de jsapi_ticket entraînera un nombre limité d'appels API et affectera votre propre entreprise. Les développeurs doivent mettre en cache jsapi_ticket globalement dans leurs propres services. 1. Référez-vous au document suivant pour obtenir access_token (la validité est de 7200 secondes, les développeurs doivent mettre en cache access_token globalement dans leurs propres services) : ../15/54ce45d8d30b6bf6758f68d2e95bc627.html 2. la première étape Utilisez http GET pour demander jsapi_ticket (durée de validité 7200 secondes, les développeurs doivent mettre en cache jsapi_ticket globalement dans leurs propres services) : https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token= Access_token & type = jsapi renvoie avec succès le JSON suivant: { "errcode": 0, "errmsg": "ok", "ticket": " bxL dikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA ", "expires_in":7200 } Après avoir obtenu jsapi_ticket, vous pouvez générer une signature pour la vérification des autorisations JS-SDK. Algorithme de signature Les règles de génération de signature sont les suivantes : les champs impliqués dans la signature incluent noncestr (chaîne aléatoire), jsapi_ticket valide, timestamp (horodatage), url (URL de la page Web actuelle , Non Contient # et ses parties suivantes ). Après avoir trié tous les paramètres à signer selon le code ASCII du nom du champ de petit à grand (ordre lexicographique), utilisez le format de paire clé-valeur d'URL (c'est-à-dire clé1=valeur1&clé2=valeur2...) pour les concaténer en un chaîne chaîne1. Il convient de noter ici que tous les noms de paramètres sont en minuscules. Effectuez le cryptage sha1 sur string1, utilisez les valeurs d'origine pour les noms de champs et les valeurs de champ et n'effectuez pas d'échappement d'URL. est signature=sha1(string1). Exemple : noncestr=Wm3WZYTPz0wzccnW jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhT fl2fzFy1AOcHKP7qg timestamp=1414587457 url=http://mp.weixin.qq.com?params=value Etape 1. Trier tous les paramètres à signer selon le code ASCII du nom du champ du petit au grand (ordre lexicographique ), et utilisez l'URL. Le format de la paire clé-valeur (c'est-à-dire key1=value1&key2=value2...) est fusionné en une chaîne string1 : 3-Sl-HhTdfl2fzFy1AO cHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp= 1414587457&url=http://mp.weixin.qq.com?params =value Étape 2. Signez la chaîne 1 avec sha1 et obtenez la signature : 0f9de62fce790f9a083d5c99e95740ceb90c27ed Notes 1. Le noncestr et l'horodatage utilisés pour la signature doivent être les mêmes que le nonceStr et l'horodatage dans wx.config. 2. L'URL utilisée pour la signature doit être l'URL complète de la page appelant l'interface JS. 3.Pour des raisons de sécurité, les développeurs doivent implémenter la logique de signature côté serveur. Si des erreurs telles qu'une signature invalide se produisent, veuillez vous référer à l'annexe 5 pour les erreurs courantes et les solutions. Annexe 2 - Liste de toutes les interfaces JS Interface version 1.0.0 onMenuShareTimeline onMenuShareAppMessage onMenuShareQQ onMenuShareWeibo onMenuShareQZone startRecord stopRecord onVoiceRecordEnd playVoice pauseVoice stopVoice onVoicePlayEnd uploadVoice downloadVoice chooseImage previewImage uploadImage downloadImage translateVoice getNetworkType openLocation getLocation hideOptionMenu showOptionMenu hideMenuItems showMenuItems hideAllNonBaseMenuItem showAllNonBaseMenuItem closeWindow scanQRCode choisissez WXPay openProductSpecificView addCard choisissez la carte openCard Mode jour : "menuItem:dayMode"Mode nuit : "menuItem:nightMode" Actualisation : "menuItem:refresh" Voir le compte officiel (ajouté) : "menuItem:profile" Voir le compte officiel (non ajouté) : "menuItem:addContact" Catégorie de communication Envoyer à des amis : "menuItem:share:appMessage" Partager avec Moments : "menuItem:share:timeline" Partager sur QQ : "menuItem:share:qq" Partager sur Weibo : "menuItem:share :weiboApp" Collecter : "menuItem:favorite" Partager sur FB : "menuItem:share:facebook" Partager sur l'espace QQ/menuItem:share:QZone Catégorie de protection Modifier la balise : "menuItem:editTag" Supprimer : "menuItem:delete" Copier le lien : "menuItem:copyUrl" Page originale : "menuItem:originPage" Mode de lecture : "menuItem:readMode" Ouvrir dans le navigateur QQ : "menuItem:openWithQQBrowser" Ouvrir dans Safari : "menuItem:openWithSafari" Mail : "menuItem:share :email" Quelques comptes publics spéciaux : "menuItem:share:brand" Annexe 4 - Champs d'extension de carte et de coupon et algorithme de génération de signature Utilisateurs de JSSDK, veuillez lire ici, Les utilisateurs de JSAPI peuvent ignorer Les signatures de cartes et de coupons et les signatures JSSDK sont complètement indépendantes. Les algorithmes et les significations des deux sont complètement différents. La signature de JSSDK est une couche d'authentification requise pour utiliser toutes les interfaces JS. Elle sert à identifier l'identité de l'appelant et n'a rien à voir avec le coupon lui-même. Deuxièmement, pour la signature des cartes et des coupons, un ensemble de protocoles de signature indépendants a été conçu en tenant compte de l'évolutivité du protocole et de la simple prévention de la falsification des données. De plus, pour des raisons historiques, l'interface JS de la carte et du coupon est apparue avant le JSSDK. Le JSAPI à cette époque n'avait pas de système d'authentification, donc les informations d'identité appsecret/api_ticket ont également été ajoutées à la signature de la carte et. coupon. J'espère que les développeurs comprendront. Carte et coupon api_ticket Carte et coupon api_ticket est un ticket temporaire utilisé pour appeler les interfaces liées aux cartes et aux coupons. Il est valable 7 200 secondes et est obtenu via access_token. Faites attention ici pour le distinguer de jsapi_ticket. Étant donné que le nombre d'appels API pour obtenir la carte et le ticket api_ticket est très limité, l'actualisation fréquente de la carte et du ticket api_ticket entraînera un nombre limité d'appels API et affectera leur propre entreprise. Les développeurs doivent mettre en cache la carte et le ticket api_ticket globalement dans leur propre entreprise. prestations . 1. Référez-vous au document suivant pour obtenir access_token (durée de validité 7200 secondes, les développeurs doivent mettre en cache access_token globalement dans leurs propres services) : ../15/54ce45d8d30b6bf6758f68d2e95bc627.html 2. Utilisez le access_token obtenu lors de la première étape pour demander la carte et le coupon api_ticket en utilisant la méthode http GET (la période de validité est de 7200 secondes, les développeurs doivent mettre en cache la carte et le coupon api_ticket globalement dans leurs propres services) : https:/ /api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card Champ d'extension de carte et de coupon cardExt description cardExt lui-même est une chaîne JSON , ce que fait le commerçant. Les informations uniques attribuées à chaque carte et coupon, incluant les champs suivants : Instructions de signature 1. Modifiez api_ticket (Remarque spéciale : api_ticket est plus sécurisé que appsecret et est compatible avec appsecret utilisé dans les anciennes versions de documents comme identifiants de signature.), horodatage, card_id, code, Les valeurs de openid et nonce_str effectuent un tri lexicographique des chaînes. 2. Concaténez toutes les chaînes de paramètres en une seule chaîne et effectuez le cryptage sha1 pour obtenir la signature. 3. Les champs timestamp et nonce dans la signature doivent être cohérents avec les champs timestamp et nonce_str dans card_ext. 4.code=jonyqin_1434008071, timestamp=1404896688, card_id=pjZ8Yt1XGILfi-FUsewpnnolGgZk, api_ticket=ojZ8YtyVyr30HheH3CM73y7h4jJE, nonce_str=jonyqinsign ature= sha1(1404896688jonyqinjonyqin_1434008071ojZ8YtyVyr30HheH3CM73y7h4jJE pjZ8Yt1XGILfi-FUsewpnnolGgZk)=6b81fbf6af16e856334153b39737556063c82689. Il est fortement recommandé aux développeurs d'utiliser le SDK de l'outil de signature dans le package d'informations sur la carte et le coupon pour signer ou d'utiliser l'outil de débogage pour la vérification : http://mp.weixin.qq.com/debug/cgi -Bin / Sandbox? T = CARTSIGN instructions pour Cardsign 1. documents) Utilisez le appsecret comme certificat de signature.), app_id, location_id, times_tamp, nonce_str, card_id, card_type valeurs de valeur pour trier les chaînes par ordre lexicographique. 2. Répartissez toutes les chaînes de paramètres en une seule chaîne et effectuez le cryptage sha1 pour obtenir cardSign. Annexe 5 - Erreurs courantes et solutions Lors de l'appel de l'interface de configuration, transmettez le paramètre debug: true pour activer le mode débogage, et la page alertera un message d'erreur. Voici les erreurs et solutions courantes : 1.domaine d'URL invalide Le nom de domaine de la page actuelle n'est pas lié à l'appid utilisé. Veuillez vous assurer de remplir correctement le nom de domaine lié Seulement 80 (http) et. 443 (https) sont pris en charge, il n'est donc pas nécessaire de renseigner le numéro de port (un appid peut être lié à trois noms de domaine valides). 2. erreur de signature invalide. Il est recommandé de vérifier dans l'ordre suivant : 1. Confirmez que l'algorithme de signature est correct et vous pouvez utiliser le http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t =outil de page jsapisign pour la vérification. 2. Confirmez que le nonceStr (S majuscule standard en cas de chameau en js) et l'horodatage dans la configuration sont cohérents avec le noncestr et l'horodatage correspondants utilisés dans la signature. 3. Confirmez que l'url est l'url complète de la page (veuillez confirmer sur l'alerte de la page actuelle (location.href.split('#')[0])), y compris le 'http(s):// 'partie, et '? 'La partie du paramètre GET après', mais n'inclut pas la partie après le hachage '#'. 4. Confirmez que l'appid dans la configuration est cohérent avec l'appid utilisé pour obtenir jsapi_ticket. 5. Assurez-vous de mettre en cache access_token et jsapi_ticket. 6.Assurez-vous que l'URL que vous obtenez pour la signature est obtenue dynamiquement. Pour les pages dynamiques, veuillez vous référer à l'implémentation PHP dans l'exemple de code. S'il s'agit d'une page HTML statique, l'URL est transmise au backend pour signature via ajax sur le front-end. Le front-end doit utiliser js pour obtenir le lien de la page actuelle, à l'exception de la partie de hachage '#' (peut être obtenu par location.href.split('#')[0], et encodeURIComponent est requis), car une fois la page partagée, le client WeChat ajoutera d'autres paramètres à la fin de votre lien si le lien actuel n'est pas obtenu. dynamiquement, la signature de la page partagée échouera. 3.la valeur d'autorisation est vérifiée hors ligne. Cette erreur est due au fait que la configuration n'est pas exécutée correctement ou que le JSAPI appelé n'est pas transmis dans le paramètre jsApiList de la configuration. Il est recommandé de vérifier dans l'ordre suivant : 1. Confirmez que la configuration est passée correctement. 2. Si JSAPI est appelé au chargement de la page, il doit être écrit dans le rappel de wx.ready. 3. Confirmez que le paramètre jsApiList de config contient ce JSAPI. 4.permission refusée Le compte officiel n'a pas l'autorisation d'utiliser cette JSAPI, ou la JSAPI appelée n'est pas passée dans le paramètre jsApiList de config (certaines interfaces nécessitent une authentification avant de pouvoir être utilisées). 5. la fonction n'existe pas La version actuelle du client ne prend pas en charge cette interface, veuillez passer à la nouvelle version pour en faire l'expérience. 6. Pourquoi config: ok dans la version 6.0.1, mais pas ok après la version 6.0.2 (car il n'y a pas de vérification des autorisations avant la version 6.0.2, donc la configuration est ok, mais cela ne veut pas dire que dans votre configuration La signature est OK, veuillez vérifier si la signature correcte est générée dans la version 6.0.2 pour vous assurer que la configuration est OK dans les versions supérieures) 7. Le partage n'est pas possible sur iOS et Android (veuillez confirmer que le compte officiel a été authentifié. Seuls les comptes officiels certifiés ont l'autorisation de partager les interfaces associées. S'il est bien authentifié, vérifiez si l'interface d'écoute est déclenchée dans le Fonction de rappel wx.ready. ) 8. Une fois le service en ligne, jsapi_ticket ne peut pas être obtenu. Il n'y a aucun problème lors du test par moi-même. (Parce que access_token et jsapi_ticket doivent être mis en cache sur votre propre serveur, sinon la limite de fréquence sera déclenchée après la mise en ligne. Veuillez vous assurer de mettre en cache le jeton et le ticket pour réduire 2 requêtes du serveur. Cela évitera non seulement de déclencher la limite de fréquence, mais accélérez également vos propres services. Actuellement, 10 000 acquisitions sont fournies pour faciliter les tests. Une fois le seuil dépassé, le service ne sera plus disponible Veuillez vous assurer que access_token et jsapi_ticket sont mis en cache globalement avant la mise en ligne du service. . Les deux sont valables 7200 secondes, sinon ils se déclencheront une fois en ligne. Limitations de fréquence, le service ne sera plus disponible ). 9. Comment télécharger plusieurs images avec uploadImage (actuellement, ne prend en charge que le téléchargement d'une image à la fois. Pour plusieurs images, vous devez attendre que l'image précédente soit téléchargée avant d'appeler cette interface) 10. Il n'est pas possible de télécharger des images sélectionnées localement (l'interface ChooseImage elle-même prend en charge l'aperçu, aucune prise en charge supplémentaire n'est nécessaire) 11. Accédez au lien B via le lien a (par exemple, autorisez d'abord la connexion via WeChat), la signature invalide échoue (le lien pour générer la signature en arrière-plan est le lien actuel utilisant jssdk, qui est le lien b après le saut , veuillez ne pas l'utiliser) Le lien autorisé pour la connexion WeChat est utilisé pour le calcul de la signature. L'URL signée en arrière-plan doit être l'URL complète de la page actuelle de jssdk moins la partie '#') 12. Une erreur d'échec se produit (cela est dû aux paramètres de configuration incomplets transmis). Parce que, assurez-vous de transmettre l'appId, l'horodatage, la nonceStr, la signature et la jsApiList corrects à utiliser) 13. téléchargé par jsapi sur WeChat sur votre propre serveur (veuillez vous référer aux interfaces uploadVoice et uploadImage dans les notes du document) 14 Android est téléchargé sur le serveur WeChat via jssdk, et un tiers le télécharge depuis WeChat sur le sien. Du bruit se produira (l'équipe WeChat a résolu ce problème et le backend a été optimisé et en ligne maintenant) 15. Liez le nom de domaine parent et vérifiez si ses noms de sous-domaines sont également disponibles (oui, les noms de sous-domaines légaux le sont. entièrement pris en charge après avoir lié le nom de domaine parent) 16. Dans la version iOS WeChat 6.1, les liens externes des images partagées ne sont pas affichés. Seules les images liées dans la page du compte officiel ou les images du serveur WeChat peuvent être affichées dans la version 6.2 17. Avez-vous besoin de mettre à jour le lien ? Rendre votre propre version compatible (jssdk est compatible avec les versions inférieures et ne nécessite pas de travail supplémentaire par des tiers, mais certaines interfaces sont nouvellement introduites dans la version 6.0.2 et ne peuvent être appelées que par la nouvelle version) 18. Le public La signature de paiement est invalide et la transaction ne peut pas être initiée (veuillez vous assurer que le jweixin.js que vous utilisez est la version officielle en ligne. Cela peut non seulement réduire le trafic des utilisateurs, mais corrigez également certains bugs et copiez-le sur un serveur tiers pour l'utiliser. Officiel Nous ne fournirons aucune garantie pour les problèmes qui pourraient survenir) 19. Actuellement, le client Android WeChat ne prend pas en charge les nouvelles fonctionnalités H5 de pushState. , donc l'utilisation de pushState pour implémenter la page de l'application Web entraînera l'échec de la signature. Ce problème a été corrigé dans Android 6.2. Corrigé au milieu 20. Parfois, Android n'exécute pas uploadImage dans le rappel de ChooseImage. résoudra ce problème. Si vous avez besoin de prendre en charge les versions inférieures, vous pouvez mettre l'appel uploadImage dans setTimeout et le retarder de 100 ms 21 L'erreur d'abonnement .require indique que vous n'êtes pas abonné au compte de test. n'apparaîtra que pour les comptes de test 22. Les coordonnées renvoyées par getLocation sont biaisées dans openLocation, car getLocation renvoie les coordonnées GPS, et la carte Tencent ouverte par openLocation est les coordonnées de Mars, ce qui nécessite qu'un tiers se convertisse. Depuis la version 6.2, l'acquisition directe des coordonnées de Mars a été effectuée. été pris en charge 23. Afficher le compte officiel (non ajouté) : "menuItem:addContact" n'est pas affiché Actuellement, seuls les liens diffusés à partir du compte officiel peuvent être affichés. La source doit être le compte officiel . 24. La synchronisation des données de dépôt ICP est retardée d'un jour. Veuillez donc vous lier le deuxième jour Annexe 6-Page DEMO et exemple de code Page DEMO : http://demo.open.weixin qq.com/jssdk Exemple de code : http://demo.open.weixin.qq.com/jssdk/sample.zip Remarque : le lien contient php, java, nodejs et python L'exemple de code est destiné à la référence des tiers. N'oubliez pas de mettre en cache le jeton d'accès et le jsapi_ticket obtenus pour vous assurer que la limite de fréquence n'est pas déclenchée. Annexe 7 - Commentaires sur les problèmes Adresse e-mail : weixin-open@qq.com Objet de l'e-mail : [Commentaires WeChat JS-SDK] Description du contenu de l'e-mail : Décrivez le problème dans un langage concis et expliquez clairement le scénario dans lequel le problème est rencontré. Des captures d'écran peuvent être jointes, l'équipe WeChat Votre. les commentaires seront traités dans les plus brefs délais. Paramètre Est-ce nécessaire Description access_token est Identifiants d'appel d'interface Nom du paramètre Description errcode Code d'erreur errmsg message d'erreur billet api_ticket, le certificat requis pour la signature dans l'interface carte et coupon expires_in heure de validité Nom du paramètre Obligatoire type Exemples de valeurs Description shopId Non string(24) 1234 Identifiant du magasin. shopID est utilisé pour filtrer et extraire la liste de coupons avec la location_list spécifiée (shopID), ce qui n'est pas obligatoire. cardType No string(24) GROUPON Card type, utilisé pour afficher la liste des cartes du type de carte spécifié. Lorsque cardType est vide, une liste de toutes les cartes et coupons sera affichée par défaut, ce qui n'est pas obligatoire. cardId No string(32) p1Pj9jr90_SQRaVqYI239Ka1erk ID de carte, utilisé pour afficher la liste des cartes du cardId spécifié When cardId When. vide, la liste de toutes les cartes et coupons sera affichée par défaut, ce qui n'est pas obligatoire. timestamp est la string(32) 14300000000 timestamp. nonceStr est une string(32) sduhi123 chaîne aléatoire. signType est string(32) SHA1 supporte actuellement uniquement SHA1 cardSign est string(64) abcsdijcous123 Signé. Champ Est-ce obligatoire ? S'il faut participer à la signature Instructions code Non est le code promo spécifié par , qui ne peut être réclamé qu'une seule fois. Les cartes et les coupons en mode code personnalisé doivent être remplis, mais les cartes et les coupons en modes code non personnalisé et code pré-enregistré n'ont pas besoin d'être remplis. Pour plus de détails, voir : S'il faut personnaliser le code openid Non est l'openid du destinataire désigné, et seul cet utilisateur peut le recevoir. Les cartes et coupons dont le champ bind_openid est vrai doivent être renseignés ; les champs bind_openid sont faux et n'ont pas besoin d'être renseignés. timestamp est est timestamp, le commerçant génère le nombre de secondes de 00:00:00 le 1er janvier 1970 à aujourd'hui, qui est l'heure actuelle , et enfin Il doit être converti sous forme de chaîne ; il est généré par le commerçant et transmis. Les horodatages des différentes demandes d'ajout doivent être générés dynamiquement. S'ils sont répétés, la collecte échouera ! . nonce_str No est une chaîne aléatoire définie par le développeur, sécurité renforcée (si elle n'est pas renseignée, la demande peut être rejouée). Chaîne aléatoire, ne dépassant pas 32 caractères. Il est recommandé d'utiliser des lettres et des chiffres majuscules et minuscules pour les différentes demandes d'ajout qui doivent être générées dynamiquement. Si elles sont répétées, la collection échouera. fixed_begintimestamp Non Non L'heure à laquelle le coupon est reçu est un horodatage à 10 chiffres. Il n'est utilisé que lorsque le type de période de validité de la carte et du coupon est DATE_TYPE_FIX_TERM. Il identifie la durée de validité réelle de la carte et du coupon et est utilisé pour résoudre le problème de désynchronisation entre l'heure de début et l'heure de début. l'heure de collecte dans le système marchand. outer_id No No Paramètre de canal de réception, utilisé pour identifier la valeur de canal pour cette collection. signature est une signature - Le commerçant signe les paramètres dans la liste d'interface de la manière spécifiée. schéma de signature ; par le commerçant Signez-le selon les spécifications puis transmettez-le.