2017-07-21 20:23:28 m0_37355951 阅读数 929
  • 微信公众平台深度开发Java版v2.0单品课程——微信WEB...

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

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

概述:

初次接触微信服务器配置真的不知怎么弄。所以记录下来。

1、理解微信服务器配置原理

在配置的时候,当你点击提交的时候,微信会校验你的服务器是否通畅,关键问题是:

微信会发什么数据到我指定服务器?

服务器应该回什么数据?

看一下微信开发文档没有找到这个

最后在一篇博文中找到了。

微信向服务器发送字段:

signature 微信加密签名
timestamp 时间戳
nonce 随机数
echostr 随机字符串

服务器返回给微信:

echostr 随机字符串

原理:将Token、timestamp、nonce 排序之后通过SHA-1加密变成byte[] ,然后将字节数组变成字符串,判断加密之后字符串和signature是否一样,一样表示微信发过来的数据。

2、本地应用怎么映射成外网url

我使用的是:ngrok    官网:点击打开链接

下载下来是一个.exe 文件

双击运行既可

输入:ngrok http 80       (表示监听80端口)


3、接下来写java代码

采用Spring框架,简单测试一下可以参考下列链接

@ResponseBody
	@RequestMapping(value="/event", method = RequestMethod.GET)
	public void event(HttpServletRequest request, HttpServletResponse response) throws IOException {
		 //微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp,nonce参数
        String signature = request.getParameter("signature");
        //时间戳
        String timestamp = request.getParameter("timestamp");
        //随机数
        String nonce = request.getParameter("nonce");
        //随机字符串
        String echostr = request.getParameter("echostr");
        if(SignUtil.checkSignature(signature, timestamp, nonce)) {
        	logger.info("[signature: "+signature + "]<-->[timestamp: "+ timestamp+"]<-->[nonce: "+nonce+"]<-->[echostr: "+echostr+"]");
        	response.getOutputStream().println(echostr);
        }
	}

工具类;

package com.rinlink.intelligent.weixin.utils;

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

/**
 * 2017年7月21日20:14:19
 * @author jack
 *
 */
public class SignUtil {
	
	private static String token = "9999";
	
	/**
	 * 校验签名
	 * @param signature  签名
	 * @param timestamp 时间戳
	 * @param nonce 随机数
	 * @return true 成功,false 失败
	 */
	public static boolean checkSignature(String signature,String timestamp, String nonce){
		
		String checktext = null;
		if(null != signature){
			//对Token,timestamp nonce 按字典排序
			String [] paramArr = new String[] {token, timestamp, nonce};
			Arrays.sort(paramArr);
			//将排序后的结果拼成一个字符串
			String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);
			try {
				MessageDigest md = MessageDigest.getInstance("SHA-1");
				//对接后的字符串进行sha1加密
				byte[] digest = md.digest(content.toString().getBytes());
				checktext = byteToStr(digest);
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			}
		}
		//将加密后的字符串与signature进行对比
		return checktext != null ? checktext.equals(signature.toUpperCase()) :false;
	}

	/**
	 * 将字节数组转化为16进制字符串
	 * @param digest  字符数组
	 * @return 字符串
	 */
	private static String byteToStr(byte[] byteArrays) {
		String str="";
		for (int i = 0; i < byteArrays.length; i++){
			str += byteToHexStr(byteArrays[i]);
		}
		return str;
	}

	/**
	 * 将字节转化为十六进制字符串
	 * @param myByte 字节
	 * @return 字符串
	 */
	private static String byteToHexStr(byte myByte) {

			char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
			char[] tempArr = new char[2];
			tempArr[0] = Digit[(myByte >>> 4)&0X0F];
			tempArr[1] = Digit[myByte & 0x0F];
			String str = new String(tempArr);
		return str;
	}
	
	
}

4、配置url和Token


5、启动你服务,然后点击微信提交按钮,祝你成功。

参考地址:点击打开链接

