ClientResponseHandler.class.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <?php
  2. /**
  3. * 后台应答类
  4. * ============================================================================
  5. * api说明:
  6. * getKey()/setKey(),获取/设置密钥
  7. * getContent() / setContent(), 获取/设置原始内容
  8. * getParameter()/setParameter(),获取/设置参数值
  9. * getAllParameters(),获取所有参数
  10. * isTenpaySign(),是否威富通签名,true:是 false:否
  11. * getDebugInfo(),获取debug信息
  12. * ============================================================================
  13. */
  14. class ClientResponseHandler {
  15. /**
  16. * 密钥
  17. */
  18. var $key;
  19. /**
  20. * 应答的参数
  21. */
  22. var $parameters;
  23. /**
  24. * debug信息
  25. */
  26. var $debugInfo;
  27. // 原始内容
  28. var $content;
  29. function __construct() {
  30. $this->ClientResponseHandler();
  31. }
  32. function ClientResponseHandler() {
  33. $this->key = "";
  34. $this->parameters = array();
  35. $this->debugInfo = "";
  36. $this->content = "";
  37. }
  38. /**
  39. * 获取密钥
  40. */
  41. function getKey() {
  42. return $this->key;
  43. }
  44. /**
  45. * 设置密钥
  46. */
  47. function setKey($key) {
  48. $this->key = $key;
  49. }
  50. // 设置原始内容
  51. function setContent($content) {
  52. $this->content = $content;
  53. $xml = simplexml_load_string($this->content);
  54. $encode = $this->getXmlEncode($this->content);
  55. if ($xml && $xml->children()) {
  56. foreach ($xml->children() as $node) {
  57. // 有子节点
  58. if ($node->children()) {
  59. $k = $node->getName();
  60. $nodeXml = $node->asXML();
  61. $v = substr($nodeXml, strlen($k) + 2, strlen($nodeXml) - 2 * strlen($k) - 5);
  62. } else {
  63. $k = $node->getName();
  64. $v = (string)$node;
  65. }
  66. if ($encode != "" && $encode != "UTF-8") {
  67. $k = iconv("UTF-8", $encode, $k);
  68. $v = iconv("UTF-8", $encode, $v);
  69. }
  70. $this->setParameter($k, $v);
  71. }
  72. }
  73. }
  74. // 获取原始内容
  75. function getContent() {
  76. return $this->content;
  77. }
  78. /**
  79. * 获取参数值
  80. */
  81. function getParameter($parameter) {
  82. return isset($this->parameters[$parameter]) ? $this->parameters[$parameter] : '';
  83. }
  84. /**
  85. * 设置参数值
  86. */
  87. function setParameter($parameter, $parameterValue) {
  88. $this->parameters[$parameter] = $parameterValue;
  89. }
  90. /**
  91. * 获取所有请求的参数
  92. *
  93. * @return array
  94. */
  95. function getAllParameters() {
  96. return $this->parameters;
  97. }
  98. /**
  99. * 是否威富通签名,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
  100. * true:是
  101. * false:否
  102. */
  103. function isTenpaySign() {
  104. $signPars = "";
  105. ksort($this->parameters);
  106. foreach ($this->parameters as $k => $v) {
  107. if ("sign" != $k && "" != $v) {
  108. $signPars .= $k."=".$v."&";
  109. }
  110. }
  111. $signPars .= "key=".$this->getKey();
  112. $sign = strtolower(md5($signPars));
  113. $tenpaySign = strtolower($this->getParameter("sign"));
  114. // debug信息
  115. $this->_setDebugInfo($signPars." => sign:".$sign." tenpaySign:".$this->getParameter("sign"));
  116. return $sign == $tenpaySign;
  117. }
  118. /**
  119. * 获取debug信息
  120. */
  121. function getDebugInfo() {
  122. return $this->debugInfo;
  123. }
  124. // 获取xml编码
  125. function getXmlEncode($xml) {
  126. $ret = preg_match("/<?xml[^>]* encoding=\"(.*)\"[^>]* ?>/i", $xml, $arr);
  127. if ($ret) {
  128. return strtoupper($arr[1]);
  129. } else {
  130. return "";
  131. }
  132. }
  133. /**
  134. * 设置debug信息
  135. */
  136. function _setDebugInfo($debugInfo) {
  137. $this->debugInfo = $debugInfo;
  138. }
  139. /**
  140. * 是否财付通签名
  141. *
  142. * @param signParameterArray 签名的参数数组
  143. *
  144. * @return boolean
  145. */
  146. function _isTenpaySign($signParameterArray) {
  147. $signPars = "";
  148. foreach ($signParameterArray as $k) {
  149. $v = $this->getParameter($k);
  150. if ("sign" != $k && "" != $v) {
  151. $signPars .= $k."=".$v."&";
  152. }
  153. }
  154. $signPars .= "key=".$this->getKey();
  155. $sign = strtolower(md5($signPars));
  156. $tenpaySign = strtolower($this->getParameter("sign"));
  157. // debug信息
  158. $this->_setDebugInfo($signPars." => sign:".$sign." tenpaySign:".$this->getParameter("sign"));
  159. return $sign == $tenpaySign;
  160. }
  161. }
  162. ?>