Documentation WeChat JS-SDK


Documentation WeChat JS-SDK

1474938226449452.jpg

Aperçu

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 JS

Introduisez 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

Interface de base

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.

Interface de partage

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

                                     

获取“分享到QQ空间”按钮点击状态及自定义分享内容接口

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 d'image

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 .

}

});

Interface d'aperçu de 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

}

});

Interface audio

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

}

});

Play voice interface

wx.playVoice({

) localId: '' // L'ID local de l'audio à lire est obtenu à partir de l'interface stopRecord

}) ;

Interface de lecture en pause

wx.pauseVoice({

) localId: '' // L'ID local de l'audio qui doit être mis en pause est obtenu par l'interface stopRecord

});

Interface d'arrêt de lecture

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

}

});

Upload voice interface

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 intelligente

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

}

});

Informations sur l'appareil

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

}

});

Emplacement géographique

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

}

});

Secouez les environs

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 ({

complete:function(res){

//Fermez la fonction de rappel une fois la recherche terminée

}});

É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

Fonctionnement de l'interface

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();

Scanner avec WeChat

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

}

});

Boutique WeChat

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

});

WeChat Cards and Tickets

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.

Obtenir api_ticket

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

Paramètre
Est-ce nécessaireDescription
access_token est Identifiants d'appel d'interface

Données de retour

Exemple de données :

{

"errcode":0,

"errmsg": "ok",

"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKdvsdshFKA",

"expires_in":7200

}

Nom du paramètreDescription
errcodeCode d'erreur
errmsgmessage d'erreur
billetapi_ticket, le certificat requis pour la signature dans l'interface carte et coupon
expires_inheure de validité

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

}

});

Nom du paramètreObligatoiretype Exemples de valeursDescription
shopIdNonstring(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.
cardTypeNostring(24)GROUPONCard 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.
cardIdNostring(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)sduhi123chaîne aléatoire.
signType est string(32)SHA1supporte actuellement uniquement SHA1
cardSign est string(64)abcsdijcous123Signé.

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

});

WeChat Pay

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) {

的 // La fonction de rappel après le paiement est réussie

}}

);

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

" menuItem:setFont"

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 :

ChampEst-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_strNo 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_begintimestampNonNonL'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_idNoNoParamè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.

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

1475985030261979.jpg

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.