微信公众平台开发教程Java版(二)接口配置

本文详细介绍如何将微信公众账号从编辑模式切换至开发模式,并完成接口服务器配置的过程。包括申请成为开发者、设置开发者凭证信息、配置URL及Token等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微信公众账号申请完成后,默认开启的是编辑模式。

我们需要修改为开发模式。

 

登陆微信公众平台》功能》高级功能

先关闭 编辑模式,再开启 开发模式。

 

申请成为开发者,如果是服务号,需要则会有开发者凭证信息

如图


 

如果是订阅号,则只显示服务器配置。

 

下一步就是配置接口服务器了。

在公众平台网站的高级功能 – 开发模式页,点击“成为开发者”按钮,填写URL和Token,其中URL是开发者用来接收微信服务器数据的接口URL。(这就是我们开发的程序,并部署到公网上了)

Token 官网描述:可由开发者任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。

总之就是你的程序里面写的token和这里填入的token要一致。

 



 

 还没有url和token?

 

首先需要新建一个java web工程。

 

 接下来就要看看验证url和token了。

 下面是官网的描述,已经写的很清楚了



 核心实现方式就是将三个参数排序,拼接成字符串进行sha1加密,然后与signature比较

 官网也给了实例,是php的,我们只需要装换成java就可以了。

Php代码   收藏代码
  1. private function checkSignature()  
  2. {  
  3.         $signature = $_GET["signature"];  
  4.         $timestamp = $_GET["timestamp"];  
  5.         $nonce = $_GET["nonce"];      
  6.                   
  7.     $token = TOKEN;  
  8.     $tmpArr = array($token$timestamp$nonce);  
  9.     sort($tmpArr);  
  10.     $tmpStr = implode( $tmpArr );  
  11.     $tmpStr = sha1( $tmpStr );  
  12.       
  13.     if$tmpStr == $signature ){  
  14.         return true;  
  15.     }else{  
  16.         return false;  
  17.     }  
  18. }  

 

 

java代码 我的 WeixinController 类

    我的项目架构是基于spring3.0的,用到了注解。当get请求的时候会执行get方法,post请求的时候会执行post方法,分别来处理不同的请求,各位也可用servlet等去实现,原理都一样

Java代码   收藏代码
  1. package com.ifp.weixin.controller;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5. import java.io.UnsupportedEncodingException;  
  6.   
  7. import javax.annotation.Resource;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. import org.springframework.stereotype.Controller;  
  12. import org.springframework.web.bind.annotation.RequestMapping;  
  13. import org.springframework.web.bind.annotation.RequestMethod;  
  14.   
  15. import com.ifp.weixin.biz.core.CoreService;  
  16. import com.ifp.weixin.util.SignUtil;  
  17.   
  18. @Controller  
  19. @RequestMapping("/weixinCore")  
  20. public class WeixinController {  
  21.   
  22.     @Resource(name="coreService")  
  23.     private CoreService coreService;  
  24.       
  25.     @RequestMapping(method = RequestMethod.GET)  
  26.     public void get(HttpServletRequest request, HttpServletResponse response) {  
  27.         // 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。  
  28.         String signature = request.getParameter("signature");  
  29.         // 时间戳  
  30.         String timestamp = request.getParameter("timestamp");  
  31.         // 随机数  
  32.         String nonce = request.getParameter("nonce");  
  33.         // 随机字符串  
  34.         String echostr = request.getParameter("echostr");  
  35.   
  36.         PrintWriter out = null;  
  37.         try {  
  38.             out = response.getWriter();  
  39.             // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,否则接入失败  
  40.             if (SignUtil.checkSignature(signature, timestamp, nonce)) {  
  41.                 out.print(echostr);  
  42.             }  
  43.         } catch (IOException e) {  
  44.             e.printStackTrace();  
  45.         } finally {  
  46.             out.close();  
  47.             out = null;  
  48.         }  
  49.     }  
  50.   
  51.     @RequestMapping(method = RequestMethod.POST)  
  52.     public void post(HttpServletRequest request, HttpServletResponse response) {  
  53.         //暂时空着,在这里可处理用户请求  
  54.     }  
  55.   
  56. }  

 

 上面类中用到了SignUtil 类

