2016-09-03 15:53:08 JaHello 阅读数 6055
  • PHP获取微信公众号网页授权和用户信息(code、access_...

    讲解用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户 基本信息,进而实现业务逻辑。 获取code、access_token、openid、用户昵称、地区、性别、头像等 官方文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Web_Developer_Tools .html#1 开发步骤 1、引导用户进入授权页面同意授权,获取code 2、通过code换取网页授权access_token(与基础支持中的access_token不同) 3、如果需要,开发者可以刷新网页授权access_token,避免过期 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制) PHP获取微信公众号网页授权和用户信息(code、access_token、openid等) 01-PHP获取微信公众号网页授权和用户信息演示 02-官方文档概要和需要提前准备的 03-PHP获取网页返回内容 04-PHP获取微信用户网页授权同意 05-PHP拿到微信用户授权后的code信息 06-PHP获取access_token和openid 07-PHP获取微信用户所有数据 08-PHP获取微信用户头像、昵称、区域、性别

    106 人正在学习 去看看 黄菊华


用java做微信开发,验证token时怎么尝试总是失败,于是把每一步获取和计算参数都打印出来看看到底发生了什么。


这是源代码

doGet 方法:

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");
		
		PrintWriter out = response.getWriter();
		if (CheckUtil.checkSignature(signature, timestamp, nonce)){
			System.out.println("check ok");
			out.print(echostr);
			
		}
		out.close();
	}

check util:

public static boolean checkSignature(String signature, String timestamp,
			String nonce) {
		String[] arr = new String[] { token, timestamp, nonce };
		// sort
		Arrays.sort(arr);

		// generate String
		String content = arr[0]+arr[1]+arr[2];
		
		
		// shal code
		String temp = new SHA1().getDigestOfString(content.getBytes());

		return temp.equalsIgnoreCase(signature);
	}

思想其实就是获取到参数 timestamp, nonce 和自己定义的 参数 token一起排序,然后生成一个它们排序后的新字符串,然后给这个字符串用SHA1加密,如果加密结果和获取到的参数 signature相等,则返回获得的参数 echostr。


刚开始我比较获得的参数,加密后怎么看都与 signature 相等,但是验证信息却总是发现不等,后来发现问题在大小写字母上,我使用的SHA1加密后返回的是大写字母,于是在比较的时候改为“temp.equalsIgnoreCase(signature)”忽略大小写比较后,果然通过验证。\(^o^)/~





