WeChat 플랫폼의 배경 액세스와 관련하여 공무원은 PHP 예제의 다운로드를 제공했습니다. Java의 배경 액세스를 위해서는 현재 직접 사용할 수있는 완전한 사례가 없습니다. 나는 모두가 사용할 수 있도록 자바 버전의 데모를 썼습니다.
1. 준비
이 프로젝트는 Maven으로 제작되었으며 Eclipse로 직접 가져올 수 있습니다. JDK 버전은 1.8.0_111입니다. 이 두 항목은 실제 요구에 따라 수정 될 수 있으며 마지막으로 전쟁은 서버에 공개됩니다.
2. 실제 훈련
작동하기 전에 공식 문서를 먼저 읽고 전체 아이디어 프로세스가 있습니다. 공식 주소를 참조하십시오.
1. 개발자 모드로 설정 :
WeChat 공개 플랫폼 배경에 로그인 한 후 "기능" - "고급 기능" - "개발 모드"를 클릭하여 개발 모드에 들어갑니다. 공개 플랫폼이 "아직 개발자가되지 않는다"는 경우 "개발자가되기"를 클릭하십시오.
2. 서버 구성 채우기 :
"개발" - "기본 구성" - "서버 구성 채우기"그림 1 ~ 3을 클릭하십시오.
그림 1
그림 2
그림 3
3. 샘플 코드 :
Sha1.java
패키지 com.dqiang.demo; 공개 클래스 SHA1 {private final int [] abcde = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0}; // 초록 데이터 저장 배열 개인 int [] digestint = new int [5]; // 임시 데이터 저장 배열 개인 int [] tmpdata = new int [80]; // SHA-1 DIGEST 개인 int process_input_bytes (byte [] bytedata) {// 상수 시스템의 예비 시험 (abcde, 0, digestint, 0, abcde.length); // 입력 바이트 배열, Supplement 10 및 Length Data Byte [] NewByte = BytearRayformatData (byteArrayformatdata); // 데이터 요약에 대해 계산 된 데이터 단위 수를 가져옵니다. int mcount = newbyte.length / 64; // (int pos = 0; pos <mcount; pos ++)에 대한 각 데이터 단위를 요약하려는 루프 {// 각 장치의 데이터를 16 개의 정수 데이터로 변환하고 (int j = 0; j <16; j ++) {tmpdata [j] = bytearraytoint (pos * 64))에 대한 tmpdata의 첫 16 개의 배열 요소에 저장합니다. } // 초록 계산 함수 encrypt (); } 반환 20; } // 형식 입력 바이트 배열 형식 비공개 바이트 [] bytearrayformatdata (byte [] bytedata) {// 보완 수 0 int Zeros = 0; // 보완 후 총 숫자 수 int size = 0; // 원래 데이터 길이 int n = bytedata.length; // 모드 64 이후의 나머지 숫자 숫자 int m = n % 64; // 10 If (m <56) {Zeros = 55 -m; 크기 = n -m + 64; } else if (m == 56) {Zeros = 63; 크기 = n + 8 + 64; } else {Zeros = 63 -m + 56; 크기 = (n + 64) -m + 64; } // BYTE를 채운 후 생성 된 새 배열의 내용 [] NewByte = new Byte [size]; // 배열 시스템의 이전 부분을 복사합니다. ArrayCopy (ByTedata, 0, NewByte, 0, N); // 배열 int l = n의 추가 데이터 요소의 위치를 가져옵니다. // 보체 1 작동 NewByte [l ++] = (바이트) 0x80; // 보체 0 작동 (int i = 0; i <Zeros; i ++) {newbyte [l ++] = (byte) 0x00; } // 데이터 길이를 계산하고 데이터 길이 비트는 총 8 바이트, 긴 정수 긴 n = (long) n * 8입니다. 바이트 H8 = (바이트) (n & 0xff); 바이트 H7 = (바이트) ((n >> 8) & 0xff); 바이트 h6 = (바이트) ((n >> 16) & 0xff); 바이트 h5 = (바이트) ((n >> 24) & 0xff); 바이트 h4 = (바이트) ((n >> 32) & 0xff); 바이트 h3 = (바이트) ((n >> 16) & 0xff); 바이트 h5 = (바이트) ((n >> 24) & 0xff); 바이트 h4 = (바이트) ((n >> 32) & 0xff); 바이트 h3 = (바이트) ((n >> 40) & 0xff); 바이트 h2 = (바이트) ((n >> 48) & 0xff); 바이트 H1 = (바이트) (n >> 56); Newbyte [l ++] = h1; Newbyte [l ++] = h2; Newbyte [l ++] = h3; Newbyte [l ++] = h4; Newbyte [l ++] = h5; Newbyte [l ++] = h6; Newbyte [l ++] = h7; Newbyte [l ++] = h8; Newbyte를 반환합니다. } private int f1 (int x, int y, int z) {return (x & y) | (~ x & z); } private int f2 (int x, int y, int z) {return x ^ y ^ z; } private int f3 (int x, int y, int z) {return (x & y) | (X & Z) | (Y & Z); } private int f4 (int x, int y) {return (x << y) | x >>> (32 -y); } // 단위 요약 계산 함수 private void alcrypt () {for (int i = 16; i <= 79; i ++) {tmpdata [i] = f4 (tmpdata [i -3] ^ tmpdata [i -8] ^ tmpdata [i -14] ^ tmpdata [i -16], 1); } int [] tmpabcde = new int [5]; for (int i1 = 0; i1 <tmpabcde.length; i1 ++) {tmpabcde [i1] = digestint [i1]; } for (int j = 0; j <= 19; j ++) {int tmp = f4 (tmpabcde [0], 5) + f1 (tmpabcde [1], tmpabcde [2], tmpabcde [3]) + tmpabcde [4] + tmpdata [j] + 0x5a827999; tmpabcde [4] = tmpabcde [3]; tmpabcde [3] = tmpabcde [2]; tmpabcde [2] = f4 (tmpabcde [1], 30); tmpabcde [1] = tmpabcde [0]; TMPABCDE [0] = TMP; } for (int k = 20; k <= 39; k ++) {int tmp = f4 (tmpabcde [0], 5) + f2 (tmpabcde [1], tmpabcde [2], tmpabcde [3]) + tmpabcde [4] + tmpdata [k] + 0x6ed9eba1; tmpabcde [4] = tmpabcde [3]; tmpabcde [3] = tmpabcde [2]; tmpabcde [2] = f4 (tmpabcde [1], 30); tmpabcde [1] = tmpabcde [0]; TMPABCDE [0] = TMP; } (int l = 40; l <= 59; l ++) {int tmp = f4 (tmpabcde [0], 5) + f3 (tmpabcde [1], tmpabcde [2], tmpabcde [3]) + tmpabcde [4] + tmpdata [l] + 0x8f1bbcdc; tmpabcde [4] = tmpabcde [3]; tmpabcde [3] = tmpabcde [2]; tmpabcde [2] = f4 (tmpabcde [1], 30); tmpabcde [1] = tmpabcde [0]; TMPABCDE [0] = TMP; } (int m = 60; m <= 79; m ++) {int tmp = f4 (tmpabcde [0], 5) + f2 (tmpabcde [1], tmpabcde [2], tmpabcde [3]) + tmpabcde [4] + tmpdata [m] + 0xca62c1d6; tmpabcde [4] = tmpabcde [3]; tmpabcde [3] = tmpabcde [2]; tmpabcde [2] = f4 (tmpabcde [1], 30); tmpabcde [1] = tmpabcde [0]; TMPABCDE [0] = TMP; } for (int i2 = 0; i2 <tmpabcde.length; i2 ++) {diGestint [i2] = digestint [i2]+tmpabcde [i2]; } for (int n = 0; n <tmpdata.length; n ++) {tmpdata [n] = 0; }} // 4 바이트 배열을 정수 개인 int bytearraytoint (byte [] byteArraytoint, int i)로 변환합니다 (return ((bytedata [i] & 0xff) << 24) | ((bytedata [i + 1] & 0xff) << 16) | ((bytedata [i + 2] & 0xff) << 8) | (bytedata [i + 3] & 0xff); } // 정수를 4 바이트 어레이로 변환하여 개인 void inttobytearray (int intvalue, byte [] bytedata, int i) {bytedata [i] = (byte) (intvalue >>> 24); byteData [i + 1] = (byte) (intvalue >>> 16); byteData [i + 2] = (byte) (intvalue >>> 8); ByteData [i + 3] = (바이트) intvalue; } // 바이트를 16 진수 문자열로 변환합니다. 개인 정적 문자열 bytetoHexString (byte ib) {char [] digit = { '0', '1', '2', '3', '4', '4', '6', '7', '8', '9', '', 'b', 'c', 'd', 'e', 'e'; char [] ob = new char [2]; ob [0] = 숫자 [(ib >>> 4) & 0x0f]; OB [1] = 숫자 [IB & 0x0F]; 문자열 s = 새 문자열 (OB); 반환 s; } // 바이트 배열을 16 진수 문자열로 변환 개인 정적 문자열 bytearraytoHexString (byte [] bytearRay) {String strdigest = ""; for (int i = 0; i <bytearray.length; i ++) {strdigest+= bytetohexstring (bytearray [i]); } return strdigest; } // SHA-1 다이제스트를 계산하고 해당 바이트 배열 공개 바이트 [] getDigestOfbytes (byte [] bytedata) {process_input_bytes (bytedata); 바이트 [] 다이제스트 = 새로운 바이트 [20]; for (int i = 0; i <digestint.length; i ++) {inttobytearray (digestint [i], digest, i * 4); } 반환 다이제스트; } // SHA-1 다이제스트를 계산하고 해당 16 진수 문자열 공개 문자열 getDigestOfString (byte [] bytedata) {return bytearraytoHexString (getDigestOfBytes (bytedata)); } public static void main (String [] args) {String data = "Tokendemo"; System.out.println (데이터); 문자열 다이제스트 = new SHA1 (). getDigestOfString (data.getBytes ()); System.out.println (Digest); }}Wechatjavatokenvalidate.java
패키지 com.dqiang.demo; import java.io.IOException;import java.util.Arrays;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.httpservletresponse; /** * @author stemq * @version v1.0 * 블로그 : http : //blog.csdn.net/stemq * web : www.dqiang.com */public class wechatjavatokenvalidate httpservlet {private static final long serialversionionuid = -6761982938477193120 / * 예를 들어 * URL (서버 주소) http://weixin.xxxx.com/wechatjavatokenvalidate/wechattoken * token (token) tokenchat */private String token = "Tokenchat"; // 실제 상황에 따라 직접 토큰을 정의하고 @override Protected Void Doget (httpservletrequest 요청, httpservletreponse 응답)과 동일한 서버 구성 토큰 (토큰)을 채우십시오. servletexception, ioexception {// wechat endature signature = requestature ( "); // random String String echostr = request.getParameter ( "echostr"); // timeStamp String timestamp = request.getParameter ( "timestamp"); // 랜덤 번호 문자열 nonce = request.getParameter ( "nonce"); 문자열 [] str = {토큰, 타임 스탬프, nonce}; // 사전 정렬 array.sort (str); 문자열 bigstr = str [0] + str [1] + str [2]; // SHA1 암호화 문자열 다이제스트 = new SHA1 (). getDigestOfString (bigstr.getBytes ()). tolowercase (); // weChat If (digest.equals (signature)) {response.getWriter (). print (echostr); }}}3. 소스 코드 다운로드 : Wechatjavatokenvalidate
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.