Java代码   收藏代码
  1. package com.ifp.weixin.util;  
  2.   
  3. import java.security.MessageDigest;  
  4. import java.security.NoSuchAlgorithmException;  
  5. import java.util.Arrays;  
  6.   
  7. import com.ifp.weixin.constant.Constant;  
  8. /** 
  9.  * 验证签名 
  10.  * 
  11.  */  
  12. public class SignUtil {  
  13.       
  14.   
  15.     /** 
  16.      * 验证签名 
  17.      * @param signature 
  18.      * @param timestamp 
  19.      * @param nonce 
  20.      * @return 
  21.      */  
  22.     public static boolean checkSignature(String signature, String timestamp, String nonce) {  
  23.         String[] arr = new String[] { Constant.TOKEN, timestamp, nonce };  
  24.         // 将token、timestamp、nonce三个参数进行字典排序  
  25.         Arrays.sort(arr);  
  26.         StringBuilder content = new StringBuilder();  
  27.         for (int i = 0; i < arr.length; i++) {  
  28.             content.append(arr[i]);  
  29.         }  
  30.         MessageDigest md = null;  
  31.         String tmpStr = null;  
  32.   
  33.         try {  
  34.             md = MessageDigest.getInstance("SHA-1");  
  35.             // 将三个参数字符串拼接成一个字符串进行sha1加密  
  36.             byte[] digest = md.digest(content.toString().getBytes());  
  37.             tmpStr = byteToStr(digest);  
  38.         } catch (NoSuchAlgorithmException e) {  
  39.             e.printStackTrace();  
  40.         }  
  41.   
  42.         content = null;  
  43.         // 将sha1加密后的字符串可与signature对比  
  44.         return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;  
  45.     }  
  46.   
  47.     /** 
  48.      * 将字节数组转换为十六进制字符串 
  49.      *  
  50.      * @param byteArray 
  51.      * @return 
  52.      */  
  53.     private static String byteToStr(byte[] byteArray) {  
  54.         String strDigest = "";  
  55.         for (int i = 0; i < byteArray.length; i++) {  
  56.             strDigest += byteToHexStr(byteArray[i]);  
  57.         }  
  58.         return strDigest;  
  59.     }  
  60.   
  61.     /** 
  62.      * 将字节转换为十六进制字符串 
  63.      *  
  64.      * @param mByte 
  65.      * @return 
  66.      */  
  67.     private static String byteToHexStr(byte mByte) {  
  68.         char[] Digit = { '0''1''2''3''4''5''6''7''8''9''A''B''C''D''E''F' };  
  69.         char[] tempArr = new char[2];  
  70.         tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
  71.         tempArr[1] = Digit[mByte & 0X0F];  
  72.   
  73.         String s = new String(tempArr);  
  74.         return s;  
  75.     }  
  76. }  

 
 我们看到 checkSignature 这个方法里使用到了Constant.TOKEN ,这个token,我声明的一个常量。

 

 要与微信配置接口里面的token值一样

Java代码   收藏代码
  1. /** 
  2. * 与接口配置信息中的Token要一致 
  3. */  
  4. public static String TOKEN = "infopower";  

也贴上web.xml的配置,我的后缀是.html 的请求都交给DispatcherServlet了。

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  5.     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  
  6.     <display-name>weixinHelp</display-name>  
  7.     <context-param>  
  8.         <param-name>contextConfigLocation</param-name>  
  9.         <param-value>classpath:/applicationContext.xml</param-value>  
  10.     </context-param>  
  11.   
  12.     <context-param>  
  13.         <param-name>log4jConfigLocation</param-name>  
  14.         <param-value>classpath:/properties/log4j.properties</param-value>  
  15.     </context-param>  
  16.     <listener>  
  17.         <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
  18.     </listener>  
  19.   
  20.     <filter>  
  21.         <filter-name>encodingFilter</filter-name>  
  22.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  23.         <init-param>  
  24.             <param-name>encoding</param-name>  
  25.             <param-value>UTF-8</param-value>  
  26.         </init-param>  
  27.     </filter>  
  28.     <filter-mapping>  
  29.         <filter-name>encodingFilter</filter-name>  
  30.         <url-pattern>/*</url-pattern>  
  31.     </filter-mapping>  
  32.     <listener>  
  33.         <description>spring 容器的监听器</description>  
  34.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  35.     </listener>  
  36.     <servlet>  
  37.         <servlet-name>action</servlet-name>  
  38.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  39.     </servlet>  
  40.     <servlet-mapping>  
  41.         <servlet-name>action</servlet-name>  
  42.         <url-pattern>*.html</url-pattern>  
  43.     </servlet-mapping>  
  44.   
  45.     <welcome-file-list>  
  46.         <welcome-file>index.jsp</welcome-file>  
  47.     </welcome-file-list>  
  48. </web-app>  

  

 

 我们的代码已经写完了,访问请求地址试试



 

什么都没有显示,看看后台



 

报空指针异常

 

别担心,我们的代码没问题。

因为直接访问地址,默认是get请求,而什么参数都没有传给后台,当然会报空指针

前台没有异常,是因为我做了异常处理。

ok

 

接下来就是把代码打成war包发布到外网。

然后填入相应的url和token,接口的配置就完成了。

 

注意1:一定要发布war包到外网,配置外网的url,有些开发者配置的是ip是localhost,那肯定是不行的啦。

           如果没有外网环境,请看我的第一篇,环境准备,里面有介绍可以使用百度bae

           http://tuposky.iteye.com/blog/2008583

  注意2:开发模式一定要开启,不然配置了url和token也没用,我犯过这个错,嘿嘿。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值