2018-09-15 11:22:09 swimming_in_IT_ 阅读数 140
  • PHP获取微信公众号网页授权和用户信息(code、access_...

    讲解用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户 基本信息,进而实现业务逻辑。 获取code、access_token、openid、用户昵称、地区、性别、头像等 官方文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Web_Developer_Tools .html#1 开发步骤 1、引导用户进入授权页面同意授权,获取code 2、通过code换取网页授权access_token(与基础支持中的access_token不同) 3、如果需要,开发者可以刷新网页授权access_token,避免过期 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制) PHP获取微信公众号网页授权和用户信息(code、access_token、openid等) 01-PHP获取微信公众号网页授权和用户信息演示 02-官方文档概要和需要提前准备的 03-PHP获取网页返回内容 04-PHP获取微信用户网页授权同意 05-PHP拿到微信用户授权后的code信息 06-PHP获取access_token和openid 07-PHP获取微信用户所有数据 08-PHP获取微信用户头像、昵称、区域、性别

    106 人正在学习 去看看 黄菊华

以前一直做过微信的开发,毕竟微信开发是现在广大程序猿不得不做的一个开发。其中包括微信的支付,微信的oauth登录。但是一直都没有系统的去完成过一个微信的所有开发,略有遗憾。最近自己申请了一个微信的订阅号,下面记录下,微信的Token验证吧。

进行微信公众平台的开发,进行token验证是第一步,如下图所示。url填写自己的服务器地址。Token这里可以自定义,但是要和代码中的Token保持一致。

验证代码如下:

var crypto = require('crypto');
var url = require('url');
exports.wechat = function(req,res){
	var query = url.parse(req.url,true).query;
	var signature = query.signature;
	var timestamp = query.timestamp;
	var nonce = query.nonce;
	var echostr = query.echostr;
	if(check(timestamp,nonce,signature,"weixin")){
	res.end(echostr);
	}else{
	res.end("It is not from weixin");
	}
};


function check(timestamp,nonce,signature,token){
	var currSign,tmp;
	tmp = [token,timestamp,nonce].sort().join("");
	currSign = crypto.createHash("sha1").update(tmp).digest("hex");
	return (currSign === signature);
};

获取url中包含的signature,timestamp,nonce,echostr。然后将token,timestamp,nonce按照字典序排列。并且加密,再与接收到的signature进行比对,如果相同,则是来自微信的请求,反之则不是。在配置完了后,本来进行其他开发。到最后发现个人申请的订阅号并不能进行认证,所以,这次只能再忍着了。以后公司有类似的资源的话,再做吧。

2016-10-18 14:25:05 qq_22172905 阅读数 1108
  • PHP获取微信公众号网页授权和用户信息(code、access_...

    讲解用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户 基本信息,进而实现业务逻辑。 获取code、access_token、openid、用户昵称、地区、性别、头像等 官方文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Web_Developer_Tools .html#1 开发步骤 1、引导用户进入授权页面同意授权,获取code 2、通过code换取网页授权access_token(与基础支持中的access_token不同) 3、如果需要,开发者可以刷新网页授权access_token,避免过期 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制) PHP获取微信公众号网页授权和用户信息(code、access_token、openid等) 01-PHP获取微信公众号网页授权和用户信息演示 02-官方文档概要和需要提前准备的 03-PHP获取网页返回内容 04-PHP获取微信用户网页授权同意 05-PHP拿到微信用户授权后的code信息 06-PHP获取access_token和openid 07-PHP获取微信用户所有数据 08-PHP获取微信用户头像、昵称、区域、性别

    106 人正在学习 去看看 黄菊华

第一步:
打开你的aspx页面的后台文件(也就是.cs)在里面写如下方法

    #region 
        /// <summary>
        /// 验证微信签名
        /// </summary>
        /// *本方法的目的是将来源于微信服务器的token、timestamp、nonce三个参数进行字典序排序
        /// * 再将三个参数字符串拼接成一个字符串进行sha1加密然后与signature进行对比
        /// <returns></returns>
        private bool CheckSignature()
        {
             //获取从微信服务器发过来的signature 、timestamp和nonce
            string signature = Request.QueryString["signature"].ToString();
            string timestamp = Request.QueryString["timestamp"].ToString();
            string nonce = Request.QueryString["nonce"].ToString();
            //这里的Token来自于自己的变量声明 如public string Token = "tomyang1994";
            string[] ArrTmp = { Token, timestamp, nonce };
            Array.Sort(ArrTmp);     //字典排序
            string tmpStr = string.Join("", ArrTmp);
            tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
            tmpStr = tmpStr.ToLower();
            if (tmpStr == signature)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private void Valid()
        {
            string echoStr = Request.QueryString["echoStr"].ToString();
            if (CheckSignature())
            {
                if (!string.IsNullOrEmpty(echoStr))
                {
                    //这个是打印出取得的信息,与验证token没有关系
                   只有CheckSignature()返回的是true,token就
                   已经验证成功了
                    Response.Write(echoStr);
                    Response.End();
                }
            }
        }
        #endregion

第二步:
就是在void Page_Load(object sender, EventArgs e)中调用第一步写的Valid()方法。

第三步:
完成上面两步后就进入你的微信开发者账号
基本配置—–>服务器配置
微信账号服务器配置图解
填完点击提交 ,提交成功就OK了。token验证就完成了 ,服务端代码可以注释掉了。

注:asp.net端要发布到IIS上,然后将外网IP或地址填写到服务器配置中的URL里,注意端口是80或者443,将内网转外网建议用花生壳,6元的认证费。

2017-09-22 08:20:06 towtotow 阅读数 525
  • PHP获取微信公众号网页授权和用户信息(code、access_...

    讲解用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户 基本信息,进而实现业务逻辑。 获取code、access_token、openid、用户昵称、地区、性别、头像等 官方文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Web_Developer_Tools .html#1 开发步骤 1、引导用户进入授权页面同意授权,获取code 2、通过code换取网页授权access_token(与基础支持中的access_token不同) 3、如果需要,开发者可以刷新网页授权access_token,避免过期 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制) PHP获取微信公众号网页授权和用户信息(code、access_token、openid等) 01-PHP获取微信公众号网页授权和用户信息演示 02-官方文档概要和需要提前准备的 03-PHP获取网页返回内容 04-PHP获取微信用户网页授权同意 05-PHP拿到微信用户授权后的code信息 06-PHP获取access_token和openid 07-PHP获取微信用户所有数据 08-PHP获取微信用户头像、昵称、区域、性别

    106 人正在学习 去看看 黄菊华

微信公众号开发中,

获取常用的信息,

微信会直接把结果返回给你。


但是有时我们需要获取一些权限级别高的信息时,

微信会要求我们提供access token

只有通过access token验证后,

才会把内容返回给我们。


11token.jpg


今天的微信开发视频课程中,

将会告诉你怎么获得公众平台开发需要用到的access token…

微信公众号开发获取access token方法,源代码视频教程在线观看

http://edu.csdn.net/course/detail/2586/42345

2018-03-03 19:44:44 silyvin 阅读数 1292
  • PHP获取微信公众号网页授权和用户信息(code、access_...

    讲解用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户 基本信息,进而实现业务逻辑。 获取code、access_token、openid、用户昵称、地区、性别、头像等 官方文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Web_Developer_Tools .html#1 开发步骤 1、引导用户进入授权页面同意授权,获取code 2、通过code换取网页授权access_token(与基础支持中的access_token不同) 3、如果需要,开发者可以刷新网页授权access_token,避免过期 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制) PHP获取微信公众号网页授权和用户信息(code、access_token、openid等) 01-PHP获取微信公众号网页授权和用户信息演示 02-官方文档概要和需要提前准备的 03-PHP获取网页返回内容 04-PHP获取微信用户网页授权同意 05-PHP拿到微信用户授权后的code信息 06-PHP获取access_token和openid 07-PHP获取微信用户所有数据 08-PHP获取微信用户头像、昵称、区域、性别

    106 人正在学习 去看看 黄菊华

(一)背景:

access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token,且每天有额度配额,最大调用次数限制

这一条决定:必须将access_token 缓存起来,否则每天都超标返回null


2 正常情况下access_token有效期为7200秒重复获取将导致上次获取的access_token失效

这一条决定:

(1)我们应将access_token 缓存7000秒,使用redis指定缓存时间是最好不过的

(2)先来看一下一般缓存代码:

        String token = (String)stringRedisTemplate.opsForValue().get(ACCESS);

        if(token == null) {
            token = WeXinCodeUtils.getAccessToken();
            stringRedisTemplate.opsForValue().set(ACCESS, token);
            System.out.println("request");
        } else {
            System.out.println("cache");
        }

先读后写,单线程下没有问题,输出:

request
cache

单在多线程下会有问题,而且会导致事故,比如:


B线程的请求token会导致A线程请求的token失效,A线程拿着失效的token,就失败了

对于这样的场景,我们都会想到两种方案:

1.悲观锁


这个方案可行,有点像单例模式,但是不应用于集群,同样会出事故:


synchronized不受多应用限制,导致应用A的token失效


故可以将synchronized替换为redis分布式锁


2.乐观锁


B线程请求token那会儿,A线程的token已经失效了,不管你乐观锁会报错,请求可不是数据库还给你token回滚,所以乐观锁在这个地方不适用,


故只能考虑分布式锁,有点像处理缓存击穿,这里是大并发场景,则是防大量请求同时爆到微信服务器,导致当日服务超次数限制。



(二)实现

1. 实现过程中,实践证明“正常情况下access_token有效期为7200秒重复获取将导致上次获取的access_token失效。“不准确,

重复获取不会导致上次获取的access_token失效,获取后7200秒自然失效

2. 本实例也不存在超高并发导致一秒内请求微信超限;


此2点决定:此次代码不考虑并发同步问题,一般代码处理即可,即:

一般缓存代码:

        String token = (String)stringRedisTemplate.opsForValue().get(ACCESS);

        if(token == null) {
            token = WeXinCodeUtils.getAccessToken();
            stringRedisTemplate.opsForValue().set(ACCESS, token);
            System.out.println("request");
        } else {
            System.out.println("cache");
        }



微信token验证

阅读数 992

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