YopClient.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: wilson
  5. * Date: 16/7/13
  6. * Time: 16:29
  7. */
  8. namespace app\common\modules\yop\sdk;
  9. use app\common\modules\yop\sdk\YopRequest;
  10. use app\common\modules\yop\sdk\YopResponse;
  11. use app\common\modules\yop\sdk\Util\YopSignUtils;
  12. use app\common\modules\yop\sdk\Util\HttpRequest;
  13. use app\common\modules\yop\sdk\Util\BlowfishEncrypter;
  14. use app\common\modules\yop\sdk\Util\AESEncrypter;
  15. class YopClient{
  16. public function __construct(){
  17. }
  18. public function __set($name, $value){
  19. // TODO: Implement __set() method.
  20. $this->$name = $value;
  21. }
  22. public function __get($name){
  23. // TODO: Implement __get() method.
  24. return $this->$name;
  25. }
  26. static public function get($methodOrUri, $YopRequest){
  27. $content = YopClient::getForString($methodOrUri, $YopRequest);
  28. $response = YopClient::unmarshal($content);
  29. YopClient::handleResult($YopRequest , $response, $content);
  30. return $response;
  31. }
  32. static public function getForString($methodOrUri, $YopRequest){
  33. $serverUrl = YopClient::richRequest($methodOrUri, $YopRequest);
  34. YopClient::signAndEncrypt($YopRequest);
  35. $YopRequest->absoluteURL = $serverUrl;
  36. $YopRequest->encoding();
  37. $serverUrl .= (strpos($serverUrl,'?') === false ?'?':'&') . $YopRequest->toQueryString();
  38. $response = YopClient::getRestTemplate($serverUrl,$YopRequest,"GET");
  39. return $response;
  40. }
  41. static public function post($methodOrUri, $YopRequest){
  42. $content = YopClient::postForString($methodOrUri, $YopRequest);
  43. $response = YopClient::unmarshal($content);
  44. YopClient::handleResult($YopRequest , $response, $content);
  45. return $response;
  46. }
  47. static public function postForString($methodOrUri, $YopRequest){
  48. $serverUrl = YopClient::richRequest($methodOrUri, $YopRequest);
  49. YopClient::signAndEncrypt($YopRequest);
  50. $YopRequest->absoluteURL = $serverUrl;
  51. $response = YopClient::getRestTemplate($serverUrl,$YopRequest,"POST");
  52. return $response;
  53. }
  54. static public function upload($methodOrUri, $YopRequest){
  55. $content = YopClient::uploadForString($methodOrUri, $YopRequest);
  56. $response = YopClient::unmarshal($content);
  57. YopClient::handleResult($YopRequest , $response, $content);
  58. return $response;
  59. }
  60. static public function uploadForString($methodOrUri, $YopRequest){
  61. $serverUrl = YopClient::richRequest($methodOrUri, $YopRequest);
  62. //$alternate = file_get_contents($YopRequest->getParam("_file"));
  63. YopClient::signAndEncrypt($YopRequest);
  64. //$YopRequest->addParam("_file",str_replace('file:','@',$strTemp));PUT
  65. // Create a CURLFile object
  66. //$cfile = curl_file_create($file);
  67. //echo $YopRequest->getParam("_file");
  68. $YopRequest->absoluteURL = $serverUrl;
  69. $response = YopClient::getRestTemplate($serverUrl,$YopRequest,"PUT");
  70. return $response;
  71. }
  72. static public function unmarshal($jsoncontent){
  73. /*
  74. *
  75. {
  76. "state" : "FAILURE",
  77. "ts" : 1469523373843,
  78. "error" : {
  79. "code" : "U000001",
  80. "message" : "会员不存在"
  81. }
  82. * */
  83. $YopResponse =new YopResponse();
  84. if(!empty($jsoncontent['state'])){
  85. $YopResponse->state = $jsoncontent['state'];
  86. }
  87. if(!empty($jsoncontent['error'])){
  88. if(is_array($jsoncontent['error'])){
  89. foreach ($jsoncontent['error'] as $k => $v) {
  90. if(!is_array($v)){
  91. $YopResponse->error .= (empty($YopResponse->error)?'':',') . '"'. $k .'" : "'.$v.'"';
  92. }else{
  93. $YopResponse->error .= (empty($YopResponse->error)?'':',') . '"'. $k .'" : "'.json_encode($v,JSON_UNESCAPED_UNICODE).'"';
  94. foreach ($v as $vk=>$vv){
  95. }
  96. }
  97. }
  98. }else{
  99. $YopResponse->error = $jsoncontent['error'];
  100. }
  101. }
  102. if(!empty($jsoncontent['result'])){
  103. $YopResponse->result = $jsoncontent['result'];
  104. }
  105. if(!empty($jsoncontent['ts'])){
  106. $YopResponse->ts = $jsoncontent['ts'];
  107. }
  108. if(!empty($jsoncontent['sign'])){
  109. $YopResponse->sign = $jsoncontent['sign'];
  110. }
  111. if(!empty($jsoncontent['stringResult'])){
  112. $YopResponse->stringResult = $jsoncontent['stringResult'];
  113. }
  114. if(!empty($jsoncontent['format'])){
  115. $YopResponse->format = $jsoncontent['format'];
  116. }
  117. if(!empty($jsoncontent['validSign'])){
  118. $YopResponse->validSign = $jsoncontent['validSign'];
  119. }
  120. return $YopResponse;
  121. }
  122. static public function getRestTemplate($serverUrl, $YopRequest,$method){
  123. $YopRequest->encoding();
  124. if($method == "GET"){
  125. return HTTPRequest::curl_request($serverUrl, '', $YopRequest->Config->connectTimeout,true);
  126. }elseif ($method == "PUT"){
  127. //$YopRequest->addParam("_file",$YopRequest->ImagePath,true );
  128. return HTTPRequest::curl_request($serverUrl, $YopRequest->paramMap, $YopRequest->Config->connectTimeout,true,true);
  129. }
  130. return HTTPRequest::curl_request($serverUrl, $YopRequest->paramMap, $YopRequest->Config->connectTimeout,true);
  131. }
  132. static public function signAndEncrypt($YopRequest){
  133. if(empty($YopRequest->method)){
  134. error_log("method must be specified");
  135. }
  136. if(empty($YopRequest->secretKey)){
  137. error_log("secretKey must be specified");
  138. }
  139. $appKey =$YopRequest->{$YopRequest->Config->APP_KEY};
  140. if(empty($appKey)){
  141. $appKey = $YopRequest->Config->CUSTOMER_NO;
  142. $YopRequest->removeParam($YopRequest->Config->APP_KEY);
  143. }
  144. if(empty($appKey)){
  145. error_log("appKey 与 customerNo 不能同时为空");
  146. }
  147. $signValue="";
  148. $signValue=YopSignUtils::sign($YopRequest->paramMap,$YopRequest->ignoreSignParams,$YopRequest->secretKey,$YopRequest->signAlg);
  149. $YopRequest->addParam($YopRequest->Config->SIGN,$signValue);
  150. if($YopRequest->isRest){
  151. $YopRequest->removeParam($YopRequest->Config->METHOD);
  152. $YopRequest->removeParam($YopRequest->Config->VERSION);
  153. }
  154. if($YopRequest->encrypt){
  155. YopClient::encrypt($YopRequest);
  156. }
  157. }
  158. static public function encrypt($YopRequest){
  159. $builder = $YopRequest->paramMap;
  160. foreach ($builder as $k => $v){
  161. if($YopRequest->Config->ispublicedKey($k)){
  162. unset($builder[$k]);
  163. }else{
  164. //$YopRequest->removeParam($k);
  165. }
  166. }
  167. if(!empty($builder)){
  168. $encryptBody="";
  169. foreach ($builder as $k=>$v){
  170. $encryptBody .= strlen($encryptBody) == 0 ? "" : "&";
  171. $encryptBody .= $k."=".urlencode($v);
  172. }
  173. }
  174. if(empty($encryptBody)){
  175. $YopRequest->addParam($YopRequest->Config->ENCRYPT,true);
  176. }else{
  177. if(!empty($YopRequest->{$YopRequest->Config->APP_KEY})){
  178. $encrypt = AESEncrypter::encode($encryptBody,$YopRequest->secretKey);
  179. $YopRequest->addParam($YopRequest->Config->ENCRYPT,$encrypt);
  180. }else{
  181. $encrypt = BlowfishEncrypter::encode($encryptBody,$YopRequest->secretKey);
  182. $YopRequest->addParam($YopRequest->Config->ENCRYPT,$encrypt);
  183. }
  184. }
  185. }
  186. static public function decrypt($YopRequest, $strResult){
  187. if(!empty($strResult) && $YopRequest->{$YopRequest->Config->ENCRYPT}){
  188. if(!empty($YopRequest->{$YopRequest->Config->APP_KEY})){
  189. $strResult = AESEncrypter::decode($strResult, $YopRequest->secretKey);
  190. }else{
  191. $strResult = BlowfishEncrypter::decode($strResult, $YopRequest->secretKey);
  192. }
  193. }
  194. return $strResult;
  195. }
  196. static public function richRequest( $methodOrUri, $YopRequest){
  197. if(strpos($methodOrUri, $YopRequest->Config->serverRoot)){
  198. $methodOrUri = substr($methodOrUri,strlen($YopRequest->Config->serverRoot)+1);
  199. }
  200. $isRest = (strpos($methodOrUri,"/rest/") == 0)?true:false;
  201. $YopRequest->isRest = $isRest;
  202. $serverUrl = $YopRequest->serverRoot;
  203. if($isRest){
  204. $serverUrl .= $methodOrUri;
  205. preg_match('@/rest/v([^/]+)/@i', $methodOrUri, $version);
  206. if(!empty($version)){
  207. $version = $version[1];
  208. if(!empty($version)){
  209. $YopRequest->setVersion($version);
  210. }
  211. }
  212. }else{
  213. $serverUrl .= "/command?" . $YopRequest->Config->METHOD . "=" . $methodOrUri;
  214. }
  215. $YopRequest->setMethod($methodOrUri);
  216. return $serverUrl;
  217. }
  218. public static function handleResult($YopRequest, $YopResponse, $content){
  219. $YopResponse->format = $YopRequest->format;
  220. $ziped='';
  221. if(strtoupper($YopResponse->state) == 'SUCCESS'){
  222. $strResult = self::getBizResult($content,$YopRequest->format);
  223. $ziped = str_replace(PHP_EOL, '', $strResult);
  224. if(!empty($ziped) && $YopResponse->error == ''){
  225. if($YopRequest->encrypt){
  226. $decryptResult = self::decrypt($YopRequest,trim($ziped));
  227. $YopResponse->stringResult = $decryptResult;
  228. $YopResponse->result = $decryptResult;
  229. $ziped =str_replace(PHP_EOL, '', $decryptResult);
  230. }else{
  231. $YopResponse->stringResult = $strResult;
  232. }
  233. }
  234. }
  235. if($YopRequest->signRet && !empty($YopResponse->sign)){
  236. $signStr = $YopResponse->state . $ziped . $YopResponse->ts;
  237. $signStr= preg_replace("/[\s]{2,}/","",$signStr);
  238. $signStr= str_replace(PHP_EOL,"",$signStr);
  239. $signStr= str_replace(" ","",$signStr);
  240. $YopResponse->validSign = YopSignUtils::isValidResult($signStr, $YopRequest->secretKey, $YopRequest->signAlg,$YopResponse->sign);
  241. }else{
  242. $YopResponse->validSign = true;
  243. }
  244. }
  245. private static function getBizResult($content, $format){
  246. if(empty($format)){
  247. return $content;
  248. }
  249. switch ($format){
  250. case 'json':
  251. //preg_match('@"result" :(.+),"ts"@i', $content, $jsonStr);
  252. return $content['result'];
  253. default:
  254. //preg_match('@</state>(.+)<ts>@i', $content, $xmlStr);
  255. return $content['result'];
  256. }
  257. }
  258. }