PHP获取AUTHORIZATION认证验证

本文详细介绍了在Apache服务器环境下,如何正确处理HTTP请求中的Authorization头部信息,解决因默认配置导致无法读取的问题,并提供了兼容Nginx和其他服务器的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做接口认证的时候,我们可能会用到自定义header头Authorization。
我们都知道php的自定义头信息都可以使用$SERVER['HTTP*']来获取,如header('test: wzhtest');获取的时候,我们可以使用$_SERVER['HTTP_TEST']来获取。

  • 这里说明下。Authorization可能是个例外。nginx没问题,但是Apache下可能会出现一个问题。那就是我们使用$_SERVER['HTTP_AUTHORIZATION']可能就获取不到值。

Apache服务器下,我们需要开启rewrite_module模块,然后编辑.htaccess文件,在上面加入

#Authorization Headers
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

如果没有开启过rewrite_module模块,我们需要新建.htaccess 内容如下:

Options +FollowSymlinks -Multiviews
RewriteEngine On
#Authorization Headers
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

通过下面的方法我们可以兼容的处理:

public function getBasicAuthorized(){
        $UserName = '';
        $PassWord = '';

        //Apache服务器
        if (isset($_SERVER['PHP_AUTH_USER'])) {
            $UserName = $_SERVER['PHP_AUTH_USER'];
            $PassWord = $_SERVER['PHP_AUTH_PW'];
        }elseif(isset($_SERVER['HTTP_AUTHORIZATION'])){//其他服务器如 Nginx  Authorization
            if (strpos(strtolower($_SERVER['HTTP_AUTHORIZATION']), 'basic') === 0) {
                $Authorization = explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
                $UserName = isset($Authorization[0])?$Authorization[0]:'';
                $PassWord = isset($Authorization[1])?$Authorization[1]:0;
            }
        }

        return array($UserName,$PassWord);
    }

 

<think>好的,我现在要帮助用户了解如何在微信商家转账中获取Authorization授权。首先,我需要回忆一下之前看到的引用内容,确保信息准确。根据引用[1],Authorization是请求头中的必填字段,需要签名内容。引用[2]详细说明了签名算法,特别是nodejs的实现,提到签名串的构造方法。引用[3]提到PHP开发中需要添加Wechatpay-Serial头部,带上平台证书序列号。 首先,用户需要明确Authorization的组成,根据文档,Authorization认证类型和签名信息组成,格式是`WECHATPAY2-SHA256-RSA2048 {签名信息}`。签名信息包括商户号、时间戳、随机字符串、请求体摘要和证书序列号。 然后,构造签名串是关键。按照引用[2],签名串由HTTP方法、URL、时间戳、随机串和请求报文主体组成,各部分用换行符连接。例如,POST请求的话,URL需要是绝对路径,比如/v3/transfer/batches,并且如果有查询参数需要加上。请求时间戳是秒级的时间戳,随机串要足够随机,比如用UUID。请求报文主体的摘要需要是请求体的SHA-256值,然后Base64编码。 接下来,使用商户私钥对签名串进行RSA签名,生成签名值,再进行Base64编码。最后,将这些元素组合成Authorization头。同时,不要忘记设置Wechatpay-Serial头部为平台证书序列号,如引用[3]所述。 需要注意的地方包括时间戳的有效期,通常为5分钟,随机字符串的不可重复性,以及URL的绝对路径处理。此外,不同编程语言的实现可能不同,但核心步骤一致。用户可能需要参考具体的SDK或示例代码,比如引用[2]中的nodejs示例或引用[3]的PHP处理方式。最后,测试和验证是关键,可以通过微信提供的调试工具或沙箱环境来检查签名是否正确。</think>### 微信商家转账 Authorization 获取方式 在微信支付商户API v3中,`Authorization`的获取需要通过**签名算法**构造,具体步骤如下: --- #### 一、Authorization 结构说明 `Authorization`由认证类型和签名信息组成,格式为: ``` WECHATPAY2-SHA256-RSA2048 {签名信息} ``` 其中签名信息包含以下参数(按顺序拼接): ``` mchid="商户号",nonce_str="随机字符串",timestamp="时间戳",serial_no="商户证书序列号",signature="签名值" ``` --- #### 二、签名生成步骤 1. **构造签名串** 签名串由以下5部分通过换行符`\n`连接组成: ``` HTTP请求方法 请求绝对路径 请求时间戳(秒级) 请求随机字符串(如UUID) 请求报文主体(JSON字符串的SHA-256摘要) ``` - **示例**(POST请求转账): ``` POST /v3/transfer/batches 1622451234 5K8264ILTKCH16CQ2502SI8ZNMTM67VS kZO/cYvY8E9Fw3v7+tzY3uB1I4GB0O6RV00H9Jj12Bg= ``` 2. **生成签名值** - 使用**商户私钥**对签名串进行`RSA-SHA256`加密。 - 将加密结果通过`Base64`编码,得到`signature`字段。 3. **组装Authorization** 将签名信息按格式拼接: ``` WECHATPAY2-SHA256-RSA2048 mchid="190000XXXX",nonce_str="5K8264ILTKCH16CQ2502SI8ZNMTM67VS",timestamp="1622451234",serial_no="5157F0xxxxxxxxxx",signature="kZO/cYvY8E9Fw3v7+tzY3uB1I4GB0O6RV00H9Jj12Bg=" ``` --- #### 三、关键注意事项 1. **HTTP头部要求** - 必须包含`Wechatpay-Serial`字段,值为**微信支付平台证书序列号**(非商户证书)[^3]。 - 请求头示例: ```http Content-Type: application/json Accept: application/json Authorization: WECHATPAY2-SHA256-RSA2048 {签名信息} Wechatpay-Serial: 45D7F4xxxxxxxxxx ``` 2. **签名工具与调试** - 可通过微信官方提供的[签名验证工具](https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtml)检查签名。 - 时间戳有效期通常为5分钟,需注意本地时钟同步[^2]。 --- #### 四、代码示例(Python伪代码) ```python import hashlib import base64 import uuid import time from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import padding # 1. 构造签名串 method = "POST" url = "/v3/transfer/batches" timestamp = str(int(time.time())) nonce = str(uuid.uuid4()) body = '{"appid":"wx1234567890","out_batch_no":"R202308010001"}' body_digest = base64.b64encode(hashlib.sha256(body.encode()).digest()).decode() signature_str = f"{method}\n{url}\n{timestamp}\n{nonce}\n{body_digest}" # 2. 使用商户私钥签名 with open("merchant_private_key.pem", "rb") as key_file: private_key = serialization.load_pem_private_key(key_file.read(), password=None) signature = private_key.sign(signature_str.encode(), padding.PKCS1v15(), hashlib.sha256) signature_b64 = base64.b64encode(signature).decode() # 3. 组装Authorization authorization = f'WECHATPAY2-SHA256-RSA2048 mchid="190000XXXX",nonce_str="{nonce}",timestamp="{timestamp}",serial_no="5157F0xxxxxxxxxx",signature="{signature_b64}"' ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值