PHP实现微信v2签名过程

PHP实现微信v2签名过程

       继昨天发表了一篇PHP实现微信V3签名过程之后,今天又完成了另一个需求,就是实现V2签名,过程也是非常简单,在这里跟大家分享一下代码,代码也是很简洁,首先是公共文件,命名为wxComm.php,代码如下:

#微信基础信息
$wxMerchantId = "商户号";                   //商户号
$wxPrivateKey = "微信密钥";                 //微信密钥

/**
 * 微信 API V2 签名
 * @param $params
 * @param $privateKey
 * @param string $type sha256:HMAC-SHA256签名方式 me5:MD5签名方式
 * @return string
 */
function getSignV2($params, $privateKey, $type = "sha256")
{
    #参数名ASCII码从小到大排序(字典序)
    ksort($params);
    #初始化数据
    $stringToBeSigned = "";
    $i = 0;
    #循环拼接请求参数
    foreach ($params as $k => $v) {
        if (false === checkWxEmpty($v) && "@" != substr($v, 0, 1)) {
            // 转换成目标字符集
            $v = wxCharaCet($v, "UTF-8");
            if ($i == 0) {
                $stringToBeSigned .= "$k" . "=" . urlencode($v);
            } else {
                $stringToBeSigned .= "&" . "$k" . "=" . urlencode($v);
            }
            $i++;
        }
    }
    #清除缓存
    unset ($k, $v);
    #拼接密钥
    $stringSignTemp = $stringToBeSigned . "&key=" . $privateKey;
    #签名方式 sha256、md5
    if ($type == "sha256") {
        $sign = strtoupper(hash_hmac("sha256", $stringSignTemp, $privateKey));
    } else {
        $sign = strtoupper(md5($stringSignTemp));
    }
    #返回
    return $sign;
}

/**
 * 转换成目标字符集
 * @param $data
 * @param $targetCharset
 * @return string
 */
function wxCharaCet($data, $targetCharset)
{
    if (!empty($data)) {
        $fileType = "UTF-8";
        if (strcasecmp($fileType, $targetCharset) != 0) {
            $data = mb_convert_encoding($data, $targetCharset, $fileType);
        }
    }
    return $data;
}


/**
 * 判断参数值是否为空
 * @param $value
 * @return bool
 */
function checkWxEmpty($value)
{
    if (!isset($value))
        return true;
    if ($value === null)
        return true;
    if (trim($value) === "")
        return true;

    return false;
}

       下面是调用文件代码:

$params = array(
    'stock_id' => '2345',
    'out_request_no' => "435435",
    'send_coupon_merchant' => $wxMerchantId,
    'open_id' => '123',
);
$sign = getSignV2($params, $wxPrivateKey, "sha256");

       这样就可以成功生成签名了,支持两种签名方式分别是MD5签名方式跟HMAC-SHA256签名方式,可根据传值生成不同的签名。