2016-12-08 17:14:37 qq_25821067 阅读数 8787
  • 微信公众平台深度开发Java版v2.0单品课程——微信WEB...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    7574 人正在学习 去看看 翟东平

微信上接入平台的demo是PHP的,没得java的,所以我自己做接入的时候遇到了一点小问题。用java做带薪开发,首先就要先通过微信的接入配置,大概原理就是微信往服务器发送一些数据,然后在服务器端做一些数据的处理,再返回数据就行了。

微信官方的名称是:

验证服务器地址的有效性

下面是微信官方的文档:

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数:

参数 描述
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

加密/校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
实例开始

1:写个servlet类,来处理微信发送过来的数据:
package com.levi.service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.levi.utils.SHA1;

/**
 * Servlet implementation class WeiXin
 */
public class WeiXin extends HttpServlet {
	private static final long serialVersionUID = 1L;
	 private static String Token = "leviweixin";  //这个是之前在微信上填写的Token数据,可以自定义
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WeiXin() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		 System.out.println("get请求,正确");
		System.out.println("获得微信请求!");
		String signature=request.getParameter("signature");
		String timestamp=request.getParameter("timestamp");
		String nonce=request.getParameter("nonce");
		String echostr=request.getParameter("echostr");
		System.out.println("signature="+signature);
		System.out.println("timestamp="+timestamp);
		System.out.println("nonce="+nonce);
		System.out.println("echostr="+echostr);
		System.out.println("Token="+Token);
		
		 List<String> params = new ArrayList<String>();  
         params.add(Token);  
         params.add(timestamp);  
         params.add(nonce);  
         //1. 将token、timestamp、nonce三个参数进行字典序排序  
         Collections.sort(params, new Comparator<String>() {  
             @Override  
             public int compare(String o1, String o2) {  
                 return o1.compareTo(o2);  
             }  
         }); 
         //2. 将三个参数字符串拼接成一个字符串进行sha1加密  
         String temp = SHA1.encode(params.get(0) + params.get(1) + params.get(2));  
         if (temp.equals(signature)) {  
        	 System.out.println("原:"+signature);
        	 System.out.println("测试:"+temp);
        	 System.out.println("匹配正确,传回微信了");
             response.getWriter().write(echostr);  
             System.out.println("传回微信成功");
         }  
		 else {  
        System.out.println("没有传回去数据,");
     } 
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	 System.out.println("post请求,错误了");
	}

}

2:需要一个SHA1 的util类:
/*
 * 微信公众平台(JAVA) SDK
 *
 * Copyright (c) 2016, Ansitech Network Technology Co.,Ltd All rights reserved.
 * http://www.ansitech.com/weixin/sdk/
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.levi.utils;

import java.security.MessageDigest;

/**
 * <p>Title: SHA1算法</p>
 *
 * @author qsyang<yangqisheng274@163.com>
 */
public final class SHA1 {

    private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',
                           '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    /**
     * Takes the raw bytes from the digest and formats them correct.
     *
     * @param bytes the raw bytes from the digest.
     * @return the formatted bytes.
     */
    private static String getFormattedText(byte[] bytes) {
        int len = bytes.length;
        StringBuilder buf = new StringBuilder(len * 2);
        // 把密文转换成十六进制的字符串形式
        for (int j = 0; j < len; j++) {
            buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
            buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
        }
        return buf.toString();
    }

