Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

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