1: Early WeChat Pays Literacy Knowledge
La condition préalable est qu'il existe déjà un compte officiel qui a postulé pour la fonction de paiement WeChat, puis nous devons obtenir le compte officiel AppID et WeChat Merchant. Cela peut être trouvé sur le compte officiel de WeChat et la plate-forme marchande de paiement WeChat respectivement. En fait, après avoir réussi à demander la fonction de paiement, WeChat vous transmettra le courrier par e-mail. Avec ces informations, nous pouvons aller sur la page d'assistance du service de paiement WeChat: https://pay.weixin.qq.com/service_provider/index.shtml
Ouvrez cette page et cliquez sur le lien [document de développement] dans le coin supérieur droit pour entrer la page de description du document API, qui ressemble à ce qui suit
Choisissez le cercle rouge pour scanner le code à payer, ce qui signifie que nous devons faire la méthode d'accès. Déplacez la souris vers ce qui précède et vous invitez à afficher le document de développement. Si vous ne savez pas comment voir cela, vous pouvez prendre une douche et vous coucher. Vous n'êtes vraiment pas adapté à un programmeur. L'adresse est la suivante:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 Vous verrez après l'ouverture dans votre navigateur
Le contenu sur lequel nous nous concentrons et lisons est déjà marqué d'une ellipse rouge. Tout d'abord, lisez les spécifications du protocole dans [Règles d'interface]. Je plaisante, si vous ne lisez pas ceci, vous voulez effectuer un paiement WeChat. C'est comme si vous vouliez chercher des filles. Vous devez d'abord collecter des informations de base de base et comprendre les caractéristiques de l'autre partie, sinon comment pouvez-vous communiquer ci-dessous. Il s'avère que seuls les programmeurs qui peuvent ramasser des filles sont de bons vendeurs. Après avoir quitté le sujet, nous examinerons les cas et les spécifications dans [Introduction de la scène]. Regardez simplement le logo de WeChat Pay. Il s'agit enfin de le mettre sur notre propre page Web de paiement QR Code, qui semble plus professionnel. Ensuite, concentrez-vous sur [mode 2]
Ici, nous allons utiliser la méthode Mode 2 pour réaliser la fonction de paiement du code de balayage de page PC.
L'explication officielle du mode 2 par WeChat est la suivante: "Le système de backend marchand appelle d'abord l'interface unique unifiée de WeChat Pay, le système de backend WeChat renvoie la valeur Code_Url, et l'utilisateur scanne le client de code de code et iniiné le paiement. paiement." Si vous comprenez, nous devons d'abord appeler WeChat pour fournir une interface unique unifiée et obtenir une information clé Code_Url (quant à ce qui est ce code_url, je ne sais pas), puis nous générons un code QR via notre propre programme. J'utilise ici la bibliothèque ZXing de Google. Affichez ensuite simplement le code QR sur votre page Web PC. De cette façon, l'utilisateur du terminal paiera en numérisant le code et le paiement sera terminé. Vous devez être très excité de voir cela. Vous constatez que le paiement WeChat est si simple. Il y a une autre chose que nous ne savons pas encore. Les clients savent qu'ils ont payé, mais notre côté serveur ne sait pas encore. Avec le QI des développeurs WeChat, ils ont réfléchi à ce problème pendant longtemps. Ainsi, lorsque vous appelez l'interface unique unifiée, il existe un paramètre requis qui est l'URL de rappel. Autrement dit, si le client paie avec succès, WeChat soumettra certaines données à notre propre serveur via cette URL, puis nous analysons les données en arrière-plan pour terminer nos propres opérations. Ce n'est qu'alors que nous pouvons savoir si le client a vraiment payé via WeChat. De cette façon, l'ensemble du processus est terminé, et c'est le modèle 2. WeChat utilise un diagramme de synchronisation pour représenter ce processus.
Il est compliqué à exprimer et semble difficile. Pour résumer, ce que notre serveur doit faire est le suivant:
1. Passez les paramètres corrects (bien sûr, notre URL de rappel) et la vérification de signature via une interface unique unifiée, et obtenez les données correspondantes de Code_url à partir des données de retour.
2. Sur la base des données Code_url, nous générons une image de code QR et les affichons sur la page Web du navigateur.
3. Ajoutez notre propre traitement de la logique métier dans l'URL du rappel.
L'alphabétisation est terminée maintenant, et vous savez enfin quel type de processus à payer en scannant le code. Jetons un coup d'œil à son utilisation pertinente de l'API et faisons un bon travail de traitement à chaque étape.
Deux: processus de développement
Avant de développer le code, veuillez d'abord préparer quelques choses.
1. Ajouter la dépendance Maven de Zxing
2. Ajouter la dépendance maven de JDom
3. Téléchargez le programme de démonstration du SDK de la version Java, l'adresse est ici
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
Nous avons besoin de md5util.java et xmlutil.java deux fichiers
4. Nous utilisons la version 4.5.1 de HttpClient, n'oubliez pas d'ajouter des dépendances Maven
Une fois les préparatifs ci-dessus terminés, continuez à lire:
Tout d'abord, nous devons appeler l'interface unique unifiée de WeChat. Lorsque nous cliquons sur le single unifié dans [liste API], nous verrons une page comme celle-ci:
Prenant l'exemple de la situation réelle de mon appel, les paramètres suivants sont nécessaires. Pour la commodité de tout le monde, je l'ai transformé en un objet Pojo. Le code est le suivant:
classe publique UnifiedOrderDto implémente WeixinConstants {private String Appid; Private String Body; Private String Device_info; private String mch_id; String privé nonce_str; chaîne privée notify_url; private String OpenID; private String Out_Trade_No; String privé SPBill_create_ip; Private Int NoryDes {this.appid = appid; this.mch_id = wxpaymentAccount; this.device_info = device_info_web; this.notify_url = callback_url; this.trade_type = Trade_Type_Native;} public String getAppid () {return appid;} public Void setAppid (String appid) {thisavi String getbody () {return body;} public void setbody (String body) {this.body = body;} public String getDevice_info () {return Device_info;} public void setDevice_info (String Device_info) {this.device_info = device_info;} public String GetMch_id () {return mch_id; setmch_id (String mch_id) {this.mch_id = mch_id;} public String getNonce_str () {return nonce_str;} public void setNonce_str (chaîne nonce_str) {this.Nonce_str = nonce_str;} public string getNotify_url () {return notify_url;} public Void setnofy notify_url) {this.notify_url = notify_url;} public String getOpenID () {return openId;} public void setopenid (string openId) {this.openID = openId;} public String setout_trade_no () {return Out_Trade_No;} public Void Setout_Trade_No (String Out_Trade_No) {this.out_trade_no = out_trade_no;} chaîne publique getSpbill_create_ip () {return spbill_create_ip;} public void SetSpbill_create_ip (String Spbill_create_ip) {this.spbill_create_ip = spbill_create_ip;} public intetToToL_fee {}} public intetoToL_fee {}} intimetofe_fee {}} intes Total_Fee;} public void Settotal_Fee (int total_fee) {this.total_fee = total_fee;} public String getTrade_type () {return prorade_type;} public void settrade_type (string prorad_type) {this.trade_type = prorade_type;} public String Getsign () {return Sign setSign (String Sign) {this.sign = Sign;} public String getProduct_id () {return product_id;} public void setProduct_id (String product_id) {this.product_id = product_id;} public String génératexmlcontent () {string xml = "<xml>" + "" + this.appid + " "" + "<device_info>WEB</device_info>" + "<mch_id>" + this.mch_id + "</mch_id>" + "<nonce_str>" + this.nonce_str + "</nonce_str>" +"<notify_url>" + this.notify_url + "</notify_url>" + "<out_trade_no>" + this.out_trade_no + "</ out_trade_no>" + "<produit_id>" + this.product_id + "</ product_id>" + "<spbill_create_ip>" + this.spbill_create_ip + "</ spbill_create_ip>" + "<total_fee>" + string.valuef (this.toal_fee) "</ total_fee>" + "<rated_type>" + this.trade_type + "</rated_type>" + "<sign>" + this.sign + "</ Sign>" + "</ xml>"; return xml;} public string wakingign () {string content = "appid =" + this.Appid + "& body =" + this.body + "& disque_ "& mch_id =" + this.mch_id + "& nonce_str =" + this.nonce_str + "? ify_url =" + this.notify_url + "& out_trade_no =" + this.out_trade_no + "& product_id =" + this.product_id + "& spbill_create_ip =" + this.spbill_create_ip + "& total_fee =" + string.valueof (this.total_fee) + "& troty_type =" + this.trade_type; contenu = contenu + "& key =" + weixinconstants.md5_api_key; string signature = weixinPaymentUtil.md5encode (contenu, "utf-18"); signature.touppercase ();}}L'explication de chaque variable de membre peut être trouvée dans la description de [interface unique unifiée].
Après cela, nous devons remplir le contenu que nous définissons, appelez l'interface pour obtenir les données de retour, obtenir les données Code_Url et générer une image bidimensionnelle en fonction de l'informatique, renvoyer l'adresse d'image à la page Web du PC, puis elle sera affichée. Ici, nous ferons une note spéciale que lorsque nous cliquerons sur le paiement de WeChat, nous appellerons notre propre contrôleur SpringMVC backend via la méthode AJAX, puis compléterons l'analyse d'interface unique unifiée de WeChat via HttpClient dans la méthode correspondante du contrôleur pour l'obtenir les données XML renvoyées par code_url, puis générer le code QR et le retourner à la page Front. Le code implémenté dans Controller est le suivant:
Map <string, object> result = new HashMap <String, object> (); UnifiedOrderDto dto = new UnifiedOrderDto (); if (Cash == null || "" .equal TotalFee); dto.setproduct_id (string.valueof (System.currentTimemillis ())); dto.setBody ("réparation"); dto.setNonce_str (string.valueof (System.NanoTime ())); Logininfo Logininfo = Notre Notre Notre-Forme Indicateur d'identification dto.setout_trade_no ("Votre numéro de commande + Informations clés, il est renvoyé après le rappel WeChat, vous pouvez vérifier"); dto.settotal_fee (totalfee); dto.setspbill_create_ip ("127.0.0.1"); // générer SignDto.setsign (dto.makesign (); dto.makesign ()); logger.info ("contenu xml:" + dto.generatexmlcontent ()); try {httpclient httpclient = httpclientbuilder.create (). build (); Httppost post = new httppost (weixinConstants.UnifiedOrder_Url); post.addheader ("contenu-type", "text / xml; charset = utf-8"); stridentity xmlentity = new stringtity (dto.generatexmlcont (), ContentType.Text_xml); post.SetEntity (xmlentity); httpResponse httpResponse = httpclient.execute (post); string réponsexml = entityUtils.tostring (httpResponse.gentity (), "utf-8"); Logger.info ("Response xml Code_url contentmap <string, string = ""> resultMap = (map <string, string = "">) xmlutil.doxmlparse (réponsexml); logger.info ("string code_url:" + resultmap.get ("code_url")); string codeurl = resultMap.get ("code_url"); ! "". Equals (CodeUrl)) {String ImageUrl = generateQrCode (codeUrl); result.put ("qRimage", imageUrl);} post.releaseconnection ();} catch (exception e) {e.printStackTrace ();} result.put ("Success", "1"); résultat; </ string,> </ string,> </ string, objet> </ string, objet>Le code qui génère le code QR est le suivant:
String private generateqrcode (String CodeUrl) {Fichier Folder = nouveau fichier (basepath + "qrcode"); if (! string Folller.exists ()) {Folller.mkDirs ();} string f_name = uuidutil.uuid () + ".png"; try {file f = new File (basepath + "qrcode", f_name); Fichier); fio = new FileOutputStream (f); MultiformatWriter MultiformatWriter = new MultiformatWriter (); map hins = new hashmap (); hints.put (encodeHintType.Caracter_set, "utf-8"); // Définit le type de codage de caractères BitMatrix bitmatrix = null; bitmatrix = multiformatwriter.encode (codeUrl, barcodeformat.qr_code, 300, 300, hints); bufferedImage image = toblufferedImage (bitmatrix); // output qr code image imageo.write (image, "png", fo); " f_name);} catch (exception e1) {e1.printStackTrace (); return null;}}À l'heure actuelle, après avoir numérisé le code QR WeChat sur le client, nous utiliserons le rappel pour créer l'URL et nous renvoyer les données. Nous terminerons notre propre traitement dans la méthode de rappel. Il est important de noter ici que votre interface de rappel doit être implémentée via la méthode HTTP Post, sinon les données XML ne seront pas acceptées. Le code du traitement du rappel est le suivant:
@Requestmapping (value = "/ your_callback_url", méthode = requestMethod.post) @ResponseBodyPublic void FinishPayment (httpservletRequest request, httpservletResponse réponse) {try {logger.info ("start to rappel à partir de weixin server:" + request.getRemotehost ()); new hashmap <string, string = ""> (); inputStream inputStream = request.getInputStream (); // lire le flux d'entrée saxbuilder saxbuilder = new saxbuilder (); document document = saxbuilder.build (inputStream); // gère l'élément root de l'élément root. root.getChildren (); iterator it = list.iterator (); while (it.hasnext ()) {élément e = (élément) it.next (); string k = e.getName (); string v = ""; list children = e.getChilder (); if (kilom Xmlutil.getchildRentext (enfants);} resultMap.put (k, v);} // Vérifiez la signature! ! ! / * String [] keys = resultMap.KeySet (). ToArray (new String [0]); arrays.sort (keys); String kvParams = ""; pour (int i = 0; i <keys.length; i ++) = "" {= "" if (keys [i] .equal if (i = "=" 0) = "" kvparams = "" + = "(keys [i]" "=" + resultMap.get (keys [i]));} else {kvParams + = ("&" = "" keys [i] = "" & key = "+ weixinconstants.md5_api_key; String md5essign = WeixinpaymentUtil.md5encode (esign, "utf-8"); = "" if (! Md5esign.equals (resultMap.get ("signe"))) = "" return; = ""} * = "" close stream = "" Free Resource = "String =" "strict." returncode = "resultmap.get (" return_code ");" OutTradeno); = "" Logger.info ("Total_Fee =" "NFEE); =" "Business Processing Process =" "if (" Success ".Equals (returnCode)) =" "toDo: =" "Votre =" "Business =" "process =" "add =" "ici =" " réponse.getwriter (). print (xmlutil.getReResultXml (resultmap.get ("return_code"), = "" resultMap.get ("return_code"))); = "" else = "" resultmap.get ("return_msg"))); = "" Catch (ioException = "" ioe) = "" "ioe.printStackTrace (); =" ioe) = "" "ioe.PrinttackTrace) (jDomexception = "" e1) = "" e1.printStackTrace (); = ""}N'oubliez pas d'utiliser les deux classes de XMLutil et MD5Util utilisées dans la version Java officielle de la démo WeChat. Le code de démonstration se trouve sur sa page de démonstration officielle. Les dépendances Maven pertinentes sont les suivantes:
<dependency> <proupId> jdom </rom grouped> jdom </refactive> <in version> 1.1 </-version> </pedidency> <dependency> <proupId> com.google.zxing </prôdId> Core </ artifactId> <version> 3.3.0 </-version> </pedidency>
Enfin, je devrais prêter une attention particulière à la signature. J'ai directement téléchargé la version Java du programme de démonstration du site Web officiel de WeChat pour obtenir la signature. Je vous suggère de faire de même, car c'est le meilleur choix pour vous assurer que la signature MD5 est cohérente. Pour l'algorithme spécifique pour la génération de signatures, vous pouvez afficher le document WECHAT officiel. Ici, nous vous recommandons fortement de vous expliquer l'API officielle. 90% des différents problèmes que vous rencontrez en développement sont parce que vous ne lisez pas les documents officiels, mais faites confiance au blog de quelqu'un! C'est le véritable but et le but de mon écriture cet article. Selon les documents officiels, je l'ai implémenté avec mon code Java. Scannez le code QR sur les pages Web WeChat PC et le paiement du paiement volera certainement dans votre application Web.
Ce qui précède est l'implémentation Java Springmvc de la page Web PC WeChat QR Code Paiement (version complète) introduite par l'éditeur. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!