Blogger Information
Blog 31
fans 0
comment 2
visits 27446
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
5月31日作业——微信服务器接入配置验证与access_token的获取与保存
钱光照的博客
Original
1829 people have browsed it

一、微信服务器接入配置验证

(1)背景知识

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

1、填写服务器配置

2、验证服务器地址的有效性

3、依据接口文档实现业务逻辑

下面详细介绍这3个步骤。

第一步:填写服务器配置

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

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

 

第二步:验证消息的确来自微信服务器

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


参数                     描述   



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



timestamp          时间戳   



nonce                 随机数   



echostr               随机字符串   


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

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

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

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


第三步:依据接口文档实现业务逻辑

验证URL有效性成功后即接入生效,成为开发者。你可以在公众平台网站中申请微信认证,认证成功后,将获得更多接口权限,满足更多业务需求。

成为开发者后,用户每次向公众号发送消息、或者产生自定义菜单、或产生微信支付订单等情况时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,开发者可以依据自身业务逻辑进行响应,如回复消息。

公众号调用各接口时,一般会获得正确的结果,具体结果可见对应接口的说明。返回错误时,可根据返回码来查询错误原因。全局返回码说明

用户向公众号发送消息时,公众号方收到的消息发送者是一个OpenID,是使用用户微信号加密后的结果,每个用户对每个公众号有一个唯一的OpenID。

此外,由于开发者经常有需在多个平台(移动应用、网站、公众帐号)之间共通用户帐号,统一帐号体系的需求,微信开放平台(open.weixin.qq.com)提供了UnionID机制。开发者可通过OpenID来获取用户基本信息,而如果开发者拥有多个应用(移动应用、网站应用和公众帐号,公众帐号只有在被绑定到微信开放平台帐号下后,才会获取UnionID),可通过获取用户基本信息中的UnionID来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的UnionID是唯一的。换句话说,同一用户,对同一个微信开放平台帐号下的不同应用,UnionID是相同的。详情请在微信开放平台的资源中心-移动应用开发-微信登录-授权关系接口调用指引-获取用户个人信息(UnionID机制)中查看。

另请注意,微信公众号接口必须以http://或https://开头,分别支持80端口和443端口。

 (2)实现源代码如下:

  1. \model\Weixin.php 

实例

<?php
namespace app\index\model;
use think\Model;
use think\facade\Cache;
use think\Db;

class Weixin extends Model
{

    // 签名校验
    public function valid()
    {
        $signature = input('get.signature');
        $timestamp = input('get.timestamp');
        $nonce = input('get.nonce');
        $token = config('app.weixintoken');
        //$echostr = input('get.echostr');
// file_put_contents('d://data.txt', 'signature='.$signature.' timestamp='.$timestamp.' nonce='.$nonce.' echostr='.$echostr);
// exit;

        $tmpArr = array($timestamp,$nonce,$token);
        sort($tmpArr, SORT_STRING);
        $str = implode($tmpArr);
        //$sign = sha1($str);

// echo $str;
// exit;
        if(sha1($str) != $signature){
            return false;
        }else{
            return true;
        }
       
    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例


2.\controller\Weixin.php

实例

<?php
namespace app\index\controller;
use think\Controller;
use think\facade\Cache;

class Weixin extends Controller
{
	
	public function __construct()
	{
		parent::__construct();
		$this->model = model('Weixin');			
	}

	//
	public function index()
	{
		//
		$valid = $this->model->valid();
		if(!$valid){
			exit('signature error');
		}else{
			exit(input('get.echostr'));
		}

	}
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

二、access_token的获取与保存

(1)背景知识

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

公众平台的API调用所需的access_token的使用及生成方式说明:

1、建议公众号开发者使用中控服务器统一获取和刷新Access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;

2、目前Access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;

3、Access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。

公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。

接口调用请求说明

https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

参数说明: 

参数                   是否必须                         说明   



grant_type           是                      获取access_token填写client_credential    

appid                   是                      第三方用户唯一凭证   



secret                  是                       第三方用户唯一凭证密钥,即appsecret   


返回说明:

正常情况下,微信会返回下述JSON数据包给公众号:{"access_token":"ACCESS_TOKEN","expires_in":7200}

参数说明:


参数                              说明   



access_token               获取到的凭证   



expires_in                    凭证有效时间,单位:秒   


错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):

{"errcode":40013,"errmsg":"invalid appid"}

返回码说明:


返回码                                    说明   



-1                                          系统繁忙,此时请开发者稍候再试   



0                                           请求成功   



40001                                   AppSecret错误或者AppSecret不属于这个公众号,请开发者确认AppSecret的正确性   



40002                                  请确保grant_type字段值为client_credential   



40164                                  调用接口的IP地址不在白名单中,请在接口IP白名单中进行设置。

                                            (小程序及小游戏调用不要求IP地址在白名单内。)

   (2)实现源代码如下:

\controller\Weixin.php

实例

<?php
namespace app\index\controller;
use think\Controller;
use think\facade\Cache;

class Weixin extends Controller
{
	
	public function __construct()
	{
		parent::__construct();
		$this->model = model('Weixin');			
	}

	
	public function get_access_token(){

		$cache_key = 'access_token';
		$access_token = Cache::get($cache_key);
		if($access_token){
			return $access_token;
		}

		$appid = config('app.appid');
		$appsecret = config('app.appsecret');
		$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;
		$res = http_Get($url);
		$res = json_decode($res,true);//接受一个JSON 编码的字符串并且把它转换为 PHP 变量
		Cache::set($cache_key,$res['access_token'],$res['expires_in']-300);
		return $res['access_token'];
	}
}

运行实例 »

点击 "运行实例" 按钮查看在线实例


Correction status:Uncorrected

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post