2017-03-31 15:01:11 sunhuwh 阅读数 12537
  • 微信公众平台深度开发Java版v2.0单品课程——微信WEB...

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

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

配置位置
进入公众号:https://mp.weixin.qq.com
进入开发者工具:公众号页面左下角
进入公众平台测试账号:开发者工具页面中

下面有张图片,介绍配置:
这里写图片描述

下面来看看Token验证。注意:本次微信开发专栏,全部使用spring boot进行开发。
CODE:servlet

import java.io.IOException;
import java.io.PrintWriter;

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

import com.shw.vote.web.service.AuthService;

public class ServerPortal extends HttpServlet {
    private static final long serialVersionUID = 1L;
    //我们的Token
    private static final String token = "tokensh";

    /**
     * @see HttpServlet#HttpServlet()
     */
    public ServerPortal() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        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);
        PrintWriter pw = response.getWriter();
        pw.append(echostr);
        pw.flush();
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

spring boot需要注入servlet:

@Bean  
public ServletRegistrationBean testServletRegistration() {  
    ServletRegistrationBean registration = new ServletRegistrationBean(new ServerPortal());  
    //我们的URL
    registration.addUrlMappings("/portal");  
    return registration;  
}

上面我们设定Token为tokensh:
private static final String token = “tokensh”;

由于Token验证接口URL必须是域名,我这边使用了ngrok来处理域名的问题:
参考http://www.qydev.com/
注意,Token验证的地址一定要用80端口。
假设我们的域名为https://sunhush.tunnel.qydev.com
URL处我们填:https://sunhush.tunnel.qydev.com/portal

Token , URL都设定了,提交,提示提交成功,则配置完毕。

参考资料:http://www.cnblogs.com/janken/p/5593737.html

2017-11-02 10:16:23 s31213 阅读数 255
  • 微信公众平台深度开发Java版v2.0单品课程——微信WEB...

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

    7570 人正在学习 去看看 翟东平
1、php文件编码问题

用NotPad++打开,是否为UTF-8无BOM编码格式,不是专为UTF-8无BOM编码格式
2、检查微信后台Token(令牌)前后是否有空格

有空格把空格去掉
3、检查微信后台Token与服务器后台Token是否一致
不一致无法进行sha1算法验证
4、通过sha1算法验证,还是token验证失败

通过日志参查看信服务器访问路径,在浏览器里面打开一遍,发现有echostr内容输出。
方法一、在输出echo $echostr前添加 header('content-type:text');
方法二、最后在echo $echoStr前面加一句ob_clean();

给几个看到的解决方案链接:
http://bbs.csdn.net/topics/390991193
2015-09-06 17:32:43 gong0585 阅读数 16092
  • 微信公众平台深度开发Java版v2.0单品课程——微信WEB...

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

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

微信公众号支付,java实现:

       

由于网络上又已经写好的例子,java环境的DEMO

https://github.com/louiseliu/weixin-pay

当里面的配置文件说得不清楚,下面进行补充。

 

1. 系统调试环境配置:

1.1  配置动态域名:

使用ngrok配置环境;配置ngrok.cfg内容如下:

server_addr: "tunnel.mobi:44433"

trust_host_root_certs: true

1.2 启动ngrok,windows下用cmd

>cd ngrok

>ngrok -config ngrok.cfg-subdomain hc 80

启动后访问地址为hc.tunnel.mobi

1.3  修改sts的tomcat的端口为80

微信支付只访问80端口。

 

Configure.java文件中配置信息:

1.4获取微信的关键配置参数详解

1.4.1.appid       微信公众平台-开发者中心-配置项-开发者ID

1.4.2.appSecret


1.4.3.微信支付商户号mchid=1267692501

微信支付、商户平台—账户信息--基本账户信息


1.4.4 subMchID受理模式下给予商户分配的子商户号,默认可填””

 

1.4.5. key

位置:微信支付、商户平台—账户设置—API安全—API密钥

