Schauen wir uns zunächst die Auswirkungen von Bargeldroten um, die vom offiziellen Konto ausgestellt wurden:
Es ist notwendig, die Schnittstelle der Händlerplattform aufzurufen, und die Grenzflächenverteilungsregeln sind wie folgt:
1. Frequenzgrenze senden - Standard 1800/min
2. Die Obergrenze der Anzahl der Sendungen - berechnet nach dem Standard 1800/min
3. Betrag Obergrenze - Abhängig von der eingehenden Szenen -ID kann die Standard -Obergrenze in den Produkteinstellungen der Händlerplattform eingestellt und angewendet werden, wobei maximal nicht mehr als 4.999 Yuan pro Einheit sind
4. Welche anderen Beschränkungen der "Menge" gibt es? - Die maximale Häufigkeit, mit der der Benutzer diesen Tag erhält, beträgt standardmäßig 10
5. Wenn die Menge unsere Bedürfnisse nicht erfüllen kann, wie können wir dann jede Obergrenze erhöhen? -Die maximale Menge und die maximale Anzahl, mit der der Benutzer am selben Tag erhält, kann auf der Händlerplattform festgelegt werden
HINWEIS- Wenn der rote Umschlagbetrag größer als 200 ist, muss die Anforderungsparameter-Szene_ID übergeben werden und die Parameterbeschreibung ist unten angezeigt.
Anmerkung 2 - Gemäß den behördlichen Anforderungen müssen zwei Bedingungen für neu angewandte Händlerkonten in bar rotem Umschläge verwendet werden: 1. Die Eintrittszeit überschreitet 90 Tage 2. Kontinuierliche normale Transaktionen für 30 Tage.
Anfordern URL https://api.mch.weixin.qqq.com/mmpaymkttransfers/sendredpack
Ob ein Zertifikat erforderlich ist, ist (siehe das Händlerzertifikat für Einzelheiten)
Anforderungsmethode Post
Datenbeispiel anfordern:
<xml> <sign> <! [CDATA [E1EE61A91C8E90F299DE6AE075D60A2D]]> </sign> <mch_billno> <! [CDATA [001001040401411170 000046545]> </mch_billno> <mch_id> <! [CDATA [888]]> </mch_id> <wxAppid> <! [CDATA [WXCBDA96DE0B165486]]> </wxap pid> <send_name> <! [cdata [send_name]]> </send_name> <re_openid> <! [cdata [onqojjmm1tad-3ropncn-yufa6ui]]> </r e_openid> <total_amount> <! [cdata [200]]> </total_amount> <tothole_num> <! [cdata [1]]> </total_num> <wishing> <! [CD ATA [Herzlichen Glückwunsch zum Reich]]> </Wishing> <Client_ip> <! [CDATA [127.0.0.1]]> </client_ip> <act_name> <! [CDATA [Neues Jahr Red Envelope]]> </act_name> <Berids Umschlag]]> </remove> <szene_id> <! [CDATA [product_2]]> </szene_id> <conteum_mch_id> <! [Cdata [10 000097]]> </consum_mch_id> <nonce_str> <! [CDATA [50780e0ca98c8e814883e5caa672e]]> </nonce_str> <risikobough_inf O> Posttime%3D123123412%26Clientversion%3D234134%26Mobil%3D122344545%26Deviceid%3DIOS </risk_info> </xml>
Die Schnittstelle erfordert den Anruf zum Zertifikat der Handelsplattform, und das Zertifikat muss von der Händlerplattform heruntergeladen werden:
Verwenden Sie dann das Zertifikat in der Schnittstelle. Erstens erstellen wir eine neue Wixinssl -Klasse
@ComponentPublic Class wexinssl { / *** Zertifikatentyp* / @Value ("$ {werchant.storekey}") private String storeKey; / *** Dateipfad*/ @Value ("$ {werchant.sslfile}") private String sslFile; / *** Händlernummer*/ @Value ("$ {Werchant.MerchantNumber}") private String MerchantNumber; public String getStoreKey () {return storeKey; } public void setStoreKey (String storeKey) {this.storekey = storekey; } public String getSlfile () {return sslFile; } public void setsSlfile (String sslFile) {this.slfile = sslFile; } public String getMerchantNumber () {Return MerchantNumber; } public void setMerchantNumber (String MerchantNumber) {this.MerchantNumber = MerchantNumber; }}Kapitulieren Sie die HTTPClientSL -Klasse, um die HTTPS -Anfrage zum Hinzufügen eines Zertifikats zu implementieren:
@ComponentPublic Class httpclientsl {@autowired private wixinsl weixinssl; // Anfrage Timeout (Milliseconds) 5 Sekunden öffentliche statische RequestConfig RequestConfig; // Response Timeout (Millisekunden) 60 Sekunden öffentliche statische int http_response_timeout = 60 * 1000; // httpclient charaktercodieren public static string coding = "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 Anfrage Forgery -Zertifikat* @return* / public CloseableHttpclient defaultSlclient () {SSLContext SSLContext = null; try {new SSLContextBuilder (). LoadTrustMaterial (Null, New TrustStrategy () {@Override public boolean isTrusted (x509Certificate [] kette, String authType) löst Java.security.cert.CertificateException {return false;}}); } catch (nosuchalgorithmException | keystoreException e) {e.printstacktrace (); } SSLConNectionsOCKETFACTORY FACTORY = NEW SSLCONNECTIONSOCKETFACTORY (SSLCONTEXT); return httpclients.custom (). setsSlsocketFactory (factory) .build (); } / *** https Anfrage zum Hinzufügen von Zertifikat* @return* / public CloseableHttpclient defaultSlclientFile () {if (this.weixinsl == null) {return this.DefaultSlclient (); } FileInputStream InputStream = NULL; Keystore keystore = null; try {// SSL type keystore = keystore.getInstance (wixinssl.getStorekey ()); // SSL -Datei inputStream = new FileInputStream (wixinssl.getSslfile ()); // Setzen Sie das SSL -Kennwort keystore.load (inputStream, wixinsl.getmerchantNumber (). ToarArray ()); } catch (keystoreException | nosuchalgorithmException | CertificateException | ioException e1) {e1.printstacktrace (); } endlich {try {inputStream.close (); } catch (ioException e) {e.printstacktrace (); }} SSLContext sslContext = null; try {sslContext = sslcontexts.custom (). loadKeymaterial (keystore, wixinssl.getmerchantNumber (). tocharArray ()). Build (); } catch (nicht recoverableKeyException | NoSuchalgorithmException | KeystoreException | KeyManagementException e) {e.printstacktrace (); } return httpclients.custom (). setsSlsocketFactory (factory) .build (); } / *** Kapitelle Methode zum Senden von Anforderungen* @throws UnsupportedenCodingException* / public String send (String -URL, String -Daten, CloseableHttpclient CloSableableHttpclient) löst unaufrichtigeCodingException {CloseableHttpclient Client = ClodableableHttpclient aus; Httppost httppost = new httppost (UrldeCoder.decode (URL, Codierung)); httppost.addHeader ("Verbindung", "Keep-Alive"); httppost.addHeader ("Akzeptieren", "*/*"); httppost.addHeader ("Content-Typ", "Anwendung/x-www-form-urlencoded; charset = utf-8"); httppost.addheader ("host", "api.mch.weixin.qq.com"); httppost.addHeader ("x-requested-with", "xmlhttprequest"); httppost.addHeader ("cache-control", "max-altern = 0"); httppost.addHeader ("user-Agent", "Mozilla/4.0 (kompatibel; MSIE 8.0; Windows NT 6.0)"); httppost.setConfig (this.getRequestConfig ()); // Timeout CloseableHttPesponse -Antwort = null; // den Parameter in strackEntity entity = new strackentity (Daten, Codierung) eingeben; Entity.SetContentCoding (Codierung); entity.setContentType ("application/xml"); httppost.setentity (Entity); try {response = client.execute (httppost); if (response.getStatusLine (). getStatusCode () == 200) {httpentity httpentity = (httpentity) response.getEntity (); if (response! }}} catch (ioException e) {e.printstacktrace (); } return null; }} Auf diese Weise verkapulieren wir eine Entitätsklasse, die das Zertifikat mit HTTPS anfordert, und generieren dann die angeforderte WeChat Red Envelope -Schnittstelle:
Parametersignatur von https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack:
/*** Red Envelope Parameter Entity -Klasse*@Throws UnsupportedenCodingException*/ @componentPublic -Klasse SendRedPack implementiert serialisierbar {/****/private statische endgültige long serialversionuid = -100048922809916099l; private String nonce_str; // zufällige Zeichenfolge private Zeichenfolge Zeichen; // Signatur private String mch_billno; // Händlerbestellnummer private String mch_id; // Händlernummer private String WXAppid; // öffentliches Konto private String send_name; // Händlername private String Re_openid; // Benutzer private Intum -Total Intcountry -Abfuhr. Umschlag Blessing Private String client_ip; // IP -Adresse private String ACT_NAME; // Aktivitätsname private String -Bemerkung; // Notizen öffentliche String getnonce_str () {return nonce_str; } public void setNonce_str (string nonce_str) {this.nonce_str = nonce_str; } public String getSInnen () {Rückgabezeichen; } public void setSign (String Sign) {this.sign = Sign; } 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 getend_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 Wunsch) {this.wishing = Wunsch; } 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 Bemerkung; } public void setRemark (String Bemerkung) {this.remark = Bemerkung; }}Als nächstes kommt der Controller, der das rote Paket sendet:
/*** Red Envelope Controller* @Author Zgliang*/ @Controller @RequestMapping (value = "/redeVevelopesReceive") public class redeVevelopesReceReConTroller {// Wechat eindeutige Identifier @value ("$ {wixin.appid}") privat String appid; // WeChat Developer Password Identifier @Value ("$ {wixin.appsecret}") public String Appsecret; @Autowired Private SendRedpack SENDREDPACK; @Autowired Private httpclientSL httpclientssl; /*** Senden Sie XML -Parameter* @Author Zgliang*/@ResponseBody @RequestMapping (value = "/sendxml") public String sendxml (String OpenID, Long redevelopes_id, String mch_billno) {redEnvevevevelopes = redEnvelope.Findone (ern. Xmlutil xmlutil = new xmlutil (); sendRedpack.setact_name (redenve.getact_name ()); sendRedpack.setnonce_str (xmlutil.random ()); sendRedpack.setre_openid (openID); sendRedpack.setClient_IP (redenve.getClient_ip ()); sendRedpack.setmch_billno (mch_billno); sendRedpack.setmch_id (redenve.getMch_id ()); String xx = revenve.getRemark (); sendRedpack.setremark (Stringutils.isempty (xx) == false? xx: "leer"); sendRedpack.setsend_name (redenve.getSend_name ()); sendRedpack.settotal_amount (redenve.gettotal_amount ()); sendRedpack.settotal_num (redenve.gettotal_num ()); sendRedpack.setwishing (redenve.getWishing ()); sendRedpack.setwxAppid (redenve.getWXAppIdxx ()); // Signaturstring -Params generieren = this.createSendREDPackOrdersign (sendRedpack, revenve.getStore_key ()); sendRedpack.setsign (params); xmlutil.xstream (). alias ("xml", sendedpack.getClass ()); // Xstream verlängern, um CDATA -Block -String -Anforderungsanforderung zu unterstützen. String -Ergebnis; try {result = httpclientsl.send ("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack", RequestXml, httpclientssl.DefaultSslclientFile ()); System.out.println ("erfolgreicher Rückgabewert"+Ergebnis); Rückgabeergebnis; } catch (unportedenCodingException e) {e.printstacktrace (); } return null; }/ ** * Signatur generieren * @param redpack * @return */ public String creatSeSndRackOrdersign (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 ("& remove ="). 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 ("& remove ="). 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 (); }}Dann müssen wir eine Werkzeugklasse verwenden, um XML zu analysieren, um XML zu analysieren, die von WeChat zurückgegeben werden, um XML zu analysieren
/** * Parsing XML -Werkzeugklasse * @Author Zgliang */ @componentpublic class xmlutil {/** * Parsing xml zurückgegeben von WeChat * @param xml * @return * @throws Exception */@Suppresswarnings ("Unerlasted". HashMap <String, String> (); Dokument doc = null; try {doc = documentHelper.ParsetExt (xml); // Die Zeichenfolge in das XML -Element rootelt = doc.getrootelement () konvertieren; // Erhalten Sie die Root -Knotenliste <element> list = rootelt.elements (); // Alle Knoten unter dem Root -Knoten für (Element: list: list) {// Ruheknoten map.put (element.getName (), element.getText ()) abrufen; // Der Name des Knotens ist der Kartenschlüssel, und der Text ist der Kartenwert}} catch (documentException e) {e.printstacktrace (); } catch (Ausnahme e) {e.printstacktrace (); } Rückgabekarte; } / *** Erweitern Sie Xstream, um CDATA -Block zu unterstützen @Suppresswarnings ("Rawtypes") public void startnode (String -Name, Class Clazz) {Super.StartNode (Name, Clazz); Writer.Write (Text); private xstream incluederLinexstream = neuer Xstream (neuer Domdriver (NULL, neuer XMLFriendLyNameCoder ("_-", "_")); public xstream getXstreamInclueunderline () {return inclEunderxstream; } public xstream xstream () {return xstream; } / *** zufällige Nummer generieren* @return* / public String random () {string random = uUid.randomuuid (). ToString (). Ersetzen ("-", ""); zufällig zurückgeben; }}Anschließend rufen wir die SendXML -Methode an, um den Benutzer rote Umschläge zu senden.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.