    public static String encode(String str) {
        if (str == null) {
            return null;
        }
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
            messageDigest.update(str.getBytes());
            return getFormattedText(messageDigest.digest());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
3、配置下web.xml就行了
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>wx</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>WeiXin</display-name>
    <servlet-name>WeiXin</servlet-name>
    <servlet-class>com.levi.service.WeiXin</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>WeiXin</servlet-name>
    <url-pattern>/WeiXin</url-pattern>
  </servlet-mapping>
</web-app>



点击提交,如果正确会显示配置成功。

注意事项:
1、一定要用到外网IP映射,可以用花生壳,或者用ngrok。端口要用80端口。用外网映射的目的就是模拟服务器,然后微信才能够给服务器发信息并且验证;
2、要多连续点击几次提交,直到ok为止,我测试的时候就发现,明明是对的,但是微信就说配置失败,后面我多次连续点击提交,非常快的速度连续点击提交。有个前提,要代码没写错哈,其实你把上面的3个代码块的文件复制进去应该是没得问题的。

2019-11-29 15:03:00 OliverCaro 阅读数 10
  • 微信公众平台深度开发Java版v2.0单品课程——微信WEB...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    7574 人正在学习 去看看 翟东平

微信官方文档:

https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

 

直接上Code(请忽略不规范😂):

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

@RestController
@RequestMapping(value = "/weChat/callback")
public class WeChatCallBackController {

    private static final Logger LOG = LoggerFactory.getLogger(WeChatCallBackController.class);

    /**
     * 校验信息是否是从微信服务器发出
     *
     * @param request
     * @param response
     */
    @GetMapping
    public void get(HttpServletRequest request, HttpServletResponse response) {
        try {
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
        } catch (UnsupportedEncodingException e) {
            LOG.error("UnsupportedEncodingException", e);
        }

        // 微信加密签名
        String signature = request.getParameter("signature");
        // 时间戳
        String timestamp = request.getParameter("timestamp");
        // 随机数
        String nonce = request.getParameter("nonce");
        // 随机字符串
        String echostr = request.getParameter("echostr");
        // 微信开发者模式配置Token
        String token = "Token";

        try (PrintWriter writer = response.getWriter()) {
            // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
            if (WeChatPayUtil.checkSignature(token, signature, timestamp, nonce)) {
                writer.write(echostr);
            }else {
                // 回复消息为空,必须做出下述回复,这样微信服务器才不会对此作任何处理,
                // 并且不会发起重试,否则,将出现严重的错误提示。直接回复success(推荐方式)
                writer.write("success");
            }
        } catch (AesException e) {
            LOG.error("AesException", e);
        } catch (IOException e) {
            LOG.error("IOException", e);
        }
    }

    /**
     * 微信服务器处理消息
     *
     * @param request
     * @param response
     */
    @PostMapping
    public void post(HttpServletRequest request, HttpServletResponse response) {
        try {
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
        } catch (UnsupportedEncodingException e) {
            LOG.error("UnsupportedEncodingException", e);
        }

        // 加密 response
        String respMessage = "加密response";
        try (PrintWriter writer = response.getWriter()) {
            if (StringUtils.isNotBlank(respMessage)) {
                writer.write(respMessage);
            } else {
                writer.write("success");
            }
        } catch (Exception e) {
            LOG.error("Exception", e);
        }
    }

}

 

   /**
    * 验证微信开发者模式回调Token
    *
    * @param token        Token(令牌)
    * @param msgSignature 签名串,对应URL参数的signature
    * @param timeStamp    时间戳,对应URL参数的timestamp
    * @param nonce        随机串,对应URL参数的nonce
    * @return 是否为安全签名
    * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
    */
   public static boolean checkSignature(String token, String msgSignature, String timeStamp, String nonce) 
           throws AesException {
      String signature = SHA1.getSHA1(token, timeStamp, nonce);
      if (!signature.equals(msgSignature)) {
         throw new AesException(AesException.ValidateSignatureError);
      }
      return true;

微信后台配置接口URL,若提交成功即OK啦!

 

微信公众号和微信小程序通用

2016-11-07 15:44:27 guolulu0223 阅读数 3600
  • 微信公众平台深度开发Java版v2.0单品课程——微信WEB...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    7574 人正在学习 去看看 翟东平

接入微信公众平台开发,开发者需要按照如下步骤完成:

1、填写服务器配置
2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑

第一步:填写服务器配置

登录微信公众平台官网后,在公众平台后台管理页面 - 开发者中心页,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。

同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码,详情请参考消息体签名及加解密部分的文档。


废话不多说;直接上真家伙(php为例)


假如你填写的信息如下:

URL:http://www.baidu.com/weixin.php

Token:weixin

那么就直接将一下内容复制到你的weixin.php文件里面就OK了(记得一定要是在根目录下哦,或者你填写的URL同步的能访问的也行)

<?php
/**
  * wechat php test
  */
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if(isset($_GET["echostr"])){ #验证过token,成为开发者之后,可以直接$wechatObj->responseMsg();
$wechatObj->valid();
}else{
$wechatObj->responseMsg();
}

class wechatCallbackapiTest
{
public function valid()
    {
        $echoStr = $_GET["echostr"];
        //valid signature , option
        if($this->checkSignature()){
        echo $echoStr;
        exit;
        }
    }


    public function responseMsg(){
        //get post data, May be due to the different environments
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];


              //extract post data
        if (!empty($postStr)){
                        
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); #这里有从用户通过公众平台接收过来的数据,具体是什么类型的数据,开发者文档上写的很清楚,可以去上面查。
            $fromUsername = $postObj->FromUserName;
            $toUsername = $postObj->ToUserName;
            $keyword = trim($postObj->Content);
            $msgType = $postObj->MsgType;
            $time = time();
            switch( $msgType ){
                case "text": #这个xml格式的数据是你服务器上的数据,是要传回公众平台的。我在这刚开始有点糊涂了
                $textTpl = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[%s]]></MsgType>
                <Content><![CDATA[%s]]></Content>
                <FuncFlag>0</FuncFlag>

                </xml>";

                #这里是我自己写的,关于时间的自动回复     
                if( $keyword =='时间' || $keyword =='time' || $keyword =="shijian"){
                    $contentStr = date("Y-m-d H:i:s",time());
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    echo $resultStr;
                }
                else
                {
                    $msgType = "text";
                    $contentStr = "欢迎关注shenghuoju";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    echo $resultStr;
                }

                break;

                case "event": #这个是事件的操作,当关注的时候自动回复
                $textTpl = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[%s]]></MsgType>
                <Content><![CDATA[%s]]></Content>
                <FuncFlag>0</FuncFlag>
                </xml>";
                $event = $postObj->Event;
                $msgType = "text";
                if( $event =='subscribe'){
                    $contentStr = "欢迎关注shenghuoju";

                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    echo $resultStr;
                    break;
                }
            }

        }else {
            echo "欢迎关注shenghuoju";
            exit;
        }
    }
