RequestHandler.class.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?php
  2. /**
  3. * 请求类
  4. * ============================================================================
  5. * api说明:
  6. * init(),初始化函数,默认给一些参数赋值,如cmdno,date等。
  7. * getGateURL()/setGateURL(),获取/设置入口地址,不包含参数值
  8. * getKey()/setKey(),获取/设置密钥
  9. * getParameter()/setParameter(),获取/设置参数值
  10. * getAllParameters(),获取所有参数
  11. * getRequestURL(),获取带参数的请求URL
  12. * getDebugInfo(),获取debug信息
  13. *
  14. * ============================================================================
  15. *
  16. */
  17. class RequestHandler {
  18. /** 网关url地址 */
  19. var $gateUrl;
  20. /** 密钥 */
  21. var $key;
  22. /* RSA私钥*/
  23. var $private_rsa_key;
  24. var $signtype;
  25. /** 请求的参数 */
  26. var $parameters;
  27. /** debug信息 */
  28. var $debugInfo;
  29. function __construct() {
  30. $this->RequestHandler();
  31. }
  32. function RequestHandler() {
  33. $this->gateUrl = "https://pay.swiftpass.cn/pay/gateway";
  34. $this->key = "";
  35. $this->private_rsa_key = "";
  36. $this->signtype = "MD5";
  37. $this->parameters = array();
  38. $this->debugInfo = "";
  39. }
  40. /**
  41. *初始化函数。
  42. */
  43. function init() {
  44. //nothing to do
  45. }
  46. /**
  47. *获取入口地址,不包含参数值
  48. */
  49. function getGateURL() {
  50. return $this->gateUrl;
  51. }
  52. /**
  53. *设置入口地址,不包含参数值
  54. */
  55. function setGateURL($gateUrl) {
  56. $this->gateUrl = $gateUrl;
  57. }
  58. function setSignType($type) {
  59. $this->signtype = $type;
  60. }
  61. /**
  62. *获取MD5密钥
  63. */
  64. function getKey() {
  65. return $this->key;
  66. }
  67. /**
  68. *设置MD5密钥
  69. */
  70. function setKey($key) {
  71. $this->key = $key;
  72. }
  73. /*设置RSA私钥*/
  74. function setRSAKey($key) {
  75. $this->private_rsa_key = $key;
  76. }
  77. /**
  78. *获取参数值
  79. */
  80. function getParameter($parameter) {
  81. return isset($this->parameters[$parameter])?$this->parameters[$parameter]:'';
  82. }
  83. /**
  84. *设置参数值
  85. */
  86. function setParameter($parameter, $parameterValue) {
  87. $this->parameters[$parameter] = $parameterValue;
  88. }
  89. /**
  90. * 一次性设置参数
  91. */
  92. function setReqParams($post,$filterField=null){
  93. if($filterField !== null){
  94. foreach($filterField as $k=>$v){
  95. unset($post[$v]);
  96. }
  97. }
  98. //判断是否存在空值,空值不提交
  99. foreach($post as $k=>$v){
  100. if(empty($v)){
  101. unset($post[$k]);
  102. }
  103. }
  104. $this->parameters = $post;
  105. }
  106. /**
  107. *获取所有请求的参数
  108. *@return array
  109. */
  110. function getAllParameters() {
  111. return $this->parameters;
  112. }
  113. /**
  114. *获取带参数的请求URL
  115. */
  116. function getRequestURL() {
  117. $this->createSign();
  118. $reqPar = "";
  119. ksort($this->parameters);
  120. foreach($this->parameters as $k => $v) {
  121. $reqPar .= $k . "=" . urlencode($v) . "&";
  122. }
  123. //去掉最后一个&
  124. $reqPar = substr($reqPar, 0, strlen($reqPar)-1);
  125. $requestURL = $this->getGateURL() . "?" . $reqPar;
  126. return $requestURL;
  127. }
  128. /**
  129. *获取debug信息
  130. */
  131. function getDebugInfo() {
  132. return $this->debugInfo;
  133. }
  134. /**
  135. *创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
  136. */
  137. function createSign() {
  138. if($this->signtype == 'MD5') {
  139. $this->createMD5Sign();
  140. } else {
  141. $this->createRSASign();
  142. }
  143. }
  144. function createMD5Sign() {
  145. $signPars = "";
  146. ksort($this->parameters);
  147. foreach($this->parameters as $k => $v) {
  148. if("" != $v && "sign" != $k) {
  149. $signPars .= $k . "=" . $v . "&";
  150. }
  151. }
  152. $signPars .= "key=" . $this->getKey();
  153. $sign = strtoupper(md5($signPars));
  154. $this->setParameter("sign", $sign);
  155. //debug信息
  156. $this->_setDebugInfo($signPars . " => sign:" . $sign);
  157. }
  158. function createRSASign() {
  159. $signPars = "";
  160. ksort($this->parameters);
  161. foreach($this->parameters as $k => $v) {
  162. if("" != $v && "sign" != $k) {
  163. $signPars .= $k . "=" . $v . "&";
  164. }
  165. }
  166. $signPars = substr($signPars, 0, strlen($signPars) - 1);
  167. $res = openssl_get_privatekey($this->private_rsa_key);
  168. if ($this->signtype == 'RSA_1_1') {
  169. openssl_sign($signPars, $sign, $res);
  170. } else if ($this->signtype == 'RSA_1_256') {
  171. openssl_sign($signPars, $sign, $res, OPENSSL_ALGO_SHA256);
  172. }
  173. openssl_free_key($res);
  174. $sign = base64_encode($sign);
  175. $this->setParameter("sign", $sign);
  176. //debug信息
  177. $this->_setDebugInfo($signPars . " => sign:" . $sign);
  178. }
  179. /**
  180. *设置debug信息
  181. */
  182. function _setDebugInfo($debugInfo) {
  183. $this->debugInfo = $debugInfo;
  184. }
  185. }
  186. ?>