Examinons d'abord l'effet des enveloppes rouges en espèces émises par le compte officiel:
Il est nécessaire d'appeler l'interface de la plate-forme marchande, et les règles de distribution de l'interface sont les suivantes:
1. Envoyer la limite de fréquence - par défaut 1800 / min
2. La limite supérieure du nombre d'envoi - calculée en fonction de la par défaut 1800 / min
3. Montant Limite supérieure - Selon l'ID de la scène entrante, la limite supérieure par défaut peut être définie et appliquée dans les paramètres du produit de la plate-forme marchande, avec un maximum de plus de 4 999 yuans par unité
4. Quelles autres restrictions sur la «quantité» existe-t-il? - Le nombre maximum de fois que l'utilisateur reçoit ce jour-là est de 10 par défaut
5. Si la quantité ne peut pas répondre à nos besoins, comment pouvons-nous augmenter chaque limite supérieure? - La limite maximale du montant et le nombre maximum de fois que l'utilisateur reçoit le même jour peut être réglé sur la plate-forme marchande
Remarque - Lorsque le montant de l'enveloppe rouge est supérieur à 200, le paramètre de demande SCÈNE_ID doit être passé et la description du paramètre est illustrée ci-dessous.
Remarque 2 - Selon les exigences réglementaires, deux conditions sont nécessaires pour utiliser des enveloppes rouges en espèces pour les comptes marchands nouvellement appliqués: 1. Le temps d'entrée dépasse 90 jours 2. Transactions normales continues pendant 30 jours.
Demande URL https://api.mch.weixin.qq.com/mmpaymkttransfers/sendRedPack
Si un certificat est requis est (voir le certificat marchand pour plus de détails)
Demande la méthode Post
Exemple de données de demande:
<xml> <sign> <! [cdata [e1ee61a91c8e90f299de6ae075d60a2d]]> </ signe> <mch_billno> <! [cdata [0010010404201411170 000046545]]> </mch_billno> <mch_id> <! [CDATA [888]]> </mch_id> <wxappid> <! [CDATA [WXCBDA96DE0B165486]]> </wxap pid> <end_name> <! [cdata [send_name]]> </end_name> <ge_openID> <! [cdata [onqojjmm1tad-3ropncn-yufa6ui]]> </ r e_openID> <total_amount> <! [CDATA [200]]> </stal_amount> <tacl_num> <! [CDATA [1]]> </stal_num> <Wishing> <! [CD ATA [Félicitations pour en devenir riche]]> </ Wishing> <Cesti client_ip> <! [CDATA [127.0.0.1]]> </ client_ip> <ct_name> <! [CDATA [Nouvelle année Red Envelope]> </ Act_Name> <Remark> <! [CDATA [Nouvelle année Red Red Red Enveloppe]]> </ remarque> <cèche_id> <! [CDATA [Product_2]]> </ scene_id> <consume_mch_id> <! [Cdata [10 000097]]> </ consume_mch_id> <NONCE_STR> <! [CDATA [50780E0CCA98C8C8E814883E5CAA672E]]> </ nonce_str> <risque_inf O> Posttime% 3D123123412% 26Clientversion% 3D234134% 26mobile% 3d122344545% 26DeviceId% 3DiOS </sisk_info> </xml>
L'interface nécessite l'appel au certificat de la plate-forme marchande et le certificat doit être téléchargé à partir de la plate-forme marchande:
Utilisez ensuite le certificat dans l'interface. Tout d'abord, nous créons une nouvelle classe Weixinsl
@Componentpublic class weixinsl {/ ** * Type de certificat * / @value ("$ {werchant.storekey}") String Store StoreKey; / ** * Path de fichier * / @Value ("$ {werchant.sslfile}") String privé sslfile; / ** * Numéro de marchand * / @Value ("$ {werchant.merkingNumber}") String privé MerchantNumber; public String getStoreKey () {return storekeKey; } public void setStoreKey (String StoreKey) {this.storeKey = storekeKey; } public String getSlFile () {return sslfile; } public void setsslfile (String sslfile) {this.sslfile = sslfile; } public String getMerchantNumber () {return MerkingNumber; } public void setMerchantNumber (String MerkingNumber) {this.merkingNumber = MerkingNumber; }}Encapsuler la classe httpclientsl pour implémenter la demande HTTPS pour ajouter un certificat:
@ComponentPublic Class httpClientSl {@autowired private weiXSSL WeiXSSL; // Demande le délai d'attente (millisecondes) 5 secondes Public static requestConfig requestConfig; // Délai de réponse (millisecondes) 60 secondes public statique int http_response_timeout = 60 * 1000; // Codage de caractères httpClient encoding de chaîne statique publique = "UTF-8"; public static requestConfig getRequestConfig () {return requestConfig.custom (). setConnectTimeout (5 * 1000) .setConnectionRequestTimeout (http_response_timeout) .build (); } public static void setRequestConfig (requestConfig requestConfig) {httpclientsl.requestConfig = requestConfig; } / ** * HTTPS Demande Certificat de contrefaçon * @return * / public ClosableHttpClient defaultSSlClient () {sslContext sslContext = null; try {new sslContextBuilder (). LoadTrustMaterial (null, new TrustStrategy () {@Override public boolean istruted (x509certificate [] chaîne, chaîne authtype) lève java.security.cert.certificateException {return false;}}); } catch (NosuchalgorithMexception | keyStoreException e) {e.printStackTrace (); } SSLConnectionSocketFactory Factory = new SSLConnectionSocketFactory (SSLContext); return httpclients.custom (). SetSSLSocketFactory (Factory) .Build (); } / ** * demande https pour ajouter un certificat * @return * / public clarteablehttpclient defaultSSlClientFile () {if (this.weixinsl == null) {return this.defaultsslclient (); } FileInputStream inputStream = null; Keystore keystore = null; essayez {// ssl type keystore = keystore.getInstance (weixSSL.getStoreKey ()); // ssl file inputStream = new FileInputStream (weixssl.getsslfile ()); // Définissez le mot de passe SSL Keystore.Load (InputStream, WeiXSSL.GetMerchantNumber (). ToCharArray ()); } catch (keyStoreException | NosuchalgorithMexception | CertificateException | ioException e1) {e1.printStackTrace (); } enfin {try {inputStream.close (); } catch (ioException e) {e.printStackTrace (); }} Sslcontext sslContext = null; essayez {sslContext = sslcontext.custom (). LoadKeyMaterial (keystore, weiXssl.getMerchantNumber (). ToCharArray ()). Build (); } catch (UncoverableKeyException | NosuchalgorithMException | KeyStoreException | KeyManagementException e) {e.printStackTrace (); } SSLConnectionSocketFactory Factory = new SSLConnectionSocketFactory (SSLContext, new String [] {"TLSV1"}, null, sslConnectionSocketFactory.Browser_Compatible_Hostname_Verifier); return httpclients.custom (). SetSSLSocketFactory (Factory) .Build (); } / ** * Encapsulez la méthode pour envoyer des demandes * @throws UnportEnCcodingException * / public String Send (String URL, String Data, CloseableHttpClient CloseableHttpClient) lève unportEncodingException {ClosableHttpClient client = CloseableHttpClient; HTTPPOST HTTPPOST = NOUVEAU HTTPPOST (URLDECODER.DECODE (URL, Encoding)); httppost.addheader ("connexion", "keep-alive"); httppost.addheader ("accepter", "* / *"); httppost.addheader ("contenu-type", "application / x-www-form-urlencoded; charset = utf-8"); httppost.addheader ("hôte", "api.mch.weixin.qq.com"); httppost.addheader ("x-requis avec", "xmlhttprequest"); httppost.addheader ("Cache-Control", "max-age = 0"); httppost.addheader ("user-agent", "Mozilla / 4.0 (compatible; MSIE 8.0; Windows NT 6.0)"); httppost.setConfig (this.getRequestConfig ()); // Définir le délai d'attente CloseableHttpResponse Response = null; // Mettez le paramètre dans Entity Entity = New Stronntity (données, encodage); entity.setContenCodcoding (codage); entity.setContentType ("application / xml"); httppost.sentity (entité); try {réponse = client.execute (httppost); if (réponse.getStatusline (). getStaturcode () == 200) {httpentity httpentity = (httpentity) réponse.getEntity (); if (réponse! = null) {return EntityUtils.toString (httpentity, codage); }}} catch (ioException e) {e.printStackTrace (); } return null; }} De cette façon, nous encapsulons une classe d'entité qui demande le certificat avec HTTPS, puis nous générons l'interface de l'enveloppe rouge WeChat demandée:
Signature du paramètre de https://api.mch.weixin.qq.com/mmpaymkttransfers/sendRedPack:
/ *** Red Envelope Paramètre Entity Class * @throws UnsupportEnCoDingException * / @ ComponentPublic class SendRedPack implémente Serializable {/ ** * * / private static final long SerialVersionUID = -1000489228099916099L; chaîne privée nonce_str; // chaîne aléatoire Signe de chaîne privée; // Signature String privé mch_billno; // Numéro de commande de commerçant String privé Send_name; // Nom de commerçant String privé Re_OPENID; // User compte privé INTTAL_AMOUNT; // UNITÉ DE PAYAGE: PRIVÉTÉ INTOLATIVE_ Enveloppe Blessing Private String client_ip; // Adresse IP String privé ACT_NAME; // Nom de l'activité Remarque privée; // Notes Public String GetNonce_Str () {return nonce_str; } public void setNonce_str (string nonce_str) {this.Nonce_str = nonce_str; } public String getSign () {return signe; } public void setSign (string signe) {this.sign = signe; } public String getmch_billno () {return mch_billno; } public void setmch_billno (String mch_billno) {this.mch_billno = mch_billno; } public String getmch_id () {return mch_id; } public void setmch_id (String mch_id) {this.mch_id = mch_id; } public String getWXAppid () {return wxappid; } public void setwxappid (string wxappid) {this.wxappid = wxappid; } public String getSEND_NAME () {return send_name; } public void setSend_name (String send_name) {this.send_name = send_name; } public String getRe_OpenID () {return re_openID; } public void setRe_OpenID (String re_openID) {this.re_openID = re_openID; } public int getTotal_amount () {return total_amount; } public void Settotal_amount (int total_amount) {this.total_amount = total_amount; } public int getTotal_num () {return total_num; } public void Settotal_num (int total_num) {this.total_num = total_num; } public String getWishing () {return wishing; } public void setWishing (String souhaitant) {this.wishing = souhait; } public String getClient_ip () {return client_ip; } public void setClient_ip (string client_ip) {this.client_ip = client_ip; } public String getact_name () {return Act_name; } public void setact_name (string act_name) {this.act_name = act_name; } public String getRemark () {return remarque; } public void setRemark (String Remark) {this.remark = remarque; }}Ensuite, le contrôleur qui envoie le paquet rouge:
/ ** * Contrôleur d'enveloppe rouge * @author zengliang * / @ contrôleur @ requestmapping (value = "/ redévelopesReceive") public class redevelopesReceiveController {// wechat identifiant unique @value ("$ {weixin.appid}") String privé appid; // WECKAT Developer Motway Identifier @Value ("$ {weixin.appSecret}") public String AppSret; @Autowired Private SendredPack SendredPack; @Autowired privé httpclientientsl httpclientientsl; / ** * Envoyer des paramètres XML * @Author Zengliang * / @ResponseBody @RequestMapping (value = "/ sendxml") public String sendxml (String openId, Long Redevelopes_id, String mch_billno) {redéveloppes redenve = redéveloppeService.Findone (Revelopes_id); Xmlutil xmlutil = new xmLutil (); SendRedPack.setact_name (revenne.getact_name ()); sendRedPack.setNonce_str (xmlutil.random ()); sendRedPack.Settre_OpenID (OpenID); sendRedPack.setClient_ip (revenne.getClient_ip ()); sendRedPack.setmch_billno (mch_billno); sendRedPack.setmch_id (revenne.getmch_id ()); String xx = revenve.getRemark (); sendRedPack.setRemark (stringUtils.isempty (xx) == false? xx: "vide"); SendRedPack.SetSend_Name (revenve.getSend_name ()); SendRedPack.setTotal_amount (revenve.getTotal_amount ()); sendRedPack.setTotal_num (revenve.getTotal_num ()); SendRedPack.SetWishing (revenne.getWishing ()); sendRedPack.setwxAppid (revenne.getwxappidxx ()); // Générer des paramètres de chaîne de signature = this.createSendRedPackordersign (SendRedPack, redenve.getStore_key ()); SendRedPack.SetSign (params); xmlutil.xstream (). alias ("xml", sendRedPack.getClass ()); // Extendez xstream pour prendre en charge la chaîne de bloc CDATA requestxml = xmlutil.xstream (). Toxml (SendRedPack); Résultat de la chaîne; essayez {result = httpclientessl.send ("https://api.mch.weixin.qq.com/mmpaymktransfers/sendRedpack", requestXml, httpclientesl.defaultSSlClientFile ()); System.out.println ("Valeur de retour réussie" + résultat); Résultat de retour; } catch (UnportEnCcodingException e) {e.printStackTrace (); } return null; } / ** * Générer la signature * @param redpack * @return * / public string CreateSenDredPackordersIgn (SendRedPack redPack, String StoreKey) {StringBuffer Sign = new StringBuffer (); Sign.APPEND ("ACT_NAME ="). APPEND (redpack.getact_name ()); Sign.APPEND ("& client_ip ="). APPEND (redpack.getClient_ip ()); Sign.APPEND ("& re_billno ="). APPEND (redpack.getmch_billno ()); Sign.APPEND ("& Remark ="). APPEND (redpack.getmch_id ()); Sign.APPEND ("& send_str ="). APPEND (redpack.getNonce_str ()); Sign.APPEND (redpack.getNonce_str ()); Sign.APPEND ("& re_openID ="). APPEND (redpack.getRe_OpenID ()); Sign.APPEND ("& Remark ="). APPEND (redpack.getRemark ()); Sign.APPEND ("& send_name ="). APPEND (redpack.getSend_name ()); Sign.APPEND ("& total_amount ="). APPEND (redpack.gettotal_amount ()); Sign.APPEND ("& total_num ="). APPEND (redpack.gettotal_num ()); Sign.APPEND ("& Wishing ="). APPEND (redpack.getWishing ()); Sign.APPEND ("& wxappid ="). APPEND (redpack.getwxappid ()); Sign.APPEND ("& key ="). APPEND (StoreKey); return digestutils.md5hex (Sign.ToString ()). ToupperCase (); }}Ensuite, nous devons utiliser une classe d'outils pour analyser XML pour analyser le XML renvoyé par WeChat pour analyser XML
/ ** * Analyse de la classe d'outils XML * @author zengliang * / @ ComponentPublic classe Xmlutil {/ ** * Analyse Xml renvoyé par WeChat * @param XML * @return * @throws exception * / @SuppressWarning = new HashMap <String, String> (); Document doc = null; essayez {doc = documentHelper.parseText (xml); // convertit la chaîne en élément xml rootElt = doc.getRootelement (); // Obtenez le nœud racine List <Element> list = rootElt.Elements (); // Obtenez tous les nœuds sous le nœud racine pour (élément élément: list) {// nœud de transmission map.put (élément.getName (), element.getText ()); // Le nom du nœud est la clé de carte, et le texte est la valeur de carte}} catch (documentException e) {e.printStackTrace (); } catch (exception e) {e.printStackTrace (); } retour de la carte; } / ** * Étendre Xstream pour prendre en charge le bloc CDATA * / private xstream xstream = new XStream (new XPPDriver (new nonameccoder ()) {@Override public hiérarchicalstreamwriter createwriter (writer out) {return new Prettrintwriter (out) {// ajouter cdata mark @SuppressWarnings ("RawTypes") public void startnode (nom de la chaîne, class Clazz) {super.startNode (nom, clizz); écrivain.write (texte); Private XStream inclueunderLinexStream = new XStream (new Domdriver (null, new XMLFriendLyNAMECODER ("_-", "_"))); public xstream getXStreaminclueunderline () {return inclueunderlinexStream; } public xstream xstream () {return xstream; } / ** * générer un numéro aléatoire * @return * / public String random () {String random = uuid.randomuuid (). ToString (). Remplace ("-", ""); retourner aléatoire; }}Ensuite, nous appelons la méthode Sendxml pour envoyer des enveloppes rouges à l'utilisateur.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.