Java微信公眾號(hào)開(kāi)發(fā)(一:接入平臺(tái),驗(yàn)證token)開(kāi)發(fā)環(huán)境:
首先,在我們接入微信公眾平臺(tái)之前,我們須要注冊(cè)微信公眾號(hào)的開(kāi)發(fā)者帳號(hào)微信接單平臺(tái),獲取開(kāi)發(fā)者ID(AppID),并設(shè)置你自己的開(kāi)發(fā)者密碼(),服務(wù)器地址(URL),令牌(Token),消息加揭秘秘鑰()等信息,地址在下邊。
前題條件
當(dāng)我們注冊(cè)完開(kāi)發(fā)者帳號(hào)后,登入,在頁(yè)面最下方找到’基本配置’,按需求配置就可以了。這兒注意一點(diǎn)的是,自己的開(kāi)發(fā)者密碼()一定要保存好,前面好多插口的調(diào)用都須要用到。其中上面的一些信息我們后期須要在代碼中用到。
代碼開(kāi)發(fā)
在代碼開(kāi)發(fā)之前,我們應(yīng)當(dāng)看一看他騰訊官方給我們的開(kāi)發(fā)文檔
在開(kāi)發(fā)文檔中的接入手冊(cè)里,我們能明晰的看見(jiàn):微信公眾號(hào)插口必須以或開(kāi)頭微信接單平臺(tái),分別支持80端口和443端口。所以,別逞能,8080可不支持,但假如你做轉(zhuǎn)發(fā),那就另說(shuō)了。
接出來(lái)就是緊張剌激的了。
<dependency>
<groupId>dom4jgroupId>
<artifactId>dom4jartifactId>
<version>1.6.1version>
dependency>
<dependency>
<groupId>com.thoughtworks.xstreamgroupId>
<artifactId>xstreamartifactId>
<version>1.4.9version>
dependency>
上面的jar包看個(gè)人需求。引不引的無(wú)所謂,看心情吧,開(kāi)心才是最重要的了。
首先,我們要曉得,在我們接入微信公眾號(hào)時(shí),微信服務(wù)器會(huì)發(fā)送一條GET懇求到我們填寫(xiě)的服務(wù)器地址URL上,同時(shí)在URL上會(huì)攜帶如下參數(shù)
參數(shù)描述
微信加密簽名,結(jié)合了開(kāi)發(fā)者填寫(xiě)的token參數(shù)和懇求中的參數(shù)、nonce參數(shù)。
時(shí)間戳
nonce
隨機(jī)數(shù)
隨機(jī)字符串
我們須要通過(guò)檢驗(yàn)對(duì)懇求進(jìn)行校準(zhǔn)。若確認(rèn)這次GET懇求來(lái)自微信服務(wù)器,正確返回參數(shù)內(nèi)容,則接入生效,成為開(kāi)發(fā)者,否則接入失敗。
package com.liu.surprise.until;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
* @author HB_LIU
*/
public class WeixinCheckoutUtil {
/**
* token可以自己進(jìn)行定義,必須為英文或者是數(shù)字,長(zhǎng)度為3-32字符,這個(gè)token要跟服務(wù)器配置中的token一致
*/
private static String token = "你的微信公眾號(hào)token";
/**
* 校驗(yàn)簽名
* @param signature 簽名
* @param timestamp 時(shí)間戳
* @param nonce 隨機(jī)數(shù)
* @return 布爾值
*/
public static boolean checkSignature(String signature,String timestamp,String nonce){
String checktext = null;
if (null != signature) {
//對(duì)ToKen,timestamp,nonce 按字典排序
String[] paramArr = new String[]{token,timestamp,nonce};
Arrays.sort(paramArr);
//將排序后的結(jié)果拼成一個(gè)字符串
String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
//對(duì)接后的字符串進(jìn)行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
checktext = byteToStr(digest);
} catch (NoSuchAlgorithmException e){
e.printStackTrace();
}
}
//將加密后的字符串與signature進(jìn)行對(duì)比
return checktext !=null ? checktext.equals(signature.toUpperCase()) : false;
}
/**
* 將字節(jié)數(shù)組轉(zhuǎn)化我16進(jìn)制字符串
* @param byteArrays 字符數(shù)組
* @return 字符串
*/
private static String byteToStr(byte[] byteArrays){
String str = "";
for (int i = 0; i < byteArrays.length; i++) {
str += byteToHexStr(byteArrays[i]);
}
return str;
}
/**
* 將字節(jié)轉(zhuǎn)化為十六進(jìn)制字符串
* @param myByte 字節(jié)
* @return 字符串
*/
private static String byteToHexStr(byte myByte) {
char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] tampArr = new char[2];
tampArr[0] = Digit[(myByte >>> 4) & 0X0F];
tampArr[1] = Digit[myByte & 0X0F];
String str = new String(tampArr);
return str;
}
}
接出來(lái)我們須要傳遞參數(shù)調(diào)用里面的方式進(jìn)行接入,官方文檔中早已說(shuō)明了接入是的懇求為GET懇求,所以,我們須要?jiǎng)?chuàng)建一個(gè)拿來(lái)調(diào)用接入。具體代碼如下
package com.liu.surprise.controller;
import com.liu.surprise.service.MessageService;
import com.liu.surprise.until.WeixinCheckoutUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
/**
* @author HB_LIU
*/
@RestController
@RequestMapping("/wxPublic")
public class WeixinCheckController {
@Resource
MessageService messageService;
private static final Logger LOGGER = LoggerFactory.getLogger(WeixinCheckController.class);
@RequestMapping(method = RequestMethod.GET)
public String checkToken(HttpServletRequest request, HttpServletResponse response) {
// 微信加密簽名,signature結(jié)合了開(kāi)發(fā)者填寫(xiě)的token參數(shù)和請(qǐng)求中的timestamp參數(shù)、nonce參數(shù)。
String signature = request.getParameter("signature");
// 時(shí)間戳
String timestamp = request.getParameter("timestamp");
// 隨機(jī)數(shù)
String nonce = request.getParameter("nonce");
// 隨機(jī)字符串
String echostr = request.getParameter("echostr");
PrintWriter out = null;
try {
out = response.getWriter();
// 通過(guò)檢驗(yàn)signature對(duì)請(qǐng)求進(jìn)行校驗(yàn),若校驗(yàn)成功則原樣返回echostr,否則接入失敗
if (WeixinCheckoutUtil.checkSignature(signature, timestamp, nonce)) {
LOGGER.info("微信加密簽名:" + signature + ";時(shí)間戳:" + timestamp + ";隨機(jī)數(shù):" + nonce);
out.print(echostr);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
out.close();
out = null;
}
return null;
}
}
測(cè)試
微信公眾號(hào)接入、驗(yàn)證token的代碼部份到這就結(jié)束了,接出來(lái)我們須要啟動(dòng)項(xiàng)目,通過(guò)微信公眾平臺(tái)插口測(cè)試工具測(cè)試代碼。并且由于我們的代碼如今是跑在我們本地,微信未能發(fā)送懇求到我們本地,這就須要用到一個(gè)叫外網(wǎng)穿透的工具了,網(wǎng)上有好多,這個(gè)你們就可以自由發(fā)揮了。我用的是ngrok.下載好后,我們通過(guò)命令行cd到ngrok的儲(chǔ)存目錄,輸入下邊的命令。
上一篇:小程序開(kāi)發(fā)的技術(shù)與優(yōu)勢(shì)、技術(shù)、優(yōu)勢(shì)和優(yōu)勢(shì)
下一篇:基于微信小程序的在線點(diǎn)餐系統(tǒng):用科技為美食愛(ài)好者帶來(lái)便捷體驗(yàn)
免責(zé)聲明:部分文章信息來(lái)源于網(wǎng)絡(luò)以及網(wǎng)友投稿,本站只負(fù)責(zé)對(duì)文章進(jìn)行整理、排版、編輯,出于傳遞更多信息之目的,并不意味著贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,如本站文章和轉(zhuǎn)稿涉及版權(quán)等問(wèn)題,請(qǐng)作者在及時(shí)聯(lián)系本站,我們會(huì)盡快為您處理。
- 鄉(xiāng)村小鎮(zhèn)外賣騎手的故事:互聯(lián)網(wǎng)快車下的新生活與兼職收入
- 掃碼點(diǎn)餐成電子時(shí)代新常態(tài),消費(fèi)者體驗(yàn)與隱私保護(hù)需平衡
- 了解外賣平臺(tái)發(fā)展前景后,作者發(fā)表看法,技術(shù)推動(dòng)平臺(tái)升級(jí)
- 同城活動(dòng)報(bào)名系統(tǒng):連接你我,開(kāi)啟無(wú)限可能
- 校園外賣_配送系統(tǒng):打造本地智慧生活服務(wù)的專業(yè) SaaS 系統(tǒng)
- 外賣小程序開(kāi)發(fā)攻略:從需求明確到平臺(tái)選擇,全方位指南
熱門資訊
- 美團(tuán)外賣的抽成規(guī)則 餓了么抽點(diǎn)比例是多少
- 外賣好評(píng)30字有哪些 常見(jiàn)的外賣評(píng)語(yǔ)大全
- 木屋燒烤價(jià)目表一覽 微信外賣訂餐系統(tǒng)推薦
- 海底撈排隊(duì)取號(hào)微信是多少 海底撈是怎么預(yù)約排隊(duì)
- 如何通過(guò)微信掃碼支付找到支付人微信號(hào)?看這里!
- 胡桃里消費(fèi)人均大概是多少錢 二維碼掃碼點(diǎn)餐系統(tǒng)哪個(gè)好用
- 美團(tuán)外賣怎么點(diǎn)兩份?步驟及注意事項(xiàng)!!
- 肯德基優(yōu)惠券怎么獲得 肯德基微信外賣怎么點(diǎn)
- 連鎖收銀系統(tǒng)對(duì)連鎖門店運(yùn)營(yíng)會(huì)有怎么樣的影響?
- 微信公眾號(hào)點(diǎn)餐是怎么實(shí)現(xiàn) 餐飲商家怎么制作外賣訂餐系統(tǒng)