微信公眾號Java開發記錄(一)接入

Liu_Shihao發表於2020-10-02


微信公眾平臺開發概述|微信官方文件

一、申請測試號

首先申請測試公眾號,
因為我們個人申請的公眾號,無法認證,有很多許可權無法獲得,申請一個測試號會方便很多。
申請測試號

二、內網穿透

我們需要用到內網穿透,方便我們測試,直接部署在雲伺服器上也是可以。
我用到的是免費的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;
}

在頁面點選提交
在這裡插入圖片描述

在這裡插入圖片描述

相關文章