تطوير وظيفة مشاركة WeChat
بعد يوم ، قمت بتطوير وظيفة إرسال WeChat إلى الأصدقاء ومشاركتها إلى دائرة أصدقائي. سوف أشاركها معك هنا لتجنب التحويلات.
1. برنامج جانب الخادم
package com.wimedia.controller ؛ استيراد java.io.ioException ؛ استيراد java.security.messageSest ؛ استيراد java.security.nosuchalgorithmexception ؛ استيراد java.text.parsexception ؛ استيراد java.text.simpledateRymort ؛ javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛ استيراد org.springframework.beans.factory.annotation.autowired org.springframework.web.bind.annotation.requestmapping ؛ import com.google.gson.gson ؛ import com.wimedia.model.ticket ؛ import com.wimedia.service.ServiceSorservice ؛ import com.wimedia.service.ticketropository ؛ com.wimedia.utils.getRandomStr ؛ استيراد com.wimedia.utils.signaturebean ؛ استيراد com.wimedia.utils.weixin.weixinutil ؛/** * * * * <p> المشروع: mryl_phone_v2 </p> * * <p> الحزمة: com.wimedia *<p> الشركة: Wimedia </p> * *@Athor: SongJia * *@Date: 2016-7-15 09:34:10 AM * */@@requestMapping ("/WeixinShareController/API/inteface") class public weixinshareController {AuToWired private ticketropositoRexOlReverPositoReverPositoRexoTerPositoRexOleR. requestmapping ("/getSignature") GetSicinature (طلب httpservletrequest ، استجابة httpservletresponse) يلقي ioException ، ParseException {// الحصول على سلسلة التوقيع url = request.getParameter ("url") ؛ تنسيق SimplEdateFormat = جديد SimplEdateFormat ("Yyyy-MM-DD HH: MM: SS") ؛ // احصل على العلامة من قاعدة البيانات وتحقق مما إذا كانت العلامة تنتهي. ticket oldticket = ticketrepositorysolr.getticketbyid ("20160114wiimmediamrylsong1152") ؛ إذا (oldticket == null) {// في المرة الأولى التي تصل فيها ، فإن العلامة غير موجودة. Executeticket (استجابة ، "1" ، url ، التنسيق) ؛ العودة لاغية. } else {// موجودة العلامة ، حدد ما إذا كانت العلامة يتم توقيتها من سلسلة oldacquiretime = oldticket.getAcquiretime () ؛ الفرق الطويل = format.parse (format.format (تاريخ جديد ())). إذا كان (الفرق> 71000000) {// مهلة العلامات ، انتقل إلى خادم WeChat لطلب مهلة العلامة هو 7200 ثانية (720000000000 ميلي ثانية) Executeticket (استجابة ، "2" ، عنوان URL ، التنسيق) ؛ العودة لاغية. } آخر {// لم يتم توقيت العلامة/*** 1. * 2. يجب أن يكون عنوان URL المستخدم للتوقيع هو عنوان URL الكامل للصفحة التي تستدعي واجهة JS. * 3. لأسباب أمنية ، يجب على المطورين تطبيق منطق التوقيع على جانب الخادم. **** من السهل ارتكاب أخطاء عند تكوين التوقيع وفقًا للنقطة 1. تحتاج إلى تمرير Noncestr و TimeStamp الذي يولد التذكرة إلى العميل ****/ string signature = signature (oldticket.getTicket () ، Oldticket.getTimestamp () ، Oldticket.getnoncest () ، url) ؛ SignatureBean signatureBean = new SignatureBean () ؛ SignatureBean.setnoncester (oldticket.getnoncester ()) ؛ SignatureBean.SetsIgnature (التوقيع) ؛ SignatureBean.SettImestamp (oldticket.getTimestamp ()) ؛ SignatureBean.seturl (url) ؛ استجابة. Response.getWriter (). print (new gson (). tojson (signatureBean)) ؛ العودة لاغية. }}}/** * * <p> المشروع: mryl_phone_v2 </p> * * <p>: mryl_phone_v2 </p> * * <p> الوصف: طريقة التحديث والحصول على التذاكر. نظرًا لاستخدام SOLR ، فإن التحديث هو نفسه الجديد. إذا لم يكن هناك معرف ، فسيتم إضافته. إذا كان مسؤولاً ، فامحح </p> * * * <p> الشركة: wiimedia </p> * * *@athor: songjia * *@date: 2016-7-15 09:45:00 am * */public void executeticket (httpservletresponse ، getRandomStr () ؛ سلسلة noncestr = randomstr.getRandomString (15) ؛ // احصل على Timestamp String Timestamp = long.toString (System.CurrentTimeMillis ()) ؛ // طلب accessToken String AccessTokenurl = "https://api.weixin.qq.com/cgi-bin/token؟grant_type=client_credential&appid=your appid & secret = مفتاحك" ؛ سلسلة tokenjson = weixinutil.httprequest (AccessTokenurl ، "get" ، null) ؛ gson gson = new gson () ؛ shareaccess_token token = gson.fromson (tokenjson ، shareaccess_token.class) ؛ سلسلة إلى = token.getAccess_Token () ؛ // احصل على سلسلة tag urlticket = "https://api.weixin.qq.com/cgi-bin/ticket/getticket؟access_token="+to+"& type = jsapi" ؛ String TicketJson = weixinutil.httprequest (urlticket ، "get" ، null) ؛ تذكرة تذكرة = gson.fromson (ticketjson ، ticket.class) ؛ سلسلة t = ticket.getTicket () ؛ // string uuid = uuid.randomuuid (). // معرف التذكرة الخاص بي هو وقت اكتساب السلسلة الميت = format.format (تاريخ جديد ()) ؛ Ticket.Settid ("20160114WiimmediMryLsong1152") ؛ ticket.setAcquiretime (Acquiretime) ؛ ticket.Settimestamp (timestamp) ؛ ticket.setnoncestr (noncestr) ؛ // لأنه يتم استخدام SOLR ، فإن طريقة التحديث والإضافة هي نفسها. يمكنك تعديله وفقًا لاحتياجاتك المحددة. هذه المقالة لن بعد بعد رمز. if (flag.equals ("2")) {ticketrepositorysolr.addtickettosolr (ticket) ؛ } آخر {ticketrepositorysolr.addtickettosolr (ticket) ؛ } /*** Notes* 1. يجب أن يكون Non -Cestamp و Timestamp المستخدم للتوقيع هو نفسه Noncester and Timestamp في wx.config. * 2. يجب أن يكون عنوان URL المستخدم للتوقيع هو عنوان URL الكامل للصفحة التي تستدعي واجهة JS. * 3. لأسباب أمنية ، يجب على المطورين تطبيق منطق التوقيع على جانب الخادم. * * وفقًا للنقطة 1 ، من السهل ارتكاب أخطاء عند تكوين التوقيع. تحتاج إلى تمرير Noncester و Timestamp الذي يولد التذكرة إلى العميل * */ string signature = signature (t ، timestamp ، noncestr ، url) ؛ SignatureBean signatureBean = new SignatureBean () ؛ SignatureBean.setnoncestr (noncestr) ؛ SignatureBean.SetsIgnature (التوقيع) ؛ SignatureBean.Settimestamp (Timestamp) ؛ SignatureBean.seturl (url) ؛ استجابة. Response.getWriter (). print (new gson (). tojson (signatureBean)) ؛ }/** * * <p> المشروع: mryl_phone_v2 </p> * * <p>: mryl_phone_v2 </p> * * <p> الوصف: توقيع على العلامات ، الطابع الزمني ، المفاتيح ، urls </p> * * * توقيع السلسلة الخاصة (String JSAPI_TICKET ، طابع زمني للسلسلة ، سلسلة noncestr ، url سلسلة) {jsapi_ticket = "jsapi_ticket =" + jsapi_ticket ؛ Timestamp = "timestamp =" + timestamp ؛ noncestr = "noncestr =" + noncestr ؛ url = "url =" + url ؛ String [] arr = new string [] {jsapi_ticket ، timestamp ، noncestr ، url} ؛ // فرز رمز القاموس ، timestamp ، noncestr ، url parameters arrays.sort (arr) ؛ stringBuilder content = new StringBuilder () ؛ لـ (int i = 0 ؛ i <arr.length ؛ i ++) {content.append (arr [i]) ؛ if (i! = arr.length - 1) {content.append ("&") ؛ }} messagedigest md = null ؛ سلسلة TMPSTR = فارغة ؛ حاول {md = messagedigest.getInstance ("sha-1") ؛ // لصق سلاسل المعلمة ثلاثة في سلسلة لبلد تشفير sha1 [] Digest = md.digest (content.toString (). getBytes ()) ؛ TMPSTR = BYTETOSTR (Digest) ؛ } catch (nosuchalgorithMexception e) {e.printstacktrace () ؛ } content = null ؛ إرجاع TMPSTR ؛ } / ** * تحويل البايتات إلى سلسلة hexadecimal * * param mbyte * @return * / private Static String BytetoHexstr (byte mbyte) {char [] digit = {'0' ، '1' ، '2' ، '3' ، '4' ، '5' ، '6' ، '8' ، '9' 'e' ، 'f'} ؛ char [] temparr = new Char [2] ؛ Temparr [0] = Digit [(mbyte >>> 4) & 0x0F] ؛ Temparr [1] = Digit [mbyte & 0x0f] ؛ سلسلة S = سلسلة جديدة (Temparr) ؛ العودة s ؛ } / ** * تحويل صفيف البايت إلى سلسلة hexadecimal * * param bytearray * @return * / private static string bytetoStr (byte [] bytearray) {String StrDigest = "" ؛ لـ (int i = 0 ؛ i <bytearray.length ؛ i ++) {strDigest+= bytetoHexstr (bytearray [i]) ؛ } إرجاع strdigest ؛ } class shareaccess_token {private string access_token ؛ سلسلة خاصة انتهت صلاحية. السلسلة العامة getAccess_Token () {return access_token ؛ } public void setAccess_Token (String AccessToken) {access_token = accessToken ؛ } السلسلة العامة getExpires_in () {return Expires_in ؛ } public void setExpires_in (سلسلة Expiresin) {Expires_in = Expiresin ؛ }}}2. رمز العميل.
<script type = "text/javaScript"> var url = window.location.href ؛ var alwaysid = "" ؛ var sharetitle = "المعلومات الطبية للغد" ؛ var shareimgurl = "" ؛ var userInfo = localStorage.getItem ("_ userinfo") ؛ var timestamp ؛ var noncestr. توقيع var ؛ // احصل على التوقيع $ .ajax ({type: "get" ، url: TimeStamp = ObjData.timestamp ؛ الدالة wxshare () {wx.config ({debug: false ، // قم بتشغيل وضع التصحيح ، سيتم تنبيه قيم الإرجاع لجميع واجهات برمجة التطبيقات التي تسمى العميل. لعرض المعلمات التي تم تمريرها ، يمكنك فتحها على جانب الكمبيوتر. معرف الحساب الرسمي الطابع الزمني: الطابع الزمني ، // مطلوب ، قم بإنشاء الطابع الزمني لتوقيع noncestr: noncestr ، // ، وإنشاء سلسلة عشوائية من توقيع التوقيع: التوقيع ، / / مطلوب ، والتوقيع ، انظر الملحق 1 jsapilist: }) ؛ } wx.ready (function () {// بعد التحقق من معلومات التكوين ، سيتم تنفيذ الطريقة الجاهزة. يجب الحصول على جميع مكالمات الواجهة بعد أن تحصل واجهة التكوين على النتيجة. يتم استدعاؤها مباشرة دون وضعها في الوظيفة الجاهزة. "" ، // إذا كان النوع هو الموسيقى أو الفيديو ، فأنت بحاجة إلى توفير رابط بيانات ، والافتراضي هو نجاح فارغ: الدالة () {// وظيفة رد الاتصال التي تم تنفيذها بعد أن تؤكد المستخدم المشاركة ،} ، إلغاء: الدالة () {// وظيفة رد الاتصال التي تم تنفيذها بعد إلغاء المستخدم}}) ؛ // ----------------------- "share to friends" wx.onmenusharetimeline ({title: 'غد المعلومات الطبية' ، // ارتباط العنوان المشاركة: '' ، ) مشاركة} ، إلغاء: function () {// وظيفة رد الاتصال التي تم تنفيذها بعد أن تلغي المستخدم المشاركة}}) ؛ // -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------3. الأدوات والنماذج التي يتطلبها الخادم
① تذكرة
حزمة com.wimedia.model ؛ تذكرة الفئة العامة {private string tid ؛ تذكرة سلسلة خاصة سلسلة errcode الخاصة بالسلسلة الخاصة ؛ سلسلة خاصة errmsg ؛ سلسلة خاصة انتهت صلاحية. وقت الاستحواذ على السلسلة الخاصة ؛ سلسلة خاصة noncestr. الطابع الزمني للسلسلة الخاصة ؛ التذكرة العامة (سلسلة TID ، تذكرة السلسلة ، errcode سلسلة ، سلسلة errmsg ، سلسلة Expiresin ، سلسلة الاستحواذ ، سلسلة noncester ، thergr string) {super () ؛ this.tid = tid ؛ this.ticket = تذكرة ؛ this.errcode = errcode ؛ this.errmsg = errmsg ؛ Expires_in = Expiresin ؛ this.Acquiretime = quiveletime ؛ this.noncester = noncestr ؛ this.timestamp = timestamp ؛ } السلسلة العامة getTid () {return tid ؛ } public void SestiD (String tid) {this.tid = tid ؛ } السلسلة العامة getTicket () {return ticket ؛ } public void setticket (string ticket) {this.ticket = ticket ؛ } السلسلة العامة geterRcode () {return errcode ؛ } public void seterrcode (string errcode) {this.errcode = errcode ؛ } السلسلة العامة geterRmsg () {return errmsg ؛ } public void seterrmsg (string errmsg) {this.errmsg = errmsg ؛ } السلسلة العامة getExpires_in () {return Expires_in ؛ } public void setExpires_in (سلسلة Expiresin) {Expires_in = Expiresin ؛ } السلسلة العامة getAcquiretime () {return cuccisitionTime ؛ } public void setAcquiretime (string quiveletime) {this.acquiretime = quiveletime ؛ } السلسلة العامة getNoncestr () {return noncestr ؛ } public void setnoncestr (سلسلة noncestr) {this.noncestr = noncestr ؛ } السلسلة العامة getTimestamp () {return timestamp ؛ } public void setTimEstamp (String timestamp) {this.timestamp = timestamp ؛ }} ② يتم تنفيذ الأعمال المضافة إلى قاعدة البيانات وفقًا لاحتياجاتك.
③ getRandomstr
حزمة com.wiimedia.utils ؛ استيراد java.util.random ؛ الفئة العامة getRandomstr {/** * * <p> المشروع: mryl_phone_v2 </p> * * <p> *@التاريخ: 2016-7-14 11:14:46 AM * */ السلسلة العامة getRandomString (طول int) {string base = "abcdefghijklmnopqrstuvwxyz0123456789" ؛ عشوائي عشوائي = جديد عشوائي () ؛ StringBuffer SB = New StringBuffer () ؛ لـ (int i = 0 ؛ i <length ؛ i ++) {int number = random.nextint (base.length ()) ؛ sb.append (base.charat (number)) ؛ } return sb.toString () ؛ }}④ SignatureBean
package com.wimedia.utils ؛ public class signatureBean {private string noncestr ؛ عنوان URL الخاص بالسلسلة ؛ الطابع الزمني للسلسلة الخاصة ؛ توقيع السلسلة الخاصة ؛ السلسلة العامة getnoncester () {return noncestr ؛ } public void setnoncestr (سلسلة noncestr) {this.noncestr = noncestr ؛ } السلسلة العامة geturl () {return url ؛ } public void seturl (url url) {this.url = url ؛ } السلسلة العامة getTimestamp () {return timestamp ؛ } public void setTimEstamp (String timestamp) {this.timestamp = timestamp ؛ } السلسلة العامة getSignature () {return signature ؛ } public void setSignature (سلسلة توقيع) {this.signature = signature ؛ }}⑤ Weixinutil
package com.wimedia.utils.weixin ؛ استيراد java.io.bufferedreader ؛ استيراد java.io.inputstream ؛ استيراد java.io.inputstreamreader ؛ import java.io.outputstream ؛ import java.net.connectexception ؛ import java.net.url ؛ javax.net.ssl.sslcontext ؛ import javax.net.ssl.sslsocketfactory ؛ استيراد javax.net.ssl.trustmanager ؛/** * * * <p> project: mryl_phone_v2 </p> * <p> * <p> الشركة: wiimedia </p> * * @athor: songjia * * @التاريخ: 2016-7-15 09:37:13 am * */class public class weixinutil {/** * state httiate request request @parent upturn upturn quitured من كائن JSON من خلال jsonobject.get (مفتاح)) */ سلسلة ثابتة عامة httprequest (string requesturl ، string requestMethod ، String outputStr) {StringBuffer Buffer = new StringBuffer () ؛ حاول {// إنشاء كائن sslContext وقم بتهيئة TrustManager [] tm = {new myx509trustmanager ()} ؛ sslContext sslContext = sslContext.getInstance ("ssl" ، "sunjsse") ؛ sslContext.init (null ، tm ، new java.security.securerandom ()) ؛ // احصل على كائن SSLSocketFactory من كائن SSLContext أعلاه sslsocketfactory ssf = sslContext.getSocketFactory () ؛ url url = url new url (requesturl) ؛ httpsurlConnection httpurlconn = (httpsurlConnection) url.openconnection () ؛ httpurlconn.setsslsocketfactory (SSF) ؛ httpurlconn.setDooutput (صواب) ؛ httpurlconn.setDoInput (true) ؛ httpurlconn.setusecaches (false) ؛ // set method method (get/post) httpurlconn.setRequestMethod (requestMethod) ؛ if ("get" .equalsignorecase (requestMethod)) httpurlconn.connect () ؛ // عندما تكون هناك بيانات يجب تقديمها إذا (null! = outputStream outputStream = httpurlconn.getOutputStream () ؛ // انتبه إلى تنسيق الترميز لمنع الإخراج الصيني. httpurlconn.getInputStream () ؛ buffer.Append (str) ؛ E.PrintStacktrace () ؛4. في هذه المرحلة ، تم تطوير وظيفة المشاركة ، لكنك ستواجه العديد من المشكلات عند توليد التوقيع. فيما يلي بعض طرق استكشاف الأخطاء وإصلاحها لفشل wx.config.
① تأكيد ما إذا كان التوقيع الذي تم إنشاؤه صحيحًا في http://mp.weixin.qq.com/debug/cgi-bin/sandbox؟t=jsapisign المقدمة بواسطة WeChat للتحقق
② ما إذا كان الطوابع الزمنية المستخدمة في wx.config متوافقًا مع غير المقابل والطابع الزمني المستخدم للتوقيع ... على النحو الوارد أعلاه (1. رمز الخادم)
(من الممكن أنه بسبب مشكلة ترتيب تحميل صفحة JS ، لم يتم الحصول على توقيع الخادم غير المولد ، غير المستقيد ، والجدول الزمني في wx.config).
③ تأكد من أن عنوان URL هو عنوان URL الكامل للصفحة ، بما في ذلك جزء GET Parameter الذي يجب إزالته من ما يلي #
④ هل AppId in Config يتسق مع Appid المستخدم للحصول على JSAPI_TICKET؟
⑤ error {errmsg: config: ok} هو العائد العادي لوضع التصحيح وإيقاف وضع التصحيح. نعم
WX.Config Debug: False ،
تم تجميع هذه المقالة في "ملخص Tutorial Android WeChat Development" ، و "ملخص تعليمي Java WeChat Development" يرحب الجميع بالتعلم والقراءة.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.