输入一个32位的字母数字组成的字符串。


1.4.6         certLocalPath

位置:微信支付、商户平台—账户设置—API安全—API证书



certLocalPath=”绝对路径下的apiclient_cert.p12”

下载后的*.p12文件需要windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户ID(mchID)

证书的导入:

微信支付接口中,涉及资金回滚的接口会使用到商户证书,包括退款、撤销接口。商家在申请微信支付成功后,收到的相应邮件后,可以按照指引下载API证书,也可以按照以下路径下载:

微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->证书下载 。证书文件有四个,

apiclient_cert.p12是商户证书文件,除PHP外的开发均使用此证书文件。

双击apiclient_cert.p12文件,

windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户ID(如:1267692501)

 

1.4.7         certPassword=mchID

也可以在上面的导入p12的文件时,重新设置密码,注意此处的密码不能为空,因为空密码会报错。

 

1.4.8         notifyCallbackUrl

默认回调地址预订单生成完成后的回调地址.

notifyCallbackUrl=http://hc.tunnel.mobi/shopapi/weixin/authorize/UnifiedorderCallBack

 

1.5配置用户消息,和开发者需要的事件推送。

1.5.1在微信开发者mp.weixin.qq.com,找到开发者中心—配置项—服务器配置


1.5.2开发账号里面找到。

开发者中心,在这里再找“网页账号”修改hc.tunnel.mobi

服务器配置中,URL(服务器地址)修改为http://hc.tunnel.mobi/shopapi/weixin/verify

Token(令牌)为:weixinCourse


1.5.3开发者中心—配置项中查找网页账号 设置对应的回调地址:


1.5.4微信验证的控制方法:

    /**

     * 微信验证

     * 请填写接口配置信息,此信息需要你有自己的服务器资源,填写的URL需要正确响应微信发送的Token验证

     * 验证服务器地址的有效性

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

     * 参数  描述

     * signature   微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。

     * timestamp   时间戳

     * nonce   随机数

     * echostr 随机字符串

     * @return

     * @throwsIOException

     */

    @RequestMapping(value = "/weixin/verify",method = RequestMethod.GET)

    public voidweixinVerify(Model model, WeixinVerifyDto verify, HttpServletResponse response) throwsIOException{

       PrintWriter out = response.getWriter();

       if (SignUtil.checkSignature(verify.getSignature(), verify.getTimestamp(),verify.getNonce())) { 

           model.addAttribute("echoStr", verify.getEchostr());

           out.print(verify.getEchostr());

       }

       //return "verify";

       out.close(); 

       out = null;

    }

SignUtil

import java.security.MessageDigest;

importjava.security.NoSuchAlgorithmException;

import java.util.Arrays;

 

public class SignUtil {

   // 与接口配置信息中的Token要一致

   private static String token = "weixinCourse";

 

   /**

    * 验证签名

    *

    * @param signature

    * @param timestamp

    * @param nonce

    * @return

    */

   public static boolean checkSignature(String signature, String timestamp,

           String nonce) {

       String[] arr = new String[] { token, timestamp, nonce };

       // 将token、timestamp、nonce三个参数进行字典序排序

       Arrays.sort(arr);

       StringBuilder content = new StringBuilder();

       for (int i = 0; i < arr.length; i++) {

           content.append(arr[i]);

       }

       MessageDigest md = null;

       String tmpStr = null;

 

       try {

           md =MessageDigest.getInstance("SHA-1");

           // 将三个参数字符串拼接成一个字符串进行sha1加密

           byte[] digest = md.digest(content.toString().getBytes());

           tmpStr = byteToStr(digest);

       } catch (NoSuchAlgorithmException e) {

           e.printStackTrace();

       }

 

       content = null;

       // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信

       return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;

    }

 

   /**

    * 将字节数组转换为十六进制字符串

    *

    * @param byteArray

     * @return

    */

