Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

182 linhas
6.2 KiB

  1. <?php
  2. /**
  3. *
  4. * ============================================================================
  5. * * 版权所有 蜘蛛出行 * *
  6. * 网站地址: http://www.zhizhuchuxing.com
  7. * ----------------------------------------------------------------------------
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
  9. * 使用;不允许对程序代码以任何形式任何目的的再发布。
  10. * ============================================================================
  11. * Author By: 倪宗锋
  12. * PhpStorm WxPayService.php
  13. * Create By 2016/11/30 13:31 $
  14. */
  15. namespace Base\Tool;
  16. use Model\Model\OrderMain;
  17. use Util\Util\CurlInterface;
  18. use Util\Util\Util;
  19. /**
  20. * Class WxPayService
  21. * 微信交易接口调用核心类
  22. * @package Base\Tool
  23. */
  24. class WxPayService
  25. {
  26. private $unifiedOrderUrl = 'https://api.mch.weixin.qq.com/pay/unifiedorder';//统一下单API
  27. private $notify_url = '/wechat/WxPay/realpay/success_notify_wechat_shop.php';//回调地址
  28. /**
  29. * Function Description:去微信下单并获取返回值
  30. * Function Name: unifiedOrderByOrderId
  31. * @param $order_id
  32. *
  33. * @return array
  34. *
  35. * @author 倪宗锋
  36. */
  37. public function unifiedOrderByOrderId($order_id)
  38. {
  39. $orderMain = new OrderMain();
  40. $result = $orderMain->getUnifiedParamsByOrderId($order_id);//通过订单ID获取需要的微信支付参数
  41. if ($result['flag'] == false) {
  42. return $result;
  43. }
  44. $data = array(
  45. 'line_name' => $result['data']['line_name'],//线路名称
  46. 'order_id' => $order_id,//订单ID
  47. 'total_fee' => $result['data']['total_fee'],//总金额
  48. );
  49. $wxPayService = new WxPayService();
  50. $getPrepayId = $wxPayService->unifiedOrder($data);//统一下单API
  51. if ($getPrepayId['flag'] == false) {
  52. return $getPrepayId;
  53. }
  54. //设置成功返回的结果数据
  55. $wxPayConfig = Util::getWxPayConfig();
  56. $return = array(
  57. 'appid' => $wxPayConfig['appid'],//微信开放平台审核通过的应用APPID
  58. 'prepay_id' => $getPrepayId['prepay_id'],//微信返回的支付交易会话ID
  59. 'partnerid' => $wxPayConfig['mch_id'],//微信支付分配的商户号
  60. 'package ' => 'Sign=WXPay',//扩展字段 暂填写固定值Sign=WXPay
  61. 'noncestr' => WxPayService::getNonceStr(),//随机字符串
  62. 'timestamp' => time(),//当前时间戳
  63. );
  64. $return['sign'] = WxPayService::getSign($return);
  65. return Util::returnArrSu('', $return);
  66. }
  67. /**
  68. * Function Description:统一下单API
  69. * Function Name: unifiedOrder
  70. * @param $params array
  71. * attach 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
  72. * line_name 线路名称
  73. * order_id 订单ID
  74. * total_fee 总金额
  75. * notify_url 回调地址
  76. *
  77. * @return array
  78. *
  79. * @author 倪宗锋
  80. */
  81. public function unifiedOrder($params)
  82. {
  83. $siteConfig = Util::getSiteConfig();
  84. $wxPayConfig = Util::getWxPayConfig();
  85. $data = array(
  86. 'appid' => $wxPayConfig['appid'],//微信开放平台审核通过的应用APPID
  87. 'attach' => empty($params['attach']) ? '' : $params['attach'],
  88. 'body' => $params['line_name'] . ": " . $params['order_id'],//线路名称 加 上订单ID
  89. 'mch_id' => $wxPayConfig['mch_id'],//商户号 微信支付分配的商户号
  90. 'nonce_str' => $this->getNonceStr(),//随机字符串
  91. 'notify_url' => empty($params['notify_url']) ? $siteConfig['host_name'] . $this->notify_url : $params['notify_url'],//通知地址
  92. 'out_trade_no' => $params['order_id'] . "-" . date("ymdHis"),//商户订单ID加上当前时间
  93. 'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],//用户端实际ip
  94. 'total_fee' => $params['total_fee'],//订单总金额,单位为分
  95. 'trade_type' => 'APP',//交易类型
  96. );
  97. $data['sign'] = $this->getSign($data);//交易签名
  98. $curl = new CurlInterface($data, 2);//函数类
  99. $curl->setBaseUrl($this->unifiedOrderUrl);
  100. $result = $curl->execute('', 'POST');
  101. if (empty($result['prepay_id'])) {
  102. return Util::returnArrEr('预支付交易会话异常!');
  103. }
  104. return Util::returnArrSu('', array('prepay_id' => $result['prepay_id']));
  105. }
  106. /**
  107. * Function Description:获取签名
  108. * Function Name: getSign
  109. * @param $params
  110. * @param $type int 配置类型
  111. *
  112. * @return string
  113. *
  114. * @author 倪宗锋
  115. */
  116. public static function getSign($params)
  117. {
  118. if (isset($params['sign'])) {
  119. unset($params['sign']);
  120. }
  121. $config = Util::getWxPayConfig();
  122. //签名步骤一:按字典序排序参数
  123. ksort($params);
  124. $string = self::ToUrlParams($params);
  125. //签名步骤二:在string后加入KEY
  126. $string = $string . "&key=" . $config['key'];
  127. //签名步骤三:MD5加密
  128. $string = md5($string);
  129. //签名步骤四:所有字符转为大写
  130. $result = strtoupper($string);
  131. return $result;
  132. }
  133. /**
  134. * Function Description:格式化参数 格式化成url参数
  135. * Function Name: ToUrlParams
  136. * @param $params
  137. *
  138. * @return string
  139. *
  140. * @author 倪宗锋
  141. */
  142. public static function ToUrlParams($params)
  143. {
  144. $buff = "";
  145. foreach ($params as $k => $v) {
  146. if ($k != "sign" && $v != "" && !is_array($v)) {
  147. $buff .= $k . "=" . $v . "&";
  148. }
  149. }
  150. $buff = trim($buff, "&");
  151. return $buff;
  152. }
  153. /**
  154. * Function Description:产生的随机字符串 不长于32位
  155. * Function Name: getNonceStr
  156. * @param int $length
  157. *
  158. * @return string
  159. *
  160. * @author 倪宗锋
  161. */
  162. public static function getNonceStr($length = 32)
  163. {
  164. $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
  165. $str = "";
  166. for ($i = 0; $i < $length; $i++) {
  167. $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
  168. }
  169. return $str;
  170. }
  171. }