///----------------------------------------------------------------------------------
private function checkSignature() #这个函数验证过之后就可以删除了
{
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];
       
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );

if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}

?> 


然后就提交就OK了,然后呢。。。。



恭喜你,成为了一名基础的微信开发者!



偷偷的告诉你哦,代码里面已经给你写了一个自动回复的小功能哦,自己找找看!



深层次的开发,请继续查看下一内容!


也可以加一下我的qq哦!


2018-06-06 17:03:27 Thinkingcao 阅读数 836
  • 微信公众平台深度开发Java版v2.0单品课程——微信WEB...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    7574 人正在学习 去看看 翟东平

微信开发者接入官方文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319

一、微信公共号通讯机制

作为开发者,我们需要面对的主要有两个对象:微信服务器和应用程序(网站)服务器。 
当微信用户向你的公众平台发送一条消息,实际上这条消息首先发送到微信服务器,由微信服务器向网站服务器(我们开发的后台服务)发起另外一个请求,网站服务器返回这个请求的结果,再由微信服务器发送到微信客户端。

整个消息通讯流程如下图: 
这里写图片描述

具体请求流程见下图:

 

二、 外网映射工具(开发调试)

1、 外网映射工具介绍

微信公众平台在访问后台时,必须提供能够正确访问的外网地址,因为我们在本地开发,IP:127.0.0.1 ,所以要通过内网穿透,提供给外网的微信公众平台正确访问,微信平台对后台URL的要求有两点:

