ClientResponseHandler.class.php 3.8 KB

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