   private static String byteToStr(byte[] byteArray) {

       String strDigest = "";

       for (int i = 0; i < byteArray.length; i++) {

           strDigest += byteToHexStr(byteArray[i]);

       }

       return strDigest;

    }

 

   /**

    * 将字节转换为十六进制字符串

    *

    * @param mByte

    * @return

    */

   private static String byteToHexStr(byte mByte) {

       char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',

                'B', 'C', 'D', 'E', 'F' };

       char[] tempArr = new char[2];

       tempArr[0] = Digit[(mByte >>> 4) & 0X0F];

       tempArr[1] = Digit[mByte & 0X0F];

 

       String s = new String(tempArr);

       return s;

    }

}

 

WeixinVerifyDto

/**

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

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

 * 加密/校验流程如下:

 * 1. tokentimestampnonce三个参数进行字典序排序

 * 2. 将三个参数字符串拼接成一个字符串进行sha1加密

 * 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

 * @author HuangC

 *

 */

public classWeixinVerifyDto {

   /**

     * 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。

     */

   privateString signature;

   /**

     * 时间戳

     */

   privateString timestamp;

   /**

     * 随机数

     */

   privateString nonce;

   /**

     * 随机字符串

     */

   privateString echostr;

 

   publicString getSignature() {

        return signature;

   }

   publicvoidsetSignature(String signature){

        this.signature = signature;

   }

   publicString getTimestamp() {

        return timestamp;

   }

   publicvoidsetTimestamp(String timestamp){

        this.timestamp = timestamp;

   }

   publicString getNonce() {

        return nonce;

   }

   publicvoidsetNonce(String nonce){

        this.nonce = nonce;

   }

   publicString getEchostr() {

        return echostr;

   }

   publicvoidsetEchostr(String echostr){

        this.echostr = echostr;

   }

}

2.测试:

找到PayUtils这个文件。增加下面的代码:

   publicstaticvoidmain(String[] args){

        PayPackage payPackage = new PayPackage();

        PayQrCode qrCode = new PayQrCode("3214123423");

        payPackage.setAppid(Configure.getAppid());

        payPackage.setAttach("test");

        payPackage.setBody("JSAPI测试支付");

        payPackage.setNonce_str(qrCode.getNonce_str());

        payPackage.setMch_id(qrCode.getMch_id());

        payPackage.setOpenid("o0IrGwYeRrTbko6LlV0rOoanJHbc");

        payPackage.setOut_trade_no(UUID.randomUUID().toString().replace("-", ""));

        payPackage.setProduct_id(qrCode.getProduct_id());

        payPackage.setSpbill_create_ip("14.23.150.211");

        payPackage.setTotal_fee("1");

        payPackage.setTrade_type("JSAPI");

       String replyXml = PayUtils.generatePayNativeReplyXML(payPackage);

    }

如果顺利的话就能获取下面的xml格式的String

<xml><return_code><![CDATA[SUCCESS]]></return_code>

           <return_msg><![CDATA[OK]]></return_msg>

           <appid><![CDATA[wxc5952d6707163051]]></appid>

           <mch_id><![CDATA[1267692501]]></mch_id>

           <nonce_str><![CDATA[W0hfWAbtLZFoD1ve]]></nonce_str>

           <sign><![CDATA[823932B441E438B74C83E537BCA141AE]]></sign>

           <result_code><![CDATA[SUCCESS]]></result_code>

           <prepay_id><![CDATA[wx2015090617140717bdc800320309813499]]></prepay_id>

           <trade_type><![CDATA[JSAPI]]></trade_type>

           </xml>

2015-01-11 13:39:24 wuzuyu365 阅读数 2564
  • 微信公众平台深度开发Java版v2.0单品课程——微信WEB...

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

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

提示配置失败,在自己的网页服务器里返回 echostr即可,以php为例

echo $_REQUEST['echostr'];
exit;

ThinkPHP里面

$s = I('echostr');
echo $s; exit;


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