要求:① 必须能够用公网访问    ② 必须使用80端口

(1)natapp (很稳定,极力首推) 

 官网 :https://natapp.cn/

(2)ngrok

 官网:https://www.ngrok.cc/

(3)nat123

 官网:http://www.nat123.com/

(4)花生壳

花生壳服务网址:价格地址直达地址

使用花生壳外网映射的可以参考这篇博客:http://www.souvc.com/?p=2272   

(5)uTools(完全免费,推荐)

  地址:https://www.u.tools/

  

 

2、我这里选择的是ngrok外网映射工具  

使用ngrok:

(1). ngrok下载: 链接:https://pan.baidu.com/s/1PeVRF2lfNoQYro3YJW_7JQ 密码:s7bm

(2).进入ngrok安装文件所在的目录执行:ngrok -config ngrok.cfg -subdomain mywx 8080,之后出现如下图说明配置成功。(成功的前提是本地服务已经部署到Tomcat并且正常开启,访问本地服务正常)

 a.ngrok所在目录

  

b、切换到该目录下执行上述命令

c、本地服务映射成到外网成功效果图

 

二、填写服务器配置信息的介绍

1、登录微信公众平台官网后,进入到公众平台后台管理页面。

选择 公众号基本设置-》基本配置 ,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey。

微信公众号配置界面:

 

