博客列表 >5月31日作业——微信服务器接入配置验证与access_token的获取与保存

5月31日作业——微信服务器接入配置验证与access_token的获取与保存

钱光照的博客
钱光照的博客原创
2018年06月03日 00:00:351830浏览

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

(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'];
	}
}

运行实例 »

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


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议