知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
您當(dāng)前位置>首頁 » 新聞資訊 » 公眾號相關(guān) >
微信公眾號Java開發(fā)記錄(一)接入
發(fā)表時間:2020-10-2
發(fā)布人:葵宇科技
瀏覽次數(shù):62
文章目錄
- 一、申請測試號
- 二、內(nèi)網(wǎng)穿透接入
- 三、云服務(wù)器接入
- 三、代碼接入
- 項目結(jié)構(gòu)
- application.yml
- Controller
- ServiceImpl
- 實體類
微信公眾平臺開發(fā)概述|微信官方文檔
一、申請測試號
首先申請測試公眾號,
因為我們個人申請的公眾號,無法認(rèn)證,有很多權(quán)限無法獲得,申請一個測試號會方便很多。
申請測試號
二、內(nèi)網(wǎng)穿透接入
我們需要用到內(nèi)網(wǎng)穿透,方便我們測試,直接部署在云服務(wù)器上也是可以。
我用到的是免費的Sunny-Ngrok內(nèi)網(wǎng)轉(zhuǎn)發(fā),如果不穩(wěn)定的話多試幾次就好。
三、云服務(wù)器接入
對接云服務(wù)的話需要配置nginx轉(zhuǎn)發(fā)
location /wx {
proxy_pass http://116.62.13.104:8083;
}
然后重啟nginx./nginx -s reload
URL :http://116.62.13.104/wx/
三、代碼接入
可以看到頁面有接口配置信息:
URL
就是我們給微信服務(wù)器要訪問我們的項目的地址,這里我使用的內(nèi)網(wǎng)穿透,所以使用的是人家分配的域名地址,(只用云服務(wù)器的話直接填寫正常的ip+port+路徑即可)。
Token
是我們自己隨意定義的。
注意:我們需要當(dāng)我們的項目(在本地啟動起來配置內(nèi)網(wǎng)穿透或者是在云服務(wù)上部署好)能通過URL讓微信的服務(wù)器訪問到才能配置成功。
項目結(jié)構(gòu)
application.yml
server:
port: 8083
tomcat:
# tomcat的URI編碼
uri-encoding: UTF-8
# tomcat最大線程數(shù),默認(rèn)為200
# Tomcat啟動初始化的線程數(shù),默認(rèn)值25
threads:
max: 800
min-spare: 30
spring:
datasource:
url: jdbc:mysql://116.62.13.104:3306/countdown?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
port: 6379
# token配置
token:
# token 值
value: liushihao123
# 令牌自定義標(biāo)識
header: Authorization
# 令牌秘鑰
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期(默認(rèn)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結(jié)合了開發(fā)者填寫的token參數(shù)和請求中的timestamp參數(shù)、nonce參數(shù)。
* timestamp 時間戳
* nonce 隨機數(shù)
* echostr 隨機字符串
*
* 開發(fā)者通過檢驗signature對請求進(jìn)行校驗(下面有校驗方式)。
* 若確認(rèn)此次GET請求來自微信服務(wù)器,請原樣返回echostr參數(shù)內(nèi)容,則接入生效,成為開發(fā)者成功,否則接入失敗。
* @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;
/**
* 開發(fā)者通過檢驗signature對請求進(jìn)行校驗(下面有校驗方式)。
* 若確認(rèn)此次GET請求來自微信服務(wù)器,請原樣返回echostr參數(shù)內(nèi)容,則接入生效,成為開發(fā)者成功,否則接入失敗。加密/校驗流程如下:
*
* 1)將token、timestamp、nonce三個參數(shù)進(jìn)行字典序排序
* 2)將三個參數(shù)字符串拼接成一個字符串進(jìn)行sha1加密
* 3)開發(fā)者獲得加密后的字符串可與signature對比,標(biāo)識該請求來源于微信
* @param param
* @return
*/
@Override
public boolean check(Param param) {
//1)將token、timestamp、nonce三個參數(shù)進(jìn)行字典序排序
String[] strs = {token,param.getTimestamp(),param.getNonce()};
Arrays.sort(strs);
//2)將三個參數(shù)字符串拼接成一個字符串進(jìn)行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)開發(fā)者獲得加密后的字符串可與signature對比,標(biāo)識該請求來源于微信
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'};
//處理加密結(jié)果
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結(jié)合了開發(fā)者填寫的token參數(shù)和請求中的timestamp參數(shù)、nonce參數(shù)。
* timestamp 時間戳
* nonce 隨機數(shù)
* echostr 隨機字符串
* @return
*/
private String signature;
private String timestamp;
private String nonce;
private String echostr;
}
在頁面點擊提交
相關(guān)案例查看更多
相關(guān)閱讀
- 正規(guī)網(wǎng)站建設(shè)公司
- 云南網(wǎng)站建設(shè)服務(wù)公司
- 昆明網(wǎng)站開發(fā)
- 網(wǎng)站建設(shè)報價
- 云南手機網(wǎng)站建設(shè)
- 云南省建設(shè)廳網(wǎng)站官網(wǎng)
- 云南網(wǎng)站建設(shè)方法
- 網(wǎng)站開發(fā)
- 云南軟件開發(fā)
- 云南網(wǎng)站建設(shè)百度官方
- 云南網(wǎng)站建設(shè)特性
- 昆明網(wǎng)站建設(shè)公司
- 云南網(wǎng)站建設(shè)方案 doc
- 小程序定制開發(fā)
- 網(wǎng)絡(luò)公司報價
- 企業(yè)網(wǎng)站
- 網(wǎng)站維護(hù)
- 人口普查小程序
- 云南網(wǎng)站建設(shè)哪家公司好
- 汽車報廢回收管理軟件
- asp網(wǎng)站
- 開發(fā)制作小程序
- 高端網(wǎng)站建設(shè)公司
- 云南網(wǎng)站建設(shè)百度
- SEO
- web開發(fā)
- 云南網(wǎng)站建設(shè)首頁
- 商標(biāo)注冊
- .net網(wǎng)站
- 昆明小程序公司