服务器配置:

 URL:是开发者用来接收微信消息和事件 的接口URL。(http://公网地址/项目名称/请求路径

  Token:可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。注意必须为英文或数字,长度为3-32字符,在校验的时候需要用到,随便输入一个字符串就可以了。

EncodingAESKey:由开发者手动填写或随机生成,将用作消息体加解密密钥。(消息加密密钥由43位字符组成,可随机修改,字符范围为A-Z,a-z,0-9。)

     开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数 
    参数 描述 
signature :微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 
timestamp :时间戳 
nonce: 随机数 

   echostr: 随机字符串

 

 

2、编写相应的Controller(采用spring MVC)

package com.thinkgem.jeesite.modules.app.api;

import java.io.IOException;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 
 * @ClassName: WeiXinController
 * @Description: TODO(对微信请求校验,成为开发者)
 * @author CaoWenCao
 * @date 2018年6月6日 下午2:09:38
 */
@Controller
@RequestMapping(value = "weixin")
public class WeiXinController {

    private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

    @RequestMapping(value = "getWeiXinMethod", method = RequestMethod.GET)
    @ResponseBody
    public void getWeiXinMethod(HttpServletRequest request, HttpServletResponse response) throws IOException {
        boolean validate = validate(request);
        if (validate) {
            response.getWriter().write(request.getParameter("echostr"));
            response.getWriter().close();
        }

    }

    private boolean validate(HttpServletRequest req) throws IOException {
        String signature = req.getParameter("signature");// 微信加密签名
        String timestamp = req.getParameter("timestamp");// 时间戳
        String nonce = req.getParameter("nonce");// 随机数
        List<String> list = new ArrayList<String>();
        list.add("caowencao");
        list.add(timestamp);
        list.add(nonce);
        Collections.sort(list);// 字典排序
        String str = "";
        for (int i = 0; i < list.size(); i++) {
            str += (String) list.get(i);
        }
        if (encode("SHA1", str).equalsIgnoreCase(signature)) {
            return true;
        }
        else {
            return false;
        }
    }

    public static String encode(String algorithm, String str) {
        if (str == null) {
            return null;
        }
        try {
            // Java自带的加密类
            MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
            // 转为byte
            messageDigest.update(str.getBytes());
            return getFormattedText(messageDigest.digest());
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private static String getFormattedText(byte[] bytes) {
        int len = bytes.length;
        StringBuilder buf = new StringBuilder(len * 2);
        // 把密文转换成十六进制的字符串形式
        for (int j = 0; j < len; j++) {
            buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
            buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
        }
        return buf.toString();
    }
}

3、点击提交按钮,此时验证和调用没问题,已经成功接入开发者模式。

 

2018-07-14 11:04:47 oufua 阅读数 200
  • 微信公众平台深度开发Java版v2.0单品课程——微信WEB...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    7574 人正在学习 去看看 翟东平

of-weixin-api 快速接入 几行代码实现微信接入

项目介绍

为微信开发者提供快速接入方案、未依赖任何第三方mvc框架,支持所用java web 框架接入。

项目地址: https://gitee.com/oufu/of-weixin-api QQ 群: ①185948055

安装教程

Maven引用

	<dependency>
		<groupId>com.ofsoft</groupId>
		<artifactId>of-weixin-api</artifactId>
		<version>0.0.1-RELEASES</version>
	</dependency>	
<dependency>
		<groupId>com.ofsoft</groupId>
		<artifactId>of-weixin-api</artifactId>
		<version>0.0.1-RELEASES</version>
	</dependency>	

文档地址

文档地址: https://gitee.com/oufu/of-weixin-api/wikis

使用说明

  1. Spring mvc
@Controller  
public class WeiXinAction extends MessageController {
         //入口
	@RequestMapping(value = "/wx/index")
	public void index(HttpServletRequest request, HttpServletResponse response) {
		Dispatcher.doDispatch(request, response, this);
	}

	@Override
	public MessageResponse textTypeMsg(MessageRequest params) {
		TextMessage msg = new TextMessage();
		msg.setContent(params.getParam("Content"));
		return msg;
	}

}
  
public class WeiXinAction extends MessageController {
         //入口
	@RequestMapping(value = "/wx/index")
	public void index(HttpServletRequest request, HttpServletResponse response) {
		Dispatcher.doDispatch(request, response, this);
	}

	@Override
	public MessageResponse textTypeMsg(MessageRequest params) {
		TextMessage msg = new TextMessage();
		msg.setContent(params.getParam("Content"));
		return msg;
	}

}
  1. Jfinal
@Action(path = "/wx")
public class WeixinController extends BaseController {
        //入口
	public void index() {
		Dispatcher.doDispatch(getRequest(), getResponse(),new DefaultController());
		renderNull();
	}

}
(path = "/wx")
public class WeixinController extends BaseController {
        //入口
	public void index() {
		Dispatcher.doDispatch(getRequest(), getResponse(),new DefaultController());
		renderNull();
	}

}
  1. Servlet 配置
@WebServlet(name = "coreInit", loadOnStartup = 1, urlPatterns = { "/wx/sing.html" })
public class Init extends HttpServlet {
	private static final long serialVersionUID = 1L;
            
	@Override
	public void init(ServletConfig config) throws ServletException {
		// 设置配置信息
		// AppConfig.setConfig(appid, appSecret, token);
		AppConfig.getInstance().init(new DefaultController());
	}
        //入口
	@Override
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Dispatcher.doDispatch(request, response);
	}

(name = "coreInit", loadOnStartup = 1, urlPatterns = { "/wx/sing.html" })
public class Init extends HttpServlet {
	private static final long serialVersionUID = 1L;
            
	@Override
	public void init(ServletConfig config) throws ServletException {
		// 设置配置信息
		// AppConfig.setConfig(appid, appSecret, token);
		AppConfig.getInstance().init(new DefaultController());
	}
        //入口
	@Override
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Dispatcher.doDispatch(request, response);
	}

} 4.自定义类继承MessageController 实现自己需求的方法

public class DefaultController extends MessageController {

@Override
public MessageResponse textTypeMsg(MessageRequest params) {
	TextMessage msg = new TextMessage();
	msg.setContent("测试");
	return msg;
}

public MessageResponse textTypeMsg(MessageRequest params) {
	TextMessage msg = new TextMessage();
	msg.setContent("测试");
	return msg;
}

}

技术文档

作者博客 http://blog.csdn.net/oufua 欢迎大家完善 QQ 群: ①185948055

没有更多推荐了,返回首页