WeChat 공유 기능 개발
하루 후, 나는 Wechat을 친구에게 보내고 친구 서클과 공유하는 기능을 개발했습니다. 우회를 피하기 위해 여기서 당신과 공유하겠습니다.
1. 서버 측 프로그램
pack javax.servlet.http.httpervletrequest; import javax.servlet.http.httvletresponse; import org.springframework.beans.beans.annotation.autowired; import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.requestmapping; import com.google.gson.gson; import com.wimedia.model.ticket; import com.wimedia.service.articlesolrservice; import com.wimedia.service.ticketreporitory; import com.wimedia.service.ticketrestretretretrestretres com.wimedia.utils.getrandomstr; import com.wimedia.utils.signaturebean; import com.wimedia.utils.weixin.weixinutil;/** * * * <p> project : mryl_phone_v2 </p> * * <p> 패키지 : com.wimedia.controller </p> * * * * * * * * * *<p> 회사 : Wimedia </p> * *@athor : songjia * *@date : 2016-7-15 09:34:10 am */@controller@requestmapping ( "/weixinsharecontroller/api/inteface") public class weixinsharecontroller {@autowired private ticketrepositorationsolr repository solr. @requestmapping ( "/getsignature") public string getSignature (httpservletrequest 요청, httpservletrepsonge 응답)는 ioexception, parseexception {// 서명 페이지 링크 문자열 url = request.getParameter ( "url"); simpledateformat 형식 = 새로운 simpledateformat ( "yyyy-mm-dd hh : mm : ss"); // 데이터베이스에서 태그를 가져 와서 태그가 만료되는지 확인하십시오. Ticket OldTicket = TicketRepositorySolr.getTicketById ( "201601114Wiimmediamrylsong1152"); if (OldTicket == null) {// 처음 액세스 할 때 태그가 존재하지 않습니다. executeTicket (응답, "1", URL, 형식); 널 리턴; } else {// 태그가 존재합니다. 태그가 정시되어 있는지 여부를 결정하십시오. long different = format.parse (format.format (new date ()). gettime ()-format.parse (OldAcquireTime) .getTime (); if (차이> 71000000) {// 태그 타임 아웃, WeChat 서버로 이동하여 태그 타임 아웃을 7200 초 (72000000 밀리 초) ExecuteTicket (응답, "2", URL, Format)입니다. 널 리턴; } else {// 태그가 시간을 초과하지 않았습니다./*** 참고* 1. 서명에 사용되는 비 시세 및 타임 스탬프는 WX.config의 비 시세 및 타임 스탬프와 동일해야합니다. * 2. 서명에 사용되는 URL은 JS 인터페이스를 호출하는 페이지의 전체 URL이어야합니다. * 3. 보안상의 이유로 개발자는 서버 측에서 서명 로직을 구현해야합니다. ***** 포인트 1에 따라 서명을 구성 할 때 오류를 쉽게 만들 수 있습니다. 클라이언트에게 티켓을 생성하는 비 CEST 및 타임 스탬프를 전달해야합니다 ****/ String Signature = Signature (OldTicket.getTicket (), OldTicket.getTimeStamp (), OldTicket.getNoncest (), URL); SignatureBean SignatureBean = New SignatureBean (); SignatureBean.setNoncest (OldTicket.getNoncest ()); SignatureBean.SetSignature (서명); SignatureBean.setTimeStamp (OldTicket.getTimestamp ()); SignatureBean.setUrl (URL); Response.setContentType ( "Text/Html; charset = utf-8"); response.getWriter (). print (new Gson (). tojson (signatureBean)); 널 리턴; }}}}/** * * <p> 프로젝트 : mryl_phone_v2 </p> * * <p> : mryl_phone_v2 </p> * <p> 설명 : 티켓을 업데이트하고받는 방법. Solr이 사용되기 때문에 업데이트는 새 업데이트와 동일합니다. ID가 없으면 추가됩니다. 책임이 있다면, 업데이트 </p> * * <p> 회사 : wiimedia </p> * *@athor : songjia * *@date : 2016-7-15 09:45:00 am */public void executeTicket (httpservletResponse 응답, 문자열, String URL, Simplededate Format) {// string thenation and the string thenation intration {// getrandomstr (); 문자열 noncestr = randomstr.getRandomString (15); // 서명 타임 스탬프 문자열을 가져옵니다. 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.fromjson (Tokenjson, ShareAccess_token.class); 문자열 to = token.getAccess_token (); // 태그 문자열 urlticket = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+to+"& type = jsapi"; String TicketJson = weixinutil.httprequest (urlticket, "get", null); 티켓 티켓 = gson.fromjson (TicketJson, ticket.class); 문자열 t = ticket.getTicket (); // string uuid = uuid.randomuuid (). tostring (). trim (). replaceall ( "-", ""); // 내 티켓 ID는 죽은 문자열 획득 시간 = format.format (new Date ())입니다. ticket.settid ( "201601114wiimmediamrylsong1152"); Ticket.setAcquireTime (AcquireTime); ticket.settimestamp (timestamp); ticket.setNoncest (비정규); // Solr이 사용되므로 업데이트 및 추가 방법은 동일합니다. 특정 요구에 따라 수정할 수 있습니다. 이 기사는 더 이상 포스트 코드가 아닙니다. if (flag.equals ( "2")) {TicketRepositorySolr.addtickettosolr (티켓); } else {TicketRepositorySolr.addtickettosolr (티켓); } /*** 참고* 1. 서명에 사용되는 비 시세 및 타임 스탬프는 WX.config의 비 CESTR 및 타임 스탬프와 동일해야합니다. * 2. 서명에 사용되는 URL은 JS 인터페이스를 호출하는 페이지의 전체 URL이어야합니다. * 3. 보안상의 이유로 개발자는 서버 측에서 서명 로직을 구현해야합니다. * * 지점 1에 따르면 서명을 구성 할 때 오류를 쉽게 만들 수 있습니다. 클라이언트에 티켓을 생성하는 비 시세 및 타임 스탬프를 전달해야합니다 */ String Signature = Signature (t, timestamp, noncest, url); SignatureBean SignatureBean = New SignatureBean (); SignatureBean.setNoncest (비정부); SignatureBean.SetSignature (서명); SignatureBean.setTimestamp (timestamp); SignatureBean.setUrl (URL); Response.setContentType ( "Text/Html; charset = utf-8"); response.getWriter (). print (new Gson (). tojson (signatureBean)); }/** * * <p> 프로젝트 : mryl_phone_v2 </p> * * <p> : mryl_phone_v2 </p> * * <p> 설명 : 태그, 타임 스탬프, 키, URL에 기반한 서명 </p> * * <p> 회사 : wiimedia </p> *@athor : 송지지 * *@DATE : 2016-7-15 09:37. 개인 문자열 서명 (문자열 jsapi_ticket, 문자열 타임 스탬프, 문자열 비 시스트, 문자열 URL) {jsapi_ticket = "jsapi_ticket =" + jsapi_ticket; timestamp = "timestamp =" + timestamp; noncest = "noncest =" + noncestres; url = "url =" + url; 문자열 [] arr = new String [] {jsapi_ticket, timestamp, noncest, url}; // 사전 토큰 정렬, 타임 스탬프, 비 시스트, URL 매개 변수 배열 (ARR); StringBuilder content = new StringBuilder (); for (int i = 0; i <arr.length; i ++) {content.append (arr [i]); if (i! = arr.length -1) {content.append ( "&"); }} MessageDigest md = null; 문자열 tmpstr = null; try {md = messageDigest.getInstance ( "SHA-1"); // SHA1 암호화 바이트에 대한 문자열로 세 개의 매개 변수 문자열을 스플 라이스로 스플 라스로 스플 라스 (splice). tmpstr = bytetoStr (digest); } catch (nosuchalgorithmexception e) {e.printstacktrace (); } content = null; 반환 tmpstr; } / ** * 바이트를 16 진수 문자열로 변환 * @param mbyte * @return * / private static string bytetoHexstr (byte mbyte) {char [] digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',', ',', ',', ',', ',', ',', '', '9' 'e', 'f'}; char [] temparr = new char [2]; temparr [0] = digit [(mbyte >>> 4) & 0x0f]; temparr [1] = 숫자 [mbyte & 0x0f]; 문자열 s = 새 문자열 (temparr); 반환 s; } / ** * 바이트 배열을 16 진수 문자열로 변환 * * @param bytearray * @return * / private static string bytetoStr (byte [] bytearray) {String strdigest = ""; for (int i = 0; i <bytearray.length; i ++) {strdigest+= bytetohexstr (bytearray [i]); } return strdigest; } class shareAccess_token {private string access_token; 개인 문자열 expires_in; 공개 문자열 getAccess_token () {return access_token; } public void setAccess_token (String AccessToken) {access_token = accessToken; } public String getExpires_in () {return expripes_in; } public void setexpires_in (String expiresin) {expires_in = expiresin; }}}2. 클라이언트 코드.
<script type = "text/javaScript"> var url = window.location.href; var article = ""; var sharetitle = "내일의 의료 정보"; var shareimgurl = ""; var userInfo = localStorage.getItem ( "_ userInfo"); var 타임 스탬프; var 비정부; var 서명; // 서명 get $ .ajax ({type : "get", url : "weixinsharecontroller/api/inteface/getsignature", // data : {timestamp : timestamp, noncestr, url : url}, data : {url : url}, success (data) {jon.parse (data); timeStamp. timeStamp; 함수 wxshare () {wx.config ({debug : false, // 디버그 모드 켜기, 모든 API의 반환 값은 클라이언트에서 경고됩니다. 전달 된 매개 변수를 보려면 PC 측에서 열 수 있습니다. 매개 변수 정보는 로그를 통해 인쇄 될 수 있으며 PC 측에서만 인쇄 될 것입니다. 공식 계정 타임 스탬프의 식별자 : Timestamp, // 필수, 서명의 타임 스탬프를 생성합니다. 비 후시자, // 필수, 서명, // 서명, 서명, 부록 1 JSapilist를 참조하십시오 : [ 'onmenushareappMessage'] // js interfaces of js interfaces of js interfaces of js interfaces of js interfaces. }); } wx.ready (function () {// 구성 정보 확인 후 준비 메소드가 실행됩니다. 구성 인터페이스가 결과를 얻은 후 모든 인터페이스 호출을 얻어야합니다. // 구성은 클라이언트의 비동기 조작입니다. 따라서 페이지를로드 할 때 관련 expections를 호출 해야하는 경우, ehrication을 호출 해야하는 경우 // 인터페이스를 호출 해야하는 경우 // 인터페이스를 호출해야합니다. 트리거, 그들은 준비된 기능에 넣지 않고 직접 호출 할 수 있습니다 // ------------ "친구와 공유"WX.ONMENUSHAREAPPMESSAGE ({TOMORRON의 의료 정보 ", // shareTitle, // 공유 설명 링크 : url, // shareimgurl, // share worly, worly, worly, worly, worly, worly, worly, share) 링크 DataUrl : '', // 유형이 음악 또는 비디오 인 경우 데이터 링크를 제공해야합니다. 기본값은 빈 성공입니다. function () {// 콜백 함수가 공유를 확인한 후}, cance () {// 공유 후 실행 된 콜백 함수}); // ---------------------- "친구에게 공유"WX.ONMENUSHARETIMELEN ({제목 : '내일 의료 정보', // 제목 링크 공유 : // 링크 공유 IMGURL : SHAREIMGURL, // ICON SUCCENCE 공유 : 기능 () {// 사용자 공유 확인 후 실행} {// Callback Onctions Affered reconced reconceed} {// Callback Opctions} //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- The callback function executed after the user confirms the 공유}, 취소 : function () {// 사용자가 공유}}를 취소 한 후 실행 된 콜백 함수); //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------3. 서버가 요구하는 도구 및 모델
① 티켓
패키지 com.wimedia.model; 공개 클래스 티켓 {private String tid; 개인 문자열 티켓; 개인 문자열 errcode; 개인 문자열 errmsg; 개인 문자열 expires_in; 개인 문자열 획득 시간; 개인 문자열 비 시세; 개인 문자열 타임 스탬프; 공개 티켓 (문자열 TID, 문자열 티켓, 문자열 errcode, String errmsg, String ExpiresIn, String arciditionTime, String Noncestring, String timestamp) {super (); this.tid = tid; this.ticket = 티켓; this.errcode = errcode; this.errmsg = errmsg; expires_in = expiresin; this.acquiretime = AcquireTime; this.noncest = noncestres; this.timestamp = 타임 스탬프; } public String getTid () {return TID; } public void settid (String tid) {this.tid = tid; } public String getTicket () {반환 티켓; } public void setticket (문자열 티켓) {this.ticket = 티켓; } public String geterRcode () {return errcode; } public void seterRcode (String errcode) {this.errcode = errcode; } public String getErrmsg () {return errmsg; } public void seterRmsg (String errmsg) {this.errmsg = errmsg; } public String getExpires_in () {return expripes_in; } public void setexpires_in (String expiresin) {expires_in = expiresin; } public String getAcquireTime () {return accisionTime; } public void setAcquireTime (String arceEtime) {this.acquiretime = arceEtime; } public string getNoncest () {return noncestres; } public void setNoncest (String noncestr) {this.noncest = noncestres; } public String getTimestamp () {return timestamp; } public void settimestamp (String timestamp) {this.timestamp = timestamp; }} ② 데이터베이스에 추가 된 비즈니스는 귀하의 요구에 따라 구현됩니다.
getrandomstr
package com.wiimedia.utils; import java.util.random; public class getrandomstr {/** * * <p> project : mryl_phone_v2 </p> * * <p> : mryl_phone_v2 </p> * * <p> 설명 : 인스턴트 문자열 생성 </p> * <p> Company : wiimedia </p> * * <p> company : *@Date : 2016-7-14 11:14:46 AM * */ public String getRandomString (int length) {String base = "abcdefghijklmnopqrstuvwxyz0123456789"; 랜덤 random = new random (); StringBuffer sb = new StringBuffer (); for (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 noncestres; 개인 문자열 URL; 개인 문자열 타임 스탬프; 개인 문자열 서명; public String getNoncest () {return noncestres; } public void setNoncest (String noncestr) {this.noncest = noncestres; } 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 getSignature () {return signature; } public void setSignature (문자열 서명) {this.signature = signature; }}weixinutil
package com.wimedia.utils.weixin; import java.io.bufferedReader; import java.io.inputStream; import java.io.inputStreamReader; import java.io.outputStream; import java.net.connectexception; import java.net.url; import javax.net.sssl.htpurnection; javax.net.ssl.sslcontext; import javax.net.ssl.sslsocketfactory; import javax.net.ssl.trustmanager;/** * * <p> project : mryl_phone_v2 </p> * * * <p> : mrylphone_v2 </p> * <Publact Face Interface </p> * * * <p> 회사 : wiimedia </p> * * @athor : songjia * * @date : 2016-7-15 09:37:13 am */public class weixinutil {/** * https 요청 시작 및 결과 가져 오기 * @param request request 주소 * @param request request (post, post) * @param jsetrun jsetrun jsetrun jsetrun jsetrun jsetrun jsetrun jsetrun jsetron jsonobject.get (key))을 통한 JSON 객체의 값 */ public static string httpRequest (문자열 requestUrl, String requestMethod, String outputStrs) {StringBuffer buffer = new StringBuffer (); {// sslcontext 객체를 만들고 trustmanager [] tm = {new myx509trustmanager ()}; sslcontext sslcontext = sslcontext.getInstance ( "ssl", "sunjsse"); sslcontext.init (null, tm, new java.security.securerandom ()); // 위의 sslcontext 객체에서 sslsocketfactory 객체를 가져옵니다. sslsocketfactory ssf = sslcontext.getSocketFactory (); url url = 새 URL (requestUrl); httpsurlconnection httpurlconn = (httpsurlConnection) url.openConnection (); httpurlconn.setsslsocketfactory (SSF); httpurlconn.setdooutput (true); httpurlconn.setdoinput (true); httpurlconn.setusecaches (false); // 요청 메소드 설정 (get/post) httpurlconn.setRequestMethod (requestMethod); if ( "get".EqualSeignoreCase (requestMethod)) httpurlconn.connect (); // if (null! = outputStream outputStream = httpurlconn.getOutputStream (); // If를 제출 해야하는 데이터가있을 때, 중국어가 달린 outputStream.write (outputStr.getBytes ( "utf-8")); outputStream.close (); = httpurlconn.getinputStream () inputStreamReader (inputStream, "utf-8"); bufferedReader.close. 반환 "";}}4.이 시점에서 공유 기능이 개발되었지만 서명을 생성 할 때 많은 문제가 발생합니다. 다음은 wx.config 고장에 대한 몇 가지 문제 해결 방법입니다.
http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 확인에서 생성 된 서명이 올바른지 확인하십시오.
wx.config에 사용되는 비 시세, 타임 스탬프가 서명하는 데 사용되는 해당 비 시세 및 타임 스탬프와 일치하는지 여부 ... 위와 같이 (1. 서버 코드)
(JS 페이지로드 오더 문제로 인해 서버 생성 서명, 비 시세 및 타임 스탬프가 wx.config에서 얻지 못했을 수도 있습니다).
∎ URL이 페이지의 완전한 URL인지 확인합니다.
config의 appid는 jsapi_ticket을 얻는 데 사용되는 appid와 일치합니까?
Or 좋아요
wx.config debug : false,
이 기사는 "Android WeChat Development Tutorial Summary"로 편집되었으며 "Java WeChat Development Tutorial Summary"는 모두가 배우고 읽을 수 있도록 환영합니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.