在调用微信接口的时候无论是支付还是现金红包等等接口都会用到接口的加密和校验,微信的很多数据签名和调用规则其实都是一样的,首先构建原始数据,然后根据规则去除空值和签名方式(如果与的话),接下来案子点排序后转换为URL格式的字符串,拼接上加密的key,然后生成签名。接下来就是按照规则调用接口了,这里先说一下加密调用的流程,还是看流程图更直观一点。
**微信接口加密签名方式及接口调用流程图** ![微信数据签名流程](http://wx1.sinaimg.cn/large/62610579ly1fnpds6vhzoj20e406zjso.jpg "微信数据签名流程")
下面给出微信签名算法的PHP代码:
~~~php
class Sign
{
const KEY = '微信支付后台获取';
/**
* 获取签名
* @param array $arr
* @return string
*/
public function getSign($arr){
//去除空值
$arr = array_filter($arr);
if(isset($arr['sign'])){
unset($arr['sign']);
}
//按照键名字典排序
ksort($arr);
//生成url格式的字符串
$str = $this->arrToUrl($arr) . '&key=' . self::KEY;
return strtoupper(md5($str));
}
/**
* 获取带签名的数组
* @param array $arr
* @return array
*/
public function setSign($arr){
$arr['sign'] = $this->getSign($arr);;
return $arr;
}
/**
* 数组转URL格式的字符串
* @param array $arr
* @return string
*/
public function arrToUrl($arr){
return urldecode(http_build_query($arr));
}
}
~~~
以上PHP代码完成了整个签名过程,对于将数据转换为XML并发送到微信接口的代码可以参照[《PHP数组和XML相互转换的函数》](https://www.liminghulian.com/article/32)和[《使用PHP基于RESTful风格上传文件或POST字符串》](https://www.liminghulian.com/article/30)两篇文章。