values['sign_type'] = $sign_type; return $sign_type; } /** * 设置签名,详见签名生成算法 * @param string $value **/ public function SetSign($config) { $sign = $this->MakeSign($config); $this->values['sign'] = $sign; return $sign; } /** * 获取签名,详见签名生成算法的值 * @return 值 **/ public function GetSign() { return $this->values['sign']; } /** * 判断签名,详见签名生成算法是否存在 * @return true 或 false **/ public function IsSignSet() { return array_key_exists('sign', $this->values); } /** * 输出xml字符 * @throws WxPayException **/ public function ToXml() { if(!is_array($this->values) || count($this->values) <= 0) { throw new WxPayException("数组数据异常!"); } $xml = ""; foreach ($this->values as $key=>$val) { if (is_numeric($val)){ $xml.="<".$key.">".$val.""; }else{ $xml.="<".$key.">"; } } $xml.=""; return $xml; } /** * 将xml转为array * @param string $xml * @throws WxPayException */ public function FromXml($xml) { if(!$xml){ throw new WxPayException("xml数据异常!"); } //将XML转为array //禁止引用外部xml实体 libxml_disable_entity_loader(true); $this->values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $this->values; } /** * 格式化参数格式化成url参数 */ public function ToUrlParams() { $buff = ""; foreach ($this->values as $k => $v) { if($k != "sign" && $v != "" && !is_array($v)){ $buff .= $k . "=" . $v . "&"; } } $buff = trim($buff, "&"); return $buff; } /** * 生成签名 * @param WxPayConfigInterface $config 配置对象 * @param bool $needSignType 是否需要补signtype * @return 签名,本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值 */ public function MakeSign($config, $needSignType = true) { if($needSignType) { $this->SetSignType($config->GetSignType()); } //签名步骤一:按字典序排序参数 ksort($this->values); $string = $this->ToUrlParams(); //签名步骤二:在string后加入KEY $string = $string . "&key=".$config->GetKey(); //签名步骤三:MD5加密或者HMAC-SHA256 if($config->GetSignType() == "MD5"){ $string = md5($string); } else if($config->GetSignType() == "HMAC-SHA256") { $string = hash_hmac("sha256",$string ,$config->GetKey()); } else { throw new WxPayException("签名类型不支持!"); } //签名步骤四:所有字符转为大写 $result = strtoupper($string); return $result; } /** * 获取设置的值 */ public function GetValues() { return $this->values; } }