欧美午夜精品久久久久免费视/欧美黄色精品/国产一级A片在线播出/A片免费视频在线观看

(案例分析)微信服務(wù)器的開(kāi)發(fā)環(huán)境和接入
2023-09-09 00:00:31 歡樂(lè)點(diǎn)

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ǔ)存目錄,輸入下邊的命令。

免責(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ì)盡快為您處理。

歡樂(lè)點(diǎn)

留言咨詢

×