PHP
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签名方式,可根据传值生成不同的签名。
0条评论