微信公眾號Java開發記錄(一)接入
微信公眾平臺開發概述|微信官方文件
一、申請測試號
首先申請測試公眾號,
因為我們個人申請的公眾號,無法認證,有很多許可權無法獲得,申請一個測試號會方便很多。
申請測試號
二、內網穿透
我們需要用到內網穿透,方便我們測試,直接部署在雲伺服器上也是可以。
我用到的是免費的Sunny-Ngrok內網轉發,如果不穩定的話多試幾次就好。
三、接入
可以看到頁面有介面配置資訊:
URL
就是我們給微信伺服器要訪問我們的專案的地址,這裡我使用的內網穿透,所以使用的是人家分配的域名地址,(只用雲伺服器的話直接填寫正常的ip+port+路徑即可)。
Token
是我們自己隨意定義的。
注意:我們需要當我們的專案(在本地啟動起來配置內網穿透或者是在雲服務上部署好)能通過URL讓微信的伺服器訪問到才能配置成功。
專案結構
application.yml
server:
port: 8082
tomcat:
# tomcat的URI編碼
uri-encoding: UTF-8
# tomcat最大執行緒數,預設為200
# Tomcat啟動初始化的執行緒數,預設值25
threads:
max: 800
min-spare: 30
spring:
datasource:
url: jdbc:mysql://116.62.13.104:3306/fastdfs?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
show-sql: true
redis:
# 地址
host: 116.62.13.104
# 埠,預設為6379
port: 6379
# 密碼
password:
# 連線超時時間
timeout: 10s
# token配置
token:
# token 值
value: liushihao123
# 令牌自定義標識
header: Authorization
# 令牌祕鑰
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期(預設30分鐘)
expireTime: 30
logging:
file:
path: /data/wx/logs/
Controller
package com.wx.controller;
import com.wx.model.Param;
import com.wx.service.WXService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
/**
* @author :LiuShihao
* @date :Created in 2020/9/28 2:49 下午
* @desc :
*/
@RestController
@RequestMapping("/wx")
public class WXController {
@Autowired
WXService wxService;
/**
* signature 微信加密簽名,signature結合了開發者填寫的token引數和請求中的timestamp引數、nonce引數。
* timestamp 時間戳
* nonce 隨機數
* echostr 隨機字串
*
* 開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。
* 若確認此次GET請求來自微信伺服器,請原樣返回echostr引數內容,則接入生效,成為開發者成功,否則接入失敗。
* @return
*/
@GetMapping
public String test1(Param param) throws IOException {
System.out.println("param:"+param);
if(wxService.check(param)){
System.out.println("接入成功");
//原樣返回
return param.getEchostr();
}else {
System.out.println("接入失敗");
return null;
}
}
}
ServiceImpl
service介面
package com.wx.service.Impl;
import com.wx.model.Param;
import com.wx.service.WXService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
* @author :LiuShihao
* @date :Created in 2020/10/2 1:12 下午
* @desc :
*/
@Service
public class WXServiceImpl implements WXService {
@Value("${token.value}")
public String token;
/**
* 開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。
* 若確認此次GET請求來自微信伺服器,請原樣返回echostr引數內容,則接入生效,成為開發者成功,否則接入失敗。加密/校驗流程如下:
*
* 1)將token、timestamp、nonce三個引數進行字典序排序
* 2)將三個引數字串拼接成一個字串進行sha1加密
* 3)開發者獲得加密後的字串可與signature對比,標識該請求來源於微信
* @param param
* @return
*/
@Override
public boolean check(Param param) {
//1)將token、timestamp、nonce三個引數進行字典序排序
String[] strs = {token,param.getTimestamp(),param.getNonce()};
Arrays.sort(strs);
//2)將三個引數字串拼接成一個字串進行sha1加密
String str = strs[0]+strs[1]+strs[2];
String mysign = sha1(str);
System.out.println("加密前:"+str);
System.out.println("Signature:"+param.getSignature());
System.out.println("mysign::"+mysign);
//3)開發者獲得加密後的字串可與signature對比,標識該請求來源於微信
return param.getSignature().equals(mysign);
}
private String sha1(String str) {
StringBuilder sb = new StringBuilder();
try {
//獲取一個加密物件
MessageDigest md = MessageDigest.getInstance("sha1");
//加密
byte[] digest = md.digest(str.getBytes());
char[] chars = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
//處理加密結果
for (byte b : digest){
sb.append(chars[(b>>4)&15]);
sb.append(chars[b&15]);
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return sb.toString();
}
}
實體類
package com.wx.model;
import lombok.Data;
/**
* @author :LiuShihao
* @date :Created in 2020/9/29 5:13 下午
* @desc :
*/
@Data
public class Param {
/**
* signature 微信加密簽名,signature結合了開發者填寫的token引數和請求中的timestamp引數、nonce引數。
* timestamp 時間戳
* nonce 隨機數
* echostr 隨機字串
* @return
*/
private String signature;
private String timestamp;
private String nonce;
private String echostr;
}
在頁面點選提交
相關文章
- 【Java】微信公眾號開發筆記Java筆記
- 微信公眾號開發教程(一) 驗證接入
- 記一次微信公眾號開發
- 微信公眾號開發
- 微信公眾號開發之坑(一)
- 微信公眾號支付開發手記(node)
- 微信公眾號開發-後端demo(隨錄)後端
- 微信公眾號開發-分享
- Nodejs微信公眾號開發NodeJS
- .net開發微信公眾號
- uni-app微信公眾號web JS-SDK開發之一接入APPWebJS
- 微信公眾號開發 —— 微信網頁授權小記網頁
- 微信公眾號開發(一)基礎配置
- 微信公眾號接入月之暗面Kimi
- 微信公眾號支付開發全過程(Java 版)Java
- 微信開發系列之一 - 微信公眾號開發的開發環境搭建開發環境
- Python+Tornado開發微信公眾號Python
- PHP微信公眾號開發——公共方法PHP
- Laravel+easywechat 開發微信公眾號Laravel
- 微信公眾號測試號開發小結
- 微信公眾號自動回覆_JavaJava
- 微信公眾號讚賞功能開通方法 微信公眾號讚賞如何開通
- 微信公眾號支付踩坑記
- Spring Boot 開發微信公眾號後臺Spring Boot
- 微信公眾號開發之客服訊息
- 微信公眾號開發推送事件排重事件
- 微信公眾號開發Django JSSDK授權DjangoJS
- 微信公眾號接入線上客服系統的方式
- 教你如何用node.js開發微信公眾號(一)Node.js
- 微信sdk 公眾號 微信支付 NFC 坑&筆記筆記
- 微信公眾號開發5-自定義選單-微信開發phpPHP
- NodeJS介紹以及開發微信公眾號ExampleNodeJS
- Nodejs開發微信公眾號中控服務NodeJS
- Python開發微信公眾號後臺(系列二)Python
- 微信公眾號開發Django 網頁授權Django網頁
- 基於.net5 wtm框架、uni-app微信公眾號開發一、公眾號授權框架APP
- 微信公眾號智慧回答
- 微信公眾號託管