WeChat -Sharing -Funktionsentwicklung
Nach einem Tag habe ich die Funktion entwickelt, WeChat an Freunde zu schicken und es meinem Freundeskreis zu teilen. Ich werde es hier mit Ihnen teilen, um Umwege zu vermeiden.
1. serverseitiges Programm
Paket com.wimedia.controller; import Java.io.ioException; Import Java.security.Messagedigest; Import Java.Security.NoSuchalgorithmException; Import Java.Text.ParseException; javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; import org.springframework.bean.factory.Annotation.autowired; org.springframework.web.bind.annotation.requestmapping; import com.google.gson.gson; import com.wimedia.model com.wimedia.service.ticketrepositorysolr; import com.wimedia.utils.getrandomstr; import com.wimedia.utils.SignatureBean; *<p>Package:com.wimedia.controller</p> * *<p>Description:WeChat Share Controller</p> * *<p>Company:Wimedia</p> * *@Athor:SongJia * *@Date:2016-7-15 09:34:10 am * */@Controller@RequestMapping("/WeixinshareController/Api/Inteface")public class WixInshareController {@autowired private ticketrepositorysolr ticketrepositorysolr; @RequestMapping ("/GetSignature") öffentliche String GetSignature (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst IOException, ParseException aus {// Signature -Seiten -Link -String -String -String -String -String -String = Request.GetParameter ("URL"); SimpleDateFormat Format = new SimpledateFormat ("yyyy-mm-dd hh: mm: ss"); // Holen Sie sich das Tag aus der Datenbank und überprüfen Sie, ob das Tag abläuft. Ticket OldTicket = ticketrepositorysolr.gettTicketById ("20160114Wiimmediamrylsong1152"); if (oldTicket == null) {// Das erste Mal, dass Sie zugreifen, existiert das Tag nicht. Executeticket (Antwort, "1", URL, Format); null zurückkehren; } else {// Das Tag existiert, bestimmen Sie, ob das Tag zeitgesteuert ist String oldAcquiretime = oldTicket.getAcquiretime (); Long differenz = format.Parse (format.format (neues Datum ())). if (Differenz> 71000000) {// Das TAG -TIMME -Timeout, wechseln Sie zum WeChat -Server, um das Tag -Out von 7200 Sekunden (72000000 Millisekunden) Executeticket (Antwort, "2", URL, Format); null zurückkehren; } else {// Das Tag hat nicht zeitlich abgestimmt/*** Notizen* 1. Das für die Signatur verwendete Nichtcestern und den Zeitstempel müssen mit dem Noncestern und dem Zeitstempel in WX.config übereinstimmen. * 2. Die für die Signatur verwendete URL muss die vollständige URL der Seite sein, die die JS -Schnittstelle aufruft. * 3. Aus Sicherheitsgründen müssen Entwickler die Signaturlogik auf der Serverseite implementieren. ***** Es ist einfach, Fehler bei der Konfiguration der Signatur gemäß Punkt 1 zu machen. Sie müssen den Nicht -Zestern und den Zeitstempel übergeben, der das Ticket für den Client generiert ****/ String Signature = Signature (oldTicket.gettTicket (), OldTicket.getTimestamp (), OldTicket.getnoncestern (), Url); SignatureBean SignatureBean = new SignatureBean (); SignatureBean.setnoncestern (oldTicket.getNoncestern ()); SignatureBean.Setsignature (Signatur); SignatureBean.settimestamp (OldTicket.gettimestamp ()); SignatureBean.Seturl (URL); Antwort.SetContentType ("text/html; charSet = utf-8"); response.getWriter (). print (new gson (). tojson (SignatureBean)); null zurückkehren; }}}/** * * <p> Projekt: myll_phone_v2 </p> * * <p>: mylyl_phone_v2 </p> * * <p> Beschreibung: Die Methode zum Aktualisieren und Erhalten von Tickets. Da das Solr verwendet wird, ist das Update das gleiche wie das neue. Wenn es keine ID gibt, wird es hinzugefügt. Wenn es verantwortlich ist, update </p> * * <p> Firma: Wiimedia </p> * *@athor: Songjia * *@Datum: 2016-7-15 09:45:00 AM * */public void executeticket (httpServletRespectRection, String-URLLE, Simpledateformat-Format). Getrandomstr (); String noncest = randomstr.getrandomstring (15); // Erhalten Sie den Signature Timestamp String timestamp = long.toString (System.currentTimemillis ()); // AccessToken String AccessTokenURL = "https://api.weixin.qq.com/cgi-ner/token?grant_type=client_credential&appid=your Appid & secrant = Your Key"; String tokenjson = wixinutil.httprequest (AccessTokenUrl, "get", null); Gson gson = new gson (); ShareAccess_Token Token = gson.fromjson (Tokenjson, ShareAccess_Token.class); String to = token.getAccess_Token (); // Holen Sie sich die Tag-String-String urlticket = "https://api.wexin.qq.com/cgi-ner/ticket/getticket?access_token="+to+"& type = jsapi"; String Ticketjson = wixinutil.httprequest (urlticket, "get", null); Ticket Ticket = gson.fromjson (Ticketjson, Ticket.class); String t = Ticket.gettIndicket (); // String uUid = uUid.randomuUID (). ToString (). Trim (). Ersetzen ("-", ""); // Meine Ticket -ID ist eine tote String -Erwerbszeit = format.format (neuer Datum ()); Ticket.Settid ("20160114Wiimmediamrylsong1152"); Ticket.Setacquiretime (Erwerbszeit); Ticket.Settimestamp (Zeitstempel); Ticket.SetNonCest (noncester); // Da die Solr verwendet wird, ist die Methode zum Aktualisieren und Hinzufügen der gleichen. Sie können es entsprechend Ihren spezifischen Anforderungen ändern. Dieser Artikel wird nicht mehr postieren. if (flag.equals ("2") {ticketrepositorysolr.addtickettosolr (Ticket); } else {ticketrepositorysolr.addtickettosolr (Ticket); } /*** Notizen* 1. Der für die Signatur verwendete Nicht -Zeuger- und Zeitstempel muss mit dem Noncestern und dem Zeitstempel in WX.Config übereinstimmen. * 2. Die für die Signatur verwendete URL muss die vollständige URL der Seite sein, die die JS -Schnittstelle aufruft. * 3. Aus Sicherheitsgründen müssen Entwickler die Signaturlogik auf der Serverseite implementieren. * * Nach Punkt 1 ist es einfach, bei der Konfiguration der Signatur Fehler zu machen. Sie müssen den Noncester und den Zeitstempel übergeben, der das Ticket für den Client * */ String Signature = Signature (t, Zeitstempel, Noncestern, URL) generiert. SignatureBean SignatureBean = new SignatureBean (); SignatureBean.SetNonCest (noncester); SignatureBean.Setsignature (Signatur); SignatureBean.settimestamp (TimeStamp); SignatureBean.Seturl (URL); Antwort.SetContentType ("text/html; charSet = utf-8"); response.getWriter (). print (new gson (). tojson (SignatureBean)); }/** * * <P> Projekt: mryl_phone_v2 </p> * * <p>: mryl_phone_v2 </p> * * <p> Beschreibung: Signatur basierend auf Tags, Zeitstempel, Keys, urls </p> * * private String Signature (String JSAPI_TICKET, STRING TIMESTAMP, STRING NONCESTR, STRING URL) {JSAPI_TICKET = "JSAPI_TICKET =" + JSAPI_TICKET; timestamp = "timestamp =" + timestamp; noncestre = "noncestr =" + noncestal; url = "url =" + url; String [] arr = new String [] {jsapi_ticket, timestamp, noncestern, url}; // Sortieren Sie das Wörterbuch -Token, den Zeitstempel, die Noncestern-, URL -Parameter Arrays.sort (arr); StringBuilder content = new StringBuilder (); für (int i = 0; i <arr.length; i ++) {content.Append (arr [i]); if (i! = arr.length - 1) {content.append ("&"); }} MessagedIGest md = null; String tmpstr = null; try {md = MessagedIGest.getInstance ("SHA-1"); // Drei Parameterzeichenfolgen in eine Zeichenfolge für SHA1 -Verschlüsselungs -Byte [] digest = Md.Digest (content.toString (). GetBytes ()); tmpstr = bytetostr (digest); } catch (nosuchalgorithmException e) {e.printstacktrace (); } content = null; return tmpstr; } / ** * Bytes in hexadezimale String * * @param mByte * @return * / private statische String -Bytetohexstr (Byte MByte) {char [] digit = {'0', '1', '2', '3', '4', '5', ',', ',', ',', ',', ',', ',', ' 'E', 'f'}; char [] temparr = new char [2]; temparr [0] = digit [(mByte >>> 4) & 0x0f]; temparr [1] = digit [MByte & 0x0f]; String s = new String (Temparr); Rückkehr s; } / ** * Byte -Array in hexadezimaler String * * @param bytearray * @return * / private statische String -BytetoStr (Byte [] bytearray) {String strDigest = ""; für (int i = 0; i <bytearray.length; i ++) {strdigest+= bytetohexstr (bytearray [i]); } return strdigest; } class ShareAccess_Token {private String access_token; private Zeichenfolge abläuft_in; public String getaccess_token () {return access_token; } public void setAccess_token (String AccessToken) {access_token = accessToken; } public String getExpires_in () {return expires_in; } public void setExpires_in (String expiresin) {expires_in = expiresin; }}}2. Clientcode.
<script type = "text/javaScript"> var url = window.location.href; var aciesId = ""; var Sharetitle = "morgen medizinische Informationen von morgen"; var ShareiMgurl = ""; var userInfo = localStorage.getItem ("_ userInfo"); var timestamp; var noncester; var Signatur; // Erhalten Sie die Signatur $ .ajax ({Typ: "get", url: "wixInsharecontroller/api/inteface/getSignature". timestamp = objdata.timestamp; Funktion wxshare () {wx.config ({debug: false, // Einschalten des Debug-Modus werden die Rückgaberwerte aller APIs auf dem Client alarmiert. Um die übergaberen Parameter anzuzeigen, können Sie sie auf der PC-Seite öffnen. Kennzeichen des offiziellen Berichts Zeitstempel: Zeitstempel, // Erforderlich, generieren Sie den Zeitstempel der Signature Noncestern: Noncestern, // Erforderlich, die zufällige Signature -Signatur: Signatur, // Signiert, siehe Anhang 1 JSAPILIST: }); } wx.ready(function(){ //After config information verification, the ready method will be executed. All interface calls must be obtained after the config interface obtains the result. //config is an asynchronous operation of a client. Therefore, if you need to call the relevant interface when the page is loaded, the relevant // interface must be called in the ready function to ensure correct execution. For interfaces that are called only when the user triggers, they can be called Direkt, ohne sie in die Bereitschaftsfunktion zu bringen. Wenn der Typ Musik oder Video ist, müssen Sie einen Datenlink angeben, der Standard ist leerer Erfolg: Funktion () {// Rückruffunktion, die nach der Bestätigung des Benutzers die Freigabe,}, abbrechen: function () {// Rückruffunktion, die nach dem Benutzer ausgeführt wurde, nach dem Benutzer die Freigabe}}) ausgeführt wird; // ------------------- // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Sharing}, Abbrechen: function () {// Die Rückruffunktion, die nach dem Stornieren des Nutzers die Freigabe}} ausgeführt wird; // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------3. Die vom Server benötigten Tools und Modelle
① Ticket
Paket com.wimedia.model; öffentliche Klasse Ticket {private String tid; privates String -Ticket; private Zeichenfolge Errcode; private Zeichenfolge errmsg; private Zeichenfolge abläuft_in; private String -Erwerbszeit; private String noncester; private String -Zeitstempel; öffentliches Ticket (String TID, String -Ticket, String -Errcode, String errmsg, String -Ablauf, String -Erwerbszeit, String noncestern, String Timestamp) {Super (); this.tid = tid; this.ticket = Ticket; this.errcode = errcode; this.errmsg = ermsg; abläuft_in = abläuft; this.acquiretime = Erwerbszeit; this.noncestern = noncester; this.timestamp = timestamp; } public String gettid () {return tid; } public void settid (String tid) {this.tid = tid; } public String Getticket () {Rückgabe -Ticket; } public void setticket (String -Ticket) {this.ticket = Ticket; } public String getRCode () {return errCode; } public void setRcode (String errCode) {this.errcode = errcode; } public String getRmsg () {return errmsg; } public void setRmsg (String errmsg) {this.errmsg = errmsg; } public String getExpires_in () {return expires_in; } public void setExpires_in (String expiresin) {expires_in = expiresin; } public String getAcquiretime () {Return Acquisitiontime; } public void setAcquiretime (String Acquiretime) {this.acquiretime = Acquiretime; } public String getNoncestern () {return noncest; } public void setNoncestern (String noncester) {this.noncestern = noncest; } public String getTimestamp () {return timestamp; } public void setTimestamp (String timestamp) {this.timestamp = timestamp; }} ② Das in die Datenbank hinzugefügte Unternehmen wird entsprechend Ihren Anforderungen implementiert.
③ GetRandomstr
Paket com.wiimedia.utils; importieren java.util.random; öffentliche Klasse getrandomstr {/** * * <p> Projekt: myll_phone_v2 </p> * * <p>: mryl_phone_v2 </p> * * <p> Beschreibung: Generation ein Instant String </p> * * <pjials: Wiimedia; *@Datum: 2016-7-14 11:14:46 * */ public String getrandomstring (int Länge) {String Base = "AbcDefghijklMnopqrstuvwxyz0123456789"; Random random = new random (); StringBuffer sb = new StringBuffer (); für (int i = 0; i <länge; i ++) {int number = random.Nextint (Base.Length ()); sb.Append (base.charat (number)); } return sb.toString (); }}④ SignatureBean
Paket com.wimedia.utils; öffentliche Klasse SignatureBean {private String noncest; private String -URL; private String -Zeitstempel; private String -Signatur; public String getNoncestern () {return noncester; } public void setNoncestern (String noncester) {this.noncestern = noncest; } public String geturl () {return url; } public void seturl (String url) {this.url = url; } public String getTimestamp () {return timestamp; } public void setTimestamp (String timestamp) {this.timestamp = timestamp; } public String getSIntature () {Rückgabesignatur; } public void SetSignature (String Signature) {this.signature = Signatur; }}⑤ wixinutil
Paket com.wimedia.utils.weixin; import Java.io.BufferedReader; Import Java.io.inputStream; Import Java.io.inputStreamReader; Java.io.outputStream importieren Java.net.connectException; Import Java.Nection.url; javax.net.ssl.slcontext; importieren javax.net.ssl.sslsocketfactory; javax.net.ssl.trustmanager;/** * * <p> Projekt: mryl_phone_v2 </p> * * <p> Mrylyl_Pon_V2 </p> * <p> * <p> * </p> * </p> * </p> * </p> * </p> * </p> * </p> * </p> * </p> * <p> * <p> * <p> * <p> * <p> * <p> * <p> * <p> * <P> Firma: Wiimedia </p> * * @athor: Songjia * * @Datum: 2016-7-15 09:37:13 AM * * */public class wexinutil {/** * initiieren des JSON -Objekts über JsonObject.get (Schlüssel)) */ public static String httpRequest (String Requesturl, String RequestMethod, String OutputStr) {StringBuffer Buffer = new StringBuffer (); Versuchen Sie {// SSLContext -Objekt erstellen und TreuhandManager [] tm = {new Myx509TrustManager ()} initialisieren; SSLContext SSLContext = SSLContext.getInstance ("SSL", "Sunjsse"); SSLContext.init (Null, TM, New Java.security.securerandom ()); // das SSLSOCKETFACTORY -Objekt aus dem obigen SSLContext -Objekt SSLSOCKETFACTORY SSF = SSLCONTEXT.GetSocketFactory () abrufen; URL URL = neue URL (Requesturl); HttpsurlConnection httpurlconn = (httpsurlConnection) url.openconnection (); httpurlconn.setsSlsocketFactory (SSF); httpurlconn.setDooutput (true); httpurlconn.setDoInput (true); httpurlconn.SetUSecaches (falsch); // Anforderungsmethode festlegen (get/post) httpurlconn.setRequestMethod (RequestMethod); if ("get" .EqualSignoreCase (requestMethod)) httpurlconn.connect (); // Wenn Daten vorgelegt werden müssen, wenn (null! httpurlConn.getInputStream () InputStreamReader InputStreamReader = New InputStreamReader (InputStream, "UTF-8"); bufferedReader.close(); inputStreamReader.close(); // Release the resource inputStream.close(); inputStream = null; httpUrlConn.disconnect(); return buffer.toString(); } catch (ConnectException ce) { ce.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return "";4. Zu diesem Zeitpunkt wurde die Freigabefunktion entwickelt, aber Sie werden bei der Erzeugung von Signaturen auf viele Probleme stoßen. Hier sind einige Fehlerbehebungsmethoden für WX.Config -Fehler.
① Bestätigen Sie, ob die generierte Signatur in http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign von WeChat zur Überprüfung bereitgestellt wird
② ob der in wx.config verwendete Nicht -Zeuger-, Zeitstempel mit dem entsprechenden Nichtcestern und dem Zeitstempel übereinstimmt, der zum Signieren verwendet wird ... wie oben (1. Servercode)
(Es ist möglich, dass aufgrund des Ladeauftragsproblems der JS-Seite in WX.Config die servergebildete Signatur, Noncestern und Zeitstempel nicht erhalten wurden).
③ Bestätigen Sie, dass die URL die vollständige URL der Seite ist, einschließlich des GET -Parameter -Teils, der aus dem folgenden # entfernt werden muss
④ Stimmt der Anhang in der Konfiguration mit der Anhänge überein, mit JSAPI_TICKET zu erhalten?
⑤ ERROR {ERRMSG: config: OK} ist die normale Rückgabe des Debugging -Modus und deaktivieren Sie den Debug -Modus. OK
wx.config debug: false,
Dieser Artikel wurde in "Android Wechat Development Tutorial Summary" zusammengestellt, und "Java Wechat Development Tutorial Summary" begrüßt alle zum Lernen und Lesen.
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.