Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 

318 rader
10 KiB

  1. <?php
  2. /**
  3. *
  4. * ============================================================================
  5. * * 版权�?�? 运游�? * *
  6. * 网站地址: http://www.zhizhuchuxing.com
  7. * ----------------------------------------------------------------------------
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改�?
  9. * 使用;不允许对程序代码以任何形式任何目的的再发布�?
  10. * ============================================================================
  11. * Author By: 倪宗�?
  12. * PhpStorm AliPayService.php
  13. * Create By 2016/12/12 14:32 $
  14. */
  15. namespace common\util;
  16. class AliPay
  17. {
  18. private static $aliPayConfig = null;
  19. /**
  20. * Des:扫描支付
  21. * Name: unifiedOrderByOrderIdForSao
  22. * @param $par
  23. * @return array
  24. * @author 倪宗锋
  25. */
  26. public function unifiedOrderByOrderIdForSao($par)
  27. {
  28. $siteConfig = Util::getSiteConfig();
  29. $aliPay = new AliPay();
  30. //交易参数
  31. $params['body'] = $par['name'];
  32. $params['subject'] = $par['name'];
  33. $params['order_id'] = $par['order_id'] . '_' . rand(100, 999);
  34. $params['price'] = $par['total_fee'];
  35. $params['timeout_express'] = '1m';
  36. $params['goType'] = 3;
  37. $params['method'] = 'alipay.trade.precreate';
  38. $getUrl = $aliPay->getAliPayUrl($params);
  39. $url = $siteConfig['host_name'] . '/fx/?r=weChat/we-chat/q-code&qCode=' . urlencode($getUrl['data']['codUrl']) . '&_math=' . rand(100, 999);
  40. return Util::returnArrSu('', array('codUrl' => $url, 'price' => $par['total_fee']));
  41. }
  42. /**
  43. * Function Description:支付宝web支付
  44. * Function Name: webPay
  45. * @param $param array
  46. * @return array
  47. *
  48. * @author nzf
  49. */
  50. public function webPay($param)
  51. {
  52. //交易参数
  53. $params['body'] = $param['name'];
  54. $params['subject'] = $param['name'];
  55. $params['order_id'] = $param['order_id'];
  56. $params['price'] = $param['total_fee'];
  57. $params['timeout_express'] = '1m';
  58. $params['goType'] = 2;
  59. $params['method'] = 'alipay.trade.wap.pay';
  60. $return = static::getAliPayUrl($params);
  61. return $return;
  62. }
  63. /********************通用方法**************************/
  64. /**
  65. * Function Description:获取阿里支付pay
  66. * Function Name: getAliPayUrl
  67. * @param $params array
  68. *
  69. * @return array
  70. *
  71. * @author 倪宗�?
  72. */
  73. private static function getAliPayUrl($params)
  74. {
  75. $config = self::getAliPayConfig();
  76. $sysParams = self::getSysParams();
  77. $sysParams["method"] = $params['method'];
  78. //交易参数
  79. $body['productCode'] = 'QUICK_WAP_PAY';
  80. $body['body'] = $params['body'];
  81. $body['subject'] = $params['subject'];
  82. $body['out_trade_no'] = $params['order_id'];
  83. $body['total_amount'] = $params['price'];
  84. $body['timeout_express'] = $config['timeout'];
  85. $sysParams['biz_content'] = json_encode($body);
  86. if ($params['goType'] == 1) {//如果是页面跳�?
  87. $sysParams['sign'] = urlencode(static::getSign($sysParams));
  88. $paramString = static::getSignContent($sysParams);
  89. $requestUrl = $config['gatewayUrl'] . "?" . $paramString;
  90. return Util::returnArrSu('', ['payData' => $requestUrl]);
  91. } elseif ($params['goType'] == 2) {//如果是参数返�?
  92. $sysParams['sign'] = static::getSign($sysParams);
  93. $result = self::buildRequestForm($sysParams);
  94. return Util::returnArrSu('', ['payData' => $result]);
  95. } else {
  96. $sysParams['sign'] = urlencode(static::getSign($sysParams));
  97. $paramString = static::getSignContent($sysParams);
  98. $requestUrl = $config['gatewayUrl'] . "?" . $paramString;
  99. $curl = new CurlInterface('', 5);
  100. $result = $curl->execute($requestUrl, 'GET');
  101. $result = json_decode($result, true);
  102. $return['codUrl'] = '';
  103. if ($result['alipay_trade_precreate_response']['code'] == '10000') {
  104. $return['codUrl'] = $result['alipay_trade_precreate_response']['qr_code'];
  105. }
  106. return Util::returnArrSu('', $return);
  107. }
  108. }
  109. /**
  110. * Function Description:取消订单
  111. * Function Name: cancelOrder
  112. * @param $params
  113. *
  114. * @return array
  115. *
  116. * @author 倪宗�?
  117. */
  118. public static function cancelOrder($params)
  119. {
  120. $config = self::getAliPayConfig();
  121. $sysParams = self::getSysParams();
  122. $sysParams["method"] = 'alipay.trade.refund';
  123. $body = array(
  124. 'out_trade_no' => $params['order_id'],//订单�?
  125. 'refund_amount' => $params['refund_fee'],//退款金额
  126. 'refund_reason' => $params['memo'],
  127. 'out_request_no' => $params['order_id'] . '-' . date('YmdHis') . rand(100, 999)//�?款原�?
  128. );
  129. $sysParams['biz_content'] = json_encode($body);
  130. $sysParams['sign'] = static::getSign($sysParams);
  131. $sysParams['sign'] = urlencode(static::getSign($sysParams));
  132. $paramString = static::getSignContent($sysParams);
  133. $requestUrl = $config['gatewayUrl'] . "?" . $paramString;
  134. //调用�?款接�?
  135. $curlInterface = new CurlInterface($sysParams, 5);
  136. $result = $curlInterface->execute($requestUrl, 'GET');
  137. $result = json_decode(mb_convert_encoding($result, 'utf-8'), true);
  138. if (isset($result['alipay_trade_refund_response']) && $result['alipay_trade_refund_response']['code'] == '10000') {
  139. return Util::returnArrSu();
  140. }
  141. return Util::returnArrEr('退款失败!');
  142. }
  143. /**
  144. * Function Description:获取系统通用参数
  145. * Function Name: getSysParams
  146. *
  147. * @return mixed
  148. *
  149. * @author 倪宗�?
  150. */
  151. private static function getSysParams()
  152. {
  153. $config = self::getAliPayConfig();
  154. $siteConfig = Util::getSiteConfig();
  155. //组装系统参数
  156. $sysParams["app_id"] = $config['app_id'];
  157. $sysParams["version"] = '1.0';
  158. $sysParams["format"] = 'json';
  159. $sysParams["sign_type"] = 'RSA';
  160. $sysParams["timestamp"] = date("Y-m-d H:i:s");
  161. $sysParams["alipay_sdk"] = 'alipay-sdk-php-20160411';
  162. $sysParams["prod_code"] = '';
  163. $sysParams["notify_url"] = $siteConfig['host_name'] . $siteConfig['notify_url'];
  164. // $sysParams["return_url"] = $config['return_url'];
  165. $sysParams["charset"] = $config['charset'];
  166. return $sysParams;
  167. }
  168. /**
  169. * Function Description:建立请求,以表单HTML形式构�?�(默认�?
  170. * Function Name: buildRequestForm
  171. * @param $para_temp
  172. *
  173. * @return string 提交表单HTML文本
  174. *
  175. * @author 倪宗�?
  176. */
  177. protected static function buildRequestForm($para_temp)
  178. {
  179. $config = self::getAliPayConfig();
  180. $sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='" . $config['gatewayUrl'] . "?charset=" . trim($config['charset']) . "' method='get'>";
  181. while (list ($key, $val) = each($para_temp)) {
  182. if (false === static::checkEmpty($val)) {
  183. $val = str_replace("'", "&apos;", $val);
  184. $sHtml .= "<input type='hidden' name='" . $key . "' value='" . $val . "'/>";
  185. }
  186. }
  187. return $sHtml;
  188. }
  189. /**
  190. * Function Description:获取签名
  191. * Function Name: getSign
  192. * @param $params
  193. *
  194. * @return string
  195. *
  196. * @author 倪宗�?
  197. */
  198. public static function getSign($params)
  199. {
  200. if (isset($params['sign'])) {
  201. unset($params['sign']);
  202. }
  203. $content = self::getSignContent($params);
  204. $config = self::getAliPayConfig();
  205. $priKey = $config['merchant_private_key'];
  206. $res = "-----BEGIN RSA PRIVATE KEY-----\n" .
  207. wordwrap($priKey, 64, "\n", true) .
  208. "\n-----END RSA PRIVATE KEY-----";
  209. openssl_sign($content, $sign, $res);
  210. $sign = base64_encode($sign);
  211. return $sign;
  212. }
  213. /**
  214. * Function Description:获取参数配置
  215. * Function Name: getAliPayConfig
  216. *
  217. * @return array
  218. *
  219. * @author 倪宗�?
  220. */
  221. public static function getAliPayConfig()
  222. {
  223. if (self::$aliPayConfig == null) {
  224. $payConfig = require ROOT_PATH . '/common/config/aliConfig/payConfig.php';
  225. $siteConfig = Util::getSiteConfig();
  226. self::$aliPayConfig = $payConfig[$siteConfig['aliPay']];
  227. }
  228. return self::$aliPayConfig;
  229. }
  230. /**
  231. * Function Description:将数组转换为符合阿里支付的路由参�?
  232. * Function Name: getSignContent
  233. * @param $params
  234. *
  235. * @return string
  236. *
  237. * @author 倪宗�?
  238. */
  239. public static function getSignContent($params)
  240. {
  241. ksort($params);
  242. $stringToBeSigned = "";
  243. $i = 0;
  244. foreach ($params as $k => $v) {
  245. if (false === self::checkEmpty($v) && "@" != substr($v, 0, 1)) {
  246. // 转换成目标字符集
  247. $v = self::characet($v, 'utf-8');
  248. if ($i == 0) {
  249. $stringToBeSigned .= "$k" . "=" . "$v";
  250. } else {
  251. $stringToBeSigned .= "&" . "$k" . "=" . "$v";
  252. }
  253. $i++;
  254. }
  255. }
  256. unset ($k, $v);
  257. return $stringToBeSigned;
  258. }
  259. /**
  260. * Function Description:校验$value是否非空
  261. * Function Name: checkEmpty
  262. * @param $value
  263. *
  264. * @return bool
  265. *
  266. * @author 倪宗�?
  267. */
  268. private static function checkEmpty($value)
  269. {
  270. if (!isset($value)) {
  271. return true;
  272. }
  273. if ($value === null) {
  274. return true;
  275. }
  276. if (trim($value) === "") {
  277. return true;
  278. }
  279. return false;
  280. }
  281. /**
  282. * Function Description:转换字符集编�?
  283. * Function Name: characet
  284. * @param $data
  285. * @param $targetCharset
  286. *
  287. * @return string
  288. *
  289. * @author 倪宗�?
  290. */
  291. private static function characet($data, $targetCharset)
  292. {
  293. if (!empty($data)) {
  294. $fileType = 'utf-8';
  295. if (strcasecmp($fileType, $targetCharset) != 0) {
  296. $data = mb_convert_encoding($data, $targetCharset);
  297. }
  298. }
  299. return $data;
  300. }
  301. }