微信公众号Java开发记录(一)接入 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 公众号相关 >

微信公众号Java开发记录(一)接入

发表时间:2020-10-2

发布人:葵宇科技

浏览次数:33

文章目录

  • 一、申请测试号
  • 二、内网穿透接入
  • 三、云服务器接入
  • 三、代码接入
    • 项目结构
    • application.yml
    • Controller
    • ServiceImpl
    • 实体类

微信公众平台开发概述|微信官方文档

一、申请测试号

首先申请测试公众号,
因为我们个人申请的公众号,无法认证,有很多权限无法获得,申请一个测试号会方便很多。
申请测试号

二、内网穿透接入

我们需要用到内网穿透,方便我们测试,直接部署在云服务器上也是可以。
我用到的是免费的Sunny-Ngrok内网转发,如果不稳定的话多试几次就好。
在这里插入图片描述

三、云服务器接入

对接云服务的话需要配置nginx转发

  		location /wx {          
             proxy_pass http://116.62.13.104:8083;
         }

然后重启nginx./nginx -s reload
URL :http://116.62.13.104/wx/
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三、代码接入

在这里插入图片描述
可以看到页面有接口配置信息:
URL就是我们给微信服务器要访问我们的项目的地址,这里我使用的内网穿透,所以使用的是人家分配的域名地址,(只用云服务器的话直接填写正常的ip+port+路径即可)。
Token是我们自己随意定义的。
注意:我们需要当我们的项目(在本地启动起来配置内网穿透或者是在云服务上部署好)能通过URL让微信的服务器访问到才能配置成功。

项目结构

在这里插入图片描述

application.yml

server:
  port: 8083
  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/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
  # 令牌自定义标识
  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;
}

在页面点击提交
在这里插入图片描述

在这里插入图片描述

相关案例查看更多