微信开发第一步---与微信服务器建立通信

Java版–微信开发第一步—与微信服务器建立通信

​ 前言:在项目开发过程中,有时会遇到需要进行微信公众号相关的开发,但是在开发的过程中,可能微信公众号相关的appid等信息尚未拿到,在这种情况下我们便可以使用微信测试号进行开发。

​ 测试号获取链接:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login ,通过此链接,使用微信扫码即可获得我们需要的appid 以及appsecret

1.基本环境准备 —> 内网穿透

  1. 环境分析:(作者环境为win10 x64)

    ​ 在进行微信相关开发的时候,由于微信相关开发需要和微信服务器进行通信,而我们的开发环境是在公司内网环境中,这种情况下我们需要用一些工具进行内网穿透,把本地开发环境映射到公网环境,这样就可以和微信服务器进行通信了。

  2. 具体步骤:

    Step1 : 常见的内网穿透工具有很多,此时我们可以通过搜索引擎寻找合适的穿透工具进行操作。本文以natapp为例进行介绍。

    Step2: 进入natapp官网 https://natapp.cn/ 购买隧道和二级域名(操作步骤参考此工具官网,此处不再赘述)

    Step3: 购买完成后,进入 会员中心–> 我的隧道 可见如下界面
    微信开发第一步---与微信服务器建立通信_第1张图片
    Step4: 点击配置进行相关配置,设置本地地址和本地端口如下所示

微信开发第一步---与微信服务器建立通信_第2张图片

Step5: 下载客户端到本地 , 进入客户端所在的目录,运行cmd或者 powershell ,执行命令:

.\natapp.exe -authtoken=12345abcde   此处的authtoken的值为 上图中authtoken的值		     

Step6:

黑窗口运行成功的效果如下

微信开发第一步---与微信服务器建立通信_第3张图片
微信服务器现在就可以和本地项目进行通信了。可以在浏览器测试是否可以通过域名访问本地资源,如下可以正常显示本地的一些资源证明配置完全可用。

微信开发第一步---与微信服务器建立通信_第4张图片

2. 编写基本代码 --> 实现与微信服务器建立连接

​ **1.知识扫盲:**通过阅读微信相关文档,我们可以发现,在和微信进行通信之前,需要先进行绑定操作,也就是告诉微信公众号, 你的服务器是你的服务器,这样微信才可以确定要和你的服务器进行通讯。

微信开发第一步---与微信服务器建立通信_第5张图片
这里的url就是本地项目接口的路径,现在咱们还没有编写代码可以先空着。

2.新建项目,导入依赖

​ 在本地新建springboot项目,pom中必要的依赖如下

<dependency>
   <groupId>org.springframework.bootgroupId>
   <artifactId>spring-boot-starter-webartifactId>
dependency>

//这个依赖不是必要的依赖,可以简化代码,可以不使用
<dependency>
   <groupId>org.projectlombokgroupId>
   <artifactId>lombokartifactId>
   <optional>trueoptional>
dependency>

3.编写微信配置类

@Data //这是lombook注解,可以在编译时生成getter、setter、构造方法等代码
public class WxConstantConfig {

	public static final String appID = " ";//微信测试号页面生成
	public static final String appSecret = " ";//微信测试号页面生成
	public static final String token = "hello";//微信测试号页面的接口配置信息中配置的 Token
	public static final boolean safe = false;
	public static final String assessToken="";
	
}

4.编写WeixinUtil类

public class WeixinUtil {
    
	protected static Logger log = LoggerFactory.getLogger(WeixinUtil.class);

	public static boolean isCheck(HttpServletRequest request, String token) {
		String signature = request.getParameter("signature");
		String timestamp = request.getParameter("timestamp");
		String nonce = request.getParameter("nonce");
		return SignUtil.checkSignature(token, signature, timestamp, nonce);
	}
}

5.编写SignUtil类

public class SignUtil {
	private static final Logger log = LoggerFactory.getLogger(SignUtil.class);
	private static final char[] digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

	public static boolean checkSignature(String token, String signature, String timestamp, String nonce) {
		if (isBlank(token, signature, timestamp, nonce)) {
			return false;
		} else {
			String[] arr = new String[] { token, timestamp, nonce };
			Arrays.sort(arr);
			StringBuilder sb = new StringBuilder();
			for (String anArr : arr) {
				sb.append(anArr);
			}
			MessageDigest md;
			String tmpStr = null;

			try {
				md = MessageDigest.getInstance("SHA-1");
				byte[] digest = md.digest(sb.toString().getBytes("UTF-8"));
				tmpStr = byteToStr(digest);
			} catch (NoSuchAlgorithmException e) {
				log.error("加密方式异常", e);
			} catch (UnsupportedEncodingException e) {
				log.error("编码格式不支持", e);
			}
			return tmpStr != null && tmpStr.equalsIgnoreCase(signature);
		}
	}

}

6.编写service类

@Service
@Slf4j
public class WeixinBindService{
	
	private static WxConfig wxconfig;
	{
		String token = WxConstantConfig.token;
		boolean issafe = WxConstantConfig.safe;
		String encodingaeskey = WxConstantConfig.encodingAESKey;
		String secret = WxConstantConfig.appSecret;
		String appid = WxConstantConfig.appID;
		
		wxconfig = new WxConfig(appid, secret, encodingaeskey, issafe, token);
	}

	public WxConfig getWxConfig() {

		return WeixinBindService.wxconfig;
	}

}


7.编写action类

@RestController
@Scope("prototype")
@Slf4j
@RequestMapping("api/")
public class WeiXinMenuAction{

    @Autowired
    private WeixinBindService wxService;

    @RequestMapping(value = "bind")
    public @ResponseBody String bind(HttpServletRequest request) {
        if (WeixinUtil.isCheck(request, wxService.getWxConfig().getToken())) {
            // 绑定微信服务器成功
            String echostr = request.getParameter("echostr");
            
            //此处如果log报红,需要安装lom插件,安装方法请百度,此处不再赘述
            log.warn("bind weixin server success , and echostr is {}", echostr);
            
            return echostr;
        } else {
            // 绑定微信服务器失败
            log.warn("bind weixin server faile !!!");
            return "";
        }
    }
}

至此基本代码编写完成。

3.在测试号中测试本地项目与微信服务器的连接情况

配置本地 action 的路径以及 token

微信开发第一步---与微信服务器建立通信_第6张图片

点击提交之后,提示配置成功,说明微信访问本地服务成功。
微信开发第一步---与微信服务器建立通信_第7张图片

至此,万里长征的第一步就走完了。接下来就可以进行相关开发了。

你可能感兴趣的:(微信开发)