微信开发——基于springboot接入微信公众号(ngrok内网穿透技术)

一、申请测试公众号

用自己的微信扫一扫就可以申请,各个接口权限也都是开着的。

二、在spring工程下写好一个controller

要保证能在你的电脑上成功启动。
package com.aim.jsr.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * Created by Amy on 2018/1/26.
 */
@RestController
public class WechatController {

    private String TOKEN = "good";

    /**
     * @param signature 微信加密签名,结合了开发者填写的token参数和请求中的timestamp参数、nonce参数
     * @param timestamp 时间戳
     * @param nonce 随机数
     * @param echostr 随机字符串
     * @return
     */
    @GetMapping("/wxdemo")
    public String test(@RequestParam("signature") String signature,
                       @RequestParam("timestamp") String timestamp,
                       @RequestParam("nonce") String nonce,
                       @RequestParam("echostr") String echostr) {

        //将token、timestamp、nonce三个参数进行字典序排序
        String sortString = sort(TOKEN, timestamp, nonce);
        //将三个参数字符串拼接成一个字符串进行sha1加密
        String myString = sha1(sortString);
        //开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
        if (myString != null && myString != "" && myString.equals(signature)) {
            System.out.println("签名校验通过");
            //如果检验成功原样返回echostr,微信服务器接收到此输出,才会确认检验完成。
            return echostr;
        } else {
            System.out.println("签名校验失败");
            return "";
        }
    }

    public String sort(String token, String timestamp, String nonce) {
        String[] strArray = {token, timestamp, nonce};
        Arrays.sort(strArray);
        StringBuilder sb = new StringBuilder();
        for (String str : strArray) {
            sb.append(str);
        }

        return sb.toString();
    }

    public String sha1(String str) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-1");
            digest.update(str.getBytes());
            byte messageDigest[] = digest.digest();
            // Create Hex String
            StringBuffer hexString = new StringBuffer();
            // 字节数组转换为 十六进制 数
            for (int i = 0; i < messageDigest.length; i++) {
                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }
            return hexString.toString();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

}
能看到这个controller里能接收的token为“good”。

三、接口配置信息

在这里我们需要一个url和一个token。这个url指的是能够接收处理微信服务器发送的GET/POST请求的地址,并且是已经存在的,现在就能够在浏览器访问到的地址,这就要求我们先把公众帐号后台处理程序开发好(至少应该完成了对GET请求的处理)并部署在公网服务器上。这里我用到了natapp来实现内网穿透,将本机ip地址部署到公网服务器上,这个方法是免费的呦( ´∀`),短期内进行测试接口还是可以的,但是缺点是域名会随机的进行改变,不利于长期进行微信开发。
具体步骤介绍:

1、下载natapp

natapp是基于ngrok的国内高速内网穿透服务商。

2、进入natapp官网,右上角注册一个natapp账号

注册成功后,进入如下界面,购买一个免费隧道


点击免费购买即可。然后回到首页,点击我的隧道

能看到这些信息就算可以了。

3、下载config.ini

使用本地配置文件config.ini,可以将配置保存起来,免去每次运行都输入authtoken等基础配置。
下载地址:下载config.ini
打开这个文件,然后把微信接口测试里面的
把上面那张图的authtoken复制后填入这里的authtoken的等号后面。

4、双击运行natapp.exe

这个时候就能看到这样的界面了


这就说明你的本机ip地址+端口号已经映射成了红色框框里面的地址,这是一个外网地址。
用这个网址放到浏览器网址里,尝试链接一个你本机的端口号为8080的项目,看看能不能成功,如果运行完界面与之前的是一样的,就说明内网穿透成功了。
把这个地址复制下来,然后后面加上上面那个controller的接口,变成:http://wh5gh6.natappfree.cc/wxdemo,把这个地址放置到微信接口测试页面的URL里,把上面controller里面的token:“good”,也填到下面的token框里面(这个token可以随意填写,但是要和后台一致)
把后台springboot项目打开,然后点击提交按钮,出现配置成功的字样就可以了。
然后去掉url里面的http://,把剩下的信息填入到下面的js接口域名中就可以了。


嗯,亲测好用。
如果有什么问题可以在底下评论,大家一起探讨。

感谢原博主,当时解